Logo Spiria

Processwire. Léger, puissant, élégant

29 juin 2015.

Quand on pense CMS (Content Management System), on se tourne presque invariablement vers Wordpress, Drupal ou Joomla. Dans le créneau PHP, le choix ne s’arrête pourtant pas là ! La domination des grands joueurs n’a pas freiné la naissance d’une kyrielle de CMS. Il suffit de lire CMS Critic pour se rendre à l’évidence. Ce n’est pas le choix qui manque ! Depuis quelques années, certains de ces CMS se sont fait une petit place au soleil et peuvent maintenant être considérés des alternatives valables. Dans cet article, je m’attarderai à Processwire, deux fois gagnant d’un Critics Choice Award (2012 et 2014). Je parlerai, dans un autre billet, d’un autre CMS populaire, Concrete 5.

Au moment d’écrire ces lignes, Processwire en est à la version 2.6. Son développement est rapide, sa communauté croissante. Il fait dorénavant partie des choix offerts par Softaculous. Dans une note plus personnelle, mon site personnel carbure sous Processwire, comme celui que j’ai conçu pour ma mère qui, à 76 ans, sait très bien s’en servir. Il est aussi le choix, depuis 2012, de CMS Critic (autrefois sous Wordpress).

Le but de cet article ne se veut qu’une démonstration. Je ne prétends pas tout connaître des CMS ni ne voudrais laisser croire que Processwire est le meilleur d’entre tous. Il mérite, selon moi, qu’on s’y attarde. Bien que la plupart des concepteurs de CMS se vanteront de la même chose, je peux dire que le slogan de Processwire, Build Bigger, Faster, Stronger, Easier est juste. J’ajouterai ceci : il est élégant.

Simplicité d’utilisation

La première chose qui plaira à l’utilisateur non initié est la simplicité d’utilisation de Processwire. Après s’être connecté, l’usager se voit présenter le plan du site. Je me permets d’utiliser mon site personnel dans les exemples ci-dessous. Sa structure est simple. Mon site est d’abord et avant tout un blogue, tâche qu’aurait pu aisément accomplir Wordpress et aussi Drupal. Encore une fois, il s’agit ici de décrire, pas de déclarer un vainqueur.

Donc, le plan :

decorative

Ici, c’est simple. Il y a la page d’accueil et, en dessous, trois sections principales. Les sections en grisé sont dites de système que seuls les administrateurs peuvent manipuler. Puisque nous sommes au premier niveau, un petit menu latéral en vert montre le choix d’actions offertes pour la page d’accueil. Observons la section Mes textes publiés. Le chiffre 6 indique qu’il y a six pages sous celle-ci. Pour ce qui est des Promenades, la partie blogue de mon site, il y a 279 entrées. En cliquant sur l’une ou l’autre des sections ou sous-sections, on obtient le même type de menu (bien que les captures d’écran soient en anglais, il est tout à fait possible d’obtenir une interface en français).

decorative

Ce premier contact de l’utilisateur avec le CMS plait habituellement beaucoup. Si on reprend l’exemple du site de ma mère (dont l’interface est en français), on verra la même simplicité de présentation. Ma mère n’eut aucun mal à comprendre tout de suite comment son site était construit.

Observons les messages offerts à l’administrateur du CMS. Ils sont généralement dans un phrasé à la portée de tous. Ce souci est présent partout. Tout dépendant des droits d’édition qu’il possède, l’utilisateur aura accès à plus ou moins de choix et tout lui est présenté simplement. Revenons à mon site. Je suggère de cliquer sur le lien Falaise. On observera que les huit pages annoncées dans le plan ci-dessous n’apparaissent pas séparées, mais dans le corps du parent. Cela me permet d’aborder la programmation du site.

decorative

Simplicité de programmation

Dans Processwire, tout est page, modèle de page et champ. Nul besoin de créer des types de contenu. Dans le cas des critiques reçues pour mon livre Falaise, je les ai placées sous la page du livre et j’ai programmé ce qui suit dans le modèle de page :

<div class="contenu">
    <h1><?php echo $page->title; ?></h1>
    <div id="corps"><?php echo $page->body; ?></div>
	<?php
	$lesCritiques = $page->children;
	if(count($lesCritiques) > 0) {
		$html = '<h2 class="livre">Quelques réactions</h2 >';
		foreach($lesCritiques as $uneCritique) {
		  $html .= '<div class="critique">';
		  $html .= $uneCritique->body;
		  $html .= '<p class="auteur">';
		  $html .= $uneCritique->auteur_critique;
	          $html .= '(' . $uneCritique->date_publication . ')';
		  $html .= '</p></div>';
		}
		echo $html;
	}
	?>
</div>

$page est la variable contenant tout ce qui concerne la page (y compris la référence à ses enfants). Je peux ainsi obtenir le titre de la page en appelant $page->title ou $page->get("title"). Plus loin dans le code, je rassemble les critiques. Puisque ces critiques ont été placées sous la page maître, il suffit d’appeler les enfants de cette page : $lesCritiques = $page->children. Je n’ai plus ensuite qu’à livrer par une boucle foreach, chaque $uneCritique représentant une page complète, possédant son champ body ($uneCritique->body), son champ auteur_critique, date_publication, etc.

Processwire ne se mêle au grand jamais du code rendu. Il n’insérera pas de code (comme à la Drupal). Le programmeur ou l’intégrateur est seul responsable du code final. Il suffit d’inspecter le code de l’exemple précité pour s’en rendre compte.

Les pages, les champs, les modèles

Comme il a été démontré plus haut, Processwire tourne autour du concept de page. On peut associer à chaque page un modèle. Processwire permet d’obliger ou pas l’usage des modèles selon le contexte où la page est créée. Ainsi, pour chaque livre de mon site, on ne peut qu’y ajouter des pages de critiques.

La création de modèles est à la discrétion du programmeur. Ces modèles regroupent des champs. Ces derniers sont également à la discrétion du programmeur. Un champ peut servir à un ou plusieurs modèles. Processwire offre aussi, par des modules payants (mais peu chers), des champs spécialisés puissants (pensons, par exemple, à Form Builder qui facilite la création de formulaire).

Les champs

decorative

Les modèles

decorative

Les champs dans un modèle

decorative

L’API

Comme pour l’ensemble de Processwire, l’API répond à un souci de simplicité et d’élégance.

decorative

Le programmeur aura peu de difficulté à s’y retrouver et une lecture rapide de la documentation le mettra vite en confiance. La syntaxe de Processwire se rapproche beaucoup de celle de jQuery. Les opérations sont donc chaînables. Ainsi, on pourra obtenir le chemin de la première image d’une page et de largeur donnée comme ceci :

echo $page->images->eq(0)->width(480)->url;

Nous n’effleurons ici que la surface des possibilités de programmation de Processwire. Ce CMS est, par exemple, pilotable (bootstraping). Toute application peut interroger le CMS pour obtenir l’information souhaitée. Une autre finesse est l’ajout natif de programmation Hanna (ce que, dans Wordpress on appellera des shortcodes). Tout comme pour le reste, inutile de passer par la programmation à la dure. Il suffit d’aller dans la section appropriée et d’y insérer son code.

decorative

decorative

J’attire encore une fois l’attention sur l’élégance des formulaires et, surtout, ce souci de toujours bien expliquer à son utilisateur ce qu’il faut faire.

decorative

Tout le monde est content

Le graphiste crée ses pages HTML et son CSS. Il sait que Processwire n’interviendra pas en ajoutant des divs inutiles et lourdes. Le programmeur est content parce qu’il n’a qu’à insérer cette maquette dans son code. Il n’a pas à se préoccuper des caprices d’un CMS voulant tout contrôler. L’utilisateur est également content car, si le graphiste et le programmeur ont bien fair leur travail, il appréciera la simplicité de l’interface, de la facilité à remplir les champs, de glisser les images dans son texte, etc.

Et les modules ?

Processwire possède sa petite communauté grandissante d’afficionados. Il existe déjà une variété de modules complémentaires. Toutefois, ce n’est pas Wordpress, encore moins Drupal. Il n’existe pas de module de galerie de photos pour Processwire ? Qu’à cela ne tienne ! Il suffit d’utiliser une des nombreuses et excellentes librairies existantes offertes sur le web et l’intégrer à Processwire. Inutile d’avoir un module pour adapter la solution au CMS, utilisez-la un point c’est tout !

Un CMS pour toutes les situations ?

Peut-être pas. Comme rien n’est construit d’avance, plusieurs intégrateurs préfèreront des solutions qui pensent un peu plus à leur place. Le fait d'utiliser des solutions comme Wordpress ou Drupal est cependant loin d’être la garantie d’un développement rapide. Souvent, faire plus simple est bien mieux que de tenter de faire trop compliqué... Rappelons qu’un CMS doit avoir comme principal objectif d’organiser le contenu. La présentation de celui-ci est l’affaire du design et de la programmation. Les concepteurs de Processwire l’ont très bien compris. Beaucoup de vieux CMS sont de gros bateaux. Drupal, dans toute sa magnificence en est l’exemple parfait. Quant à Wordpress, dans toute son ingénuité, il faut parfois en coder longtemps pour arriver à ses fins.

Des CMS comme Processwire ou Concrete 5 (et bien d’autres) ont le mérite de ne pas hériter de codes maintes fois retouchés (et souvent gonflés). Cependant, il serait imprudent d’utiliser Processwire à toutes les sauces. Bien qu’il évolue rapidement de ce côté, Processwire n’est pas encore très bien outillé pour les intranets, les sites communautaires contenant beaucoup de membres devant avoir accès à des pages sécurisées. Il existe certes une solution de commerce en ligne pour Processwire, mais elle est l’oeuvre d'un seul individu et n’est certainement pas complète. Cependant, Processwire brille par sa flexibilité. Il est une boîte à outils bougrement bien ficelée permettant au programmeur de talent de bâtir des sites personnalisés sans avoir recours à des frameworks compliqués. La simplicité de la structure du CMS en fait un outil facile à comprendre et à déboguer, ce qui est en soi un beau tour de force. Maintenant que le CMS est sur sa lancée, je me sens confiant de le proposer à des clients (ou à ma mère !).

En guise de conclusion, laissons parler le concepteur principal du CMS.