ProcessWire CMS – Guide du débutant
Publié: 2022-03-10ProcessWire est un système de gestion de contenu (CMS) distribué sous la licence publique Mozilla version 2.0 (MPL) et la licence MIT. Il est conçu dès le départ pour résoudre les problèmes causés par exactement ce type d'opinion (qui, inévitablement, entraîne des développeurs et des utilisateurs frustrés) en étant - vous l'avez deviné - sans opinion. En son cœur, il est basé sur quelques concepts de base simples et offre une API exceptionnellement facile à utiliser et puissante pour gérer le contenu de tout type. Allons droit au but !
Lectures complémentaires sur SmashingMag :
- Conception pour les systèmes de gestion de contenu
- Pourquoi les générateurs de sites Web statiques sont la prochaine grande chose
- Ensemble d'icônes du système de gestion de contenu (CMS) (12 icônes gratuites)
- Premiers pas avec les systèmes de gestion de contenu
L'interface graphique d'administration
Après avoir installé ProcessWire (qui nécessite PHP 5.3.8+, MySQL 5.0.15+ et Apache), vous verrez la page d'accueil de l'interface graphique d'administration par défaut :
Remarque : Les pages que vous voyez dans l'arborescence hiérarchique des pages (plus à ce sujet plus tard) sont là parce que j'ai choisi le profil de site Web "Par défaut (Édition Débutant)" pendant le processus d'installation. Ceci est totalement facultatif. Vous pouvez également commencer avec un profil de site Web vierge, ce qui vous permet de tout créer à partir de zéro.
Vous pouvez en fait choisir parmi de nombreux thèmes d'administration, bien que pour ProcessWire 2.6+, le thème par défaut ou le thème Reno soit recommandé. Étant donné que Reno est fourni avec chaque installation ProcessWire, il est assez facile d'y accéder : installez-le et sélectionnez-le dans votre profil utilisateur.
Jetons un coup d'œil à la navigation principale du back-end :
- "Pages" C'est le point d'entrée de l'interface graphique d'administration. Il présente l'arborescence hiérarchique des pages et, par conséquent, tout le contenu de votre site Web dans le back-end.
- "Configuration" C'est l'endroit où configurer l'architecture générale du modèle de données de votre installation via des modèles et des champs (nous en reparlerons plus tard). C'est également là que les modules ProcessWire ajoutent souvent une entrée pour leurs fonctionnalités et leur interface utilisateur spécifiques - par exemple, visualiser les messages de journal directement dans l'interface graphique d'administration ou gérer toutes les différentes langues lorsqu'il s'agit de contenu multilingue.
- « Modules » C'est ici que vous gérez tous les modules de votre site Web. Considérez les modules ProcessWire comme des plugins WordPress : ils étendent et personnalisent le système.
- "Accès" C'est ici que vous gérez les utilisateurs, les rôles des utilisateurs et les autorisations des utilisateurs.
Trois concepts de base simples
Les concepts de base qui forment l'architecture globale du modèle de données de ProcessWire sont exactement trois : les pages, les champs et les modèles . Regardons chacun un par un.
Tout est une page : ou un arbre de page pour les gouverner tous
Une page dans ProcessWire peut générer une page régulière dans le front-end de votre site Web, prête à être visitée par vos utilisateurs (comme "Accueil" et "À propos" dans la capture d'écran ci-dessus). Mais une page peut également exister uniquement dans le back-end, sans contrepartie frontale - par exemple, une page de paramètres masquée où vous stockez le slogan global, le logo et l'avis de droit d'auteur de votre site Web. Quand je dis "tout est une page" dans ProcessWire, je le pense. Heck, même les principaux liens de navigation dans l'interface graphique d'administration sont constitués de pages cachées dans l'arborescence hiérarchique des pages !
C'est tellement méta que ça me rappelle un certain mème Xzibit. Mais restons-en là.
Le concept d'une page visible uniquement dans le back-end est assez puissant car il ouvre tout un monde de possibilités sur la façon de structurer et d'accéder aux données via d'autres pages (votre imagination étant la seule limite). Vous pouvez créer un catalogue de produits massif, ou une application intranet avec des centaines de milliers d'articles basés sur une hiérarchie de pages complexe, ou juste un simple blog avec les catégories et balises de blog habituelles (chaque catégorie et balise étant une page dans l'arborescence des pages) .
Joss Sanglier, membre distingué de la communauté ProcessWire, décompose le concept de pages en ceci :
[I] n Les pages ProcessWire ne sont […] pas de grandes quantités d'informations, mais de minuscules petites choses, rien de plus qu'un lien vers le monde plus intéressant des champs et des modèles ; juste un petit bout de données dans votre énorme base de données fascinante.Les pages dans ProcessWire sont utilisées pour toutes sortes de choses. Ils peuvent être utilisés comme marqueur dans votre liste de pages. Ils peuvent être utilisés comme parent de groupe pour d'autres pages. Ils peuvent être utilisés comme catégories, tags ou listes ou utilisateurs. Et ils peuvent même être utilisés pour de simples sélections déroulantes - juste pour fournir une étiquette et une valeur.
Interagissons un peu avec l'arborescence hiérarchique des pages :
Comme vous pouvez le constater, les pages peuvent être modifiées, déplacées ou supprimées, et elles peuvent avoir un nombre infini d'enfants et de petits-enfants.
Ouvrons la page "Accueil":
Cela nous amène au prochain concept de base de ProcessWire, les champs.
Les champs sont les conteneurs dans lesquels vous placez les données
Les champs sont essentiellement les conteneurs dans lesquels vous placez des données. À ce stade, il est important de réaliser que ProcessWire n'a pas le concept de champs personnalisés, contrairement à WordPress, car chaque champ de ProcessWire est un champ personnalisé . Lorsque vous créez un champ, vous pouvez lui donner une étiquette, une description et quelques notes supplémentaires qui apparaîtront en dessous.
Modifions le champ "Titre" et ajoutons-y une description et une note :
Les types de champs préinstallés couvrent la plupart des besoins de saisie de données de base. Par exemple, vous pouvez créer des éléments tels que des cases à cocher, des sélecteurs de date, des ensembles de champs (un champ qui regroupe d'autres champs en unités visuellement logiques), des téléchargeurs de fichiers et d'images et, bien sûr, des champs de texte et de zone de texte (l'éditeur WYSIWYG par défaut étant CKEditor ).
Il existe également de nombreux types de champs préemballés et tiers parmi lesquels choisir. Un module de base utile, qui n'est pas installé par défaut, est le champ de répéteur . Il vous permet de créer dynamiquement des lignes d'ensembles de données.
ProcessWire convient également à la gestion des images . Par exemple, vous pouvez décider quelles variantes d'image ProcessWire doit automatiquement créer d'une image après l'avoir téléchargée (ce qui permet de beaux cas d'utilisation pour les images réactives). Et choisir une vignette pour une image est un jeu d'enfant.
Un autre type de champ utile est le type de champ de page . Vous pouvez lier d'autres pages à la page que vous êtes en train d'éditer et ainsi créer une relation entre elles. Dans les paramètres du champ, vous pouvez décider de l'apparence et de l'interaction de l'entrée avec le champ, par exemple, si une seule page ou plusieurs pages doivent être sélectionnables, ou si seules les pages enfants d'une page parent particulière doivent être sélectionnables. Si vous deviez écrire, par exemple, un article de blog, vous pouvez choisir de n'autoriser que les catégories d'articles de blog à se compléter automatiquement.
Une fonctionnalité intéressante que vous pouvez activer dans les paramètres d'un champ est la possibilité de modifier le contenu du champ dans l'interface de votre site Web . Une fois qu'un utilisateur s'est connecté au back-end de ProcessWire, il peut basculer vers le front-end du site Web et modifier et enregistrer le contenu là où il sera finalement rendu.
Après avoir examiné les pages et les champs dans ProcessWire, vous pouvez vous demander : comment une page sait-elle quels champs elle contient ? Et où puis-je définir comment les champs sont ordonnés et rendus sur une page ? Passons donc au dernier concept de base, les modèles.
Les modèles sont les plans des pages
Chaque fois que vous créez une page dans l'arborescence hiérarchique des pages, ProcessWire doit savoir quel modèle lui est associé. En effet, une page doit savoir quels champs elle doit rendre, et ces informations font toujours partie du modèle respectif.
Pour faire court : les modèles contiennent toutes les informations dont la page a besoin sur son contenu (quels champs elle a, comment ces champs sont rendus et comment ils se comportent).
Ouvrons le modèle "Accueil" de notre exemple d'installation.
La principale chose à remarquer est le nombre de réglages. Il y a vraiment beaucoup à découvrir ici. Par exemple, vous pouvez limiter l'accès aux pages créées avec ce modèle à des rôles d'utilisateur spécifiques. Ou vous pouvez décider si les pages créées avec ce modèle doivent être mises en cache pendant une durée spécifique (pour améliorer les performances), ainsi que les conditions dans lesquelles le cache doit être effacé.
Un autre paramètre puissant est caché dans l'onglet "Famille". Ici, vous pouvez définir si les pages créées avec ce modèle peuvent avoir des pages enfants et quels modèles sont autorisés pour la page parent ou ses pages enfants. Cela vous permet de créer exactement le type de hiérarchie de familles de modèles que vous souhaitez. C'est un moyen flexible et pratique (et en fait l'un des moyens les plus puissants) de structurer vos données, et c'est l'une des nombreuses façons dont ProcessWire montre sa flexibilité.
Portons notre attention sur la liste des champs d'un modèle. En regardant la capture d'écran ci-dessus, vous pouvez voir que l'ordre des champs ressemble à l'ordre dans lequel les champs seront rendus sur la page d'accueil. Vous pouvez simplement faire glisser et déposer des champs pour modifier l'ordre dans la liste, modifiant ainsi l'ordre d'apparition lors de l'édition de la page d'accueil.
Vous pouvez également modifier la largeur d'un champ sur la page. Cliquez simplement sur un champ et modifiez-le. Mettons côte à côte les champs "Titre" et "Titre".
Un autre exemple de la façon dont vous pouvez personnaliser et personnaliser l'interface utilisateur d'une page et de ses champs sont les dépendances des champs d'entrée. Ceux-ci vous permettent de spécifier les conditions dans lesquelles un champ particulier dans l'éditeur de page est affiché ou obligatoire. Rendons le champ "Titre" visible dans l'interface utilisateur uniquement si l'utilisateur saisit quelque chose dans le champ "Titre", et marquons le champ "Résumé" comme requis uniquement si l'utilisateur saisit quelque chose dans le champ "Titre":
Voici une vidéo qui vous montre comment les dépendances inputfield peuvent être utilisées pour améliorer l'expérience de l'utilisateur tout en travaillant avec ProcessWire :
Le nombre, l'ordre et l'apparence des champs sur une page sont totalement sous votre contrôle. Vous pouvez mettre un seul champ dans un modèle, aucun (pas très utile) ou plus de 50 champs, 100 ou même plus. Vous pouvez les classer comme vous le souhaitez, spécifier ceux qui sont obligatoires ou visibles et ceux qui ne le sont pas, et spécifier dans quelles circonstances ils doivent être obligatoires ou visibles. C'est là que l'approche sans opinion de ProcessWire brille.
Récapitulatif : pages, champs, modèles
Récapitulons la relation technique entre les pages, les champs et les templates : Vous ajoutez des champs aux templates, et vous sélectionnez un template lors de la création d'une nouvelle page. Les champs que vous voyez lors de la modification d'une page sont les champs que vous avez ajoutés au modèle sélectionné.
Une autre façon de voir cela serait à travers une analogie avec le monde de la programmation :
- Les modèles sont comme des classes.
- Les champs sont comme les propriétés des classes.
- Les pages sont des instances de classes.
Une fois que vous aurez intériorisé ces concepts, vous serez équipé de tout ce que vous devez savoir pour développer dans ProcessWire. Et la raison en est que la philosophie de ProcessWire est basée uniquement sur ces trois concepts. Plutôt cool, non ?
Fichiers modèles et API : un couple destiné à être ensemble
L'endroit où vous récupérez les données entrées dans le back-end de ProcessWire et les sortez dans le front-end est, bien sûr, le système de fichiers - plus précisément, le dossier /site/templates/
de votre installation ProcessWire. Un modèle peut être associé à un fichier PHP physique du même nom ; ainsi, le modèle home
aurait un fichier home.php
dans le dossier /site/templates/
.
Remarque : La façon dont vous développez vos fichiers de modèle dépend entièrement de vous. Si vous êtes familier avec le style WordPress de développement, vous pouvez continuer comme vous en avez l'habitude. Ou, si vous avez une configuration assez complexe et volumineuse et que vous souhaitez créer une architecture plus sophistiquée, vous pouvez utiliser une approche inspirée de MVC, qui fonctionnerait tout aussi bien. Ryan Cramer propose un très bon didacticiel d'introduction, intitulé "Comment structurer vos fichiers de modèle", dans lequel vous pouvez apprendre différentes approches du développement de fichiers de modèle dans ProcessWire.
Le code que vous écrivez dans un fichier de modèle sera principalement composé de constructions PHP de base (conditions if
, boucles foreach
, instructions echo
), de balisage HTML et de l'API de ProcessWire. L'API est fortement inspirée de jQuery - c'est donc un peu comme itérer et parcourir le contenu que vous avez saisi dans le back-end via des méthodes, des sélecteurs et des capacités de chaînage (interface fluide). Il est facile à utiliser et très expressif, tout comme jQuery.
Commençons par examiner quelques exemples simples pour vous familiariser avec l'API. Mais avant de commencer, n'oubliez pas de mettre en signet la feuille de triche de l'API ProcessWire, une référence utile avec un aperçu de toutes les méthodes d'API disponibles.
La chose que nous voulons faire en premier est d'accéder et de sortir le contenu du champ d'une page. L'API nous expose une variable pour gérer cela : $page
.
Obtenir la page actuelle avec la variable $page
La variable $page
contient tous les champs d'une même page. Cela inclut les champs intégrés (comme le nom du modèle d'une page), ainsi que les champs que vous, en tant que développeur, avez ajoutés au modèle de la page.
Ouvrons home.php
, qui est le fichier modèle du modèle home
, et ajoutons-y cette ligne :
echo $page->title;
Cela indique à ProcessWire de saisir le champ "Titre" de la page sur laquelle nous nous trouvons actuellement ("Accueil") et de l'afficher. Supposons que nous ayons également un champ "Titre" sur la page, que nous voulons utiliser à la place du champ "Titre", mais uniquement si l'utilisateur y a entré quelque chose.
echo $page->get("headline|title");
Nous avons utilisé la méthode get
pour accéder au champ d'une page (donc, $page->get(“title”)
est fondamentalement équivalent au premier exemple de code ci-dessus), et nous avons écrit “headline|title”
dans la méthode get
. Cela indique à ProcessWire de vérifier d'abord le champ "Titre" et de sortir le contenu du titre. Mais si le champ « Titre » est vide, le champ « Titre » est utilisé comme solution de repli.
L'utilisation de variables API dans les chaînes PHP est également possible. Les deux instructions d' echo
suivantes pour afficher le nombre d'enfants d'une page sont équivalentes :
echo "This page has " . $page->numChildren . " children pages."; echo "This page has {$page->numChildren} children pages.";
Récupérons les enfants de notre page racine (rappelez-vous, nous sommes toujours dans home.php
) et affichons-les sous forme de liste de liens :
echo "<ul>"; foreach ($page->children as $child) { echo "<li><a href='{$child->url}'>{$child->title}</a></li>"; } echo "</ul>";
Un autre exemple de champ intégré (comme children
et url
dans l'exemple ci-dessus) consiste à parcourir tous les parents d'une page et à créer une navigation par fil d'Ariane :
echo "<ul>"; foreach ($page->parents as $parent) { echo "<li><a href='{$parent->url}'>{$parent->title}</a></li>"; } // output the page itself at the end echo "<li>{$page->title}</li>"; echo "</ul>";
Sur la page racine ("Accueil"), cela n'afficherait que son titre, car $page->parents
serait vide.
Plus tôt, je vous ai montré comment créer des vignettes d'image dans l'interface graphique d'administration. La création de vignettes peut également être effectuée par programmation à l'aide de l'API. Parcourons toutes les images téléchargées dans le champ "Images", créons une grande variante d'image de 600 pixels de large avec une hauteur proportionnelle et une vignette de 150 × 150 pixels, avec des options spécifiques telles que les paramètres de recadrage et la qualité de l'image. En fin de compte, nous voulons lier l'image miniature à la grande image. Cela semble compliqué ? Ce n'est pas le cas.
$options = array( "quality" => 90, "cropping" => "northwest" ); foreach ($page->images as $image) { $large = $image->width(600); $thumbnail = $image->size(150, 150, $options); echo "<a href='{$large->url}'><img src='{$thumbnail->url}' alt='></a>"; }
ProcessWire est assez intelligent à cet égard car il crée des images de n'importe quelle taille à la volée et en conserve un cache, de sorte qu'il ne doit créer les versions qu'une seule fois.
Voici un dernier exemple de $page
pour vous montrer que l'API donne l'impression d'interagir avec le DOM lors de l'utilisation de jQuery. Prenons le dernier enfant de la page parent sur laquelle nous nous trouvons actuellement.
$wantedPage = $page->parent->children()->last();
Outre la variable $page
, l'API en expose une autre importante : $pages
.
Obtenir toutes les pages avec la variable $pages
Avec $pages
, vous avez accès à toutes les pages de votre installation ProcessWire. En d'autres termes, il vous donne accès à tout votre contenu de n'importe où .
Par exemple, vous pouvez avoir une page de paramètres masquée (c'est-à-dire non accessible dans le frontal) dans votre installation ProcessWire ; vous pouvez ajouter des paramètres globaux, comme le titre et la description de votre site Web ; et vous pouvez accéder à ces blobs de contenu et les produire à partir de n'importe quel fichier de modèle de votre choix.
$settings = $pages->get("template=settings"); echo "<h1>{$settings->global_title}</h1>"; echo "<p>{$settings->global_description}</p>";
Un cas d'utilisation courant pour une page de sujet unique d'un blog consiste à afficher tous les articles de blog dans lesquels le sujet est référencé. Écrivez simplement ceci dans le fichier modèle du sujet :
$pages->find("template=blog-post, topics=$page");
Remarque : topics
sont un champ dans le modèle d' blog-post
où vous ajouteriez toutes les catégories de sujets spécifiques à l'article de blog.
Un autre paramètre puissant est caché dans l'onglet "Famille". Ici, vous pouvez définir si les pages créées avec ce modèle peuvent avoir des pages enfants et quels modèles sont autorisés pour la page parent ou ses pages enfants. Cela vous permet de créer exactement le type de hiérarchie de familles de modèles que vous souhaitez. C'est un moyen flexible et pratique (et en fait l'un des moyens les plus puissants) de structurer vos données, et c'est l'une des nombreuses façons dont ProcessWire montre sa flexibilité.
Portons notre attention sur la liste des champs d'un modèle. En regardant la capture d'écran ci-dessus, vous pouvez voir que l'ordre des champs ressemble à l'ordre dans lequel les champs seront rendus sur la page d'accueil. Vous pouvez simplement faire glisser et déposer des champs pour modifier l'ordre dans la liste, modifiant ainsi l'ordre d'apparition lors de l'édition de la page d'accueil.
Vous pouvez également modifier la largeur d'un champ sur la page. Cliquez simplement sur un champ et modifiez-le. Mettons côte à côte les champs "Titre" et "Titre".
Un autre exemple de la façon dont vous pouvez personnaliser et personnaliser l'interface utilisateur d'une page et de ses champs sont les dépendances des champs d'entrée. Ceux-ci vous permettent de spécifier les conditions dans lesquelles un champ particulier dans l'éditeur de page est affiché ou obligatoire. Rendons le champ "Titre" visible dans l'interface utilisateur uniquement si l'utilisateur saisit quelque chose dans le champ "Titre", et marquons le champ "Résumé" comme requis uniquement si l'utilisateur saisit quelque chose dans le champ "Titre":
Voici une vidéo qui vous montre comment les dépendances inputfield peuvent être utilisées pour améliorer l'expérience de l'utilisateur tout en travaillant avec ProcessWire :
Le nombre, l'ordre et l'apparence des champs sur une page sont totalement sous votre contrôle. Vous pouvez mettre un seul champ dans un modèle, aucun (pas très utile) ou plus de 50 champs, 100 ou même plus. Vous pouvez les classer comme vous le souhaitez, spécifier ceux qui sont obligatoires ou visibles et ceux qui ne le sont pas, et spécifier dans quelles circonstances ils doivent être obligatoires ou visibles. C'est là que l'approche sans opinion de ProcessWire brille.
Récapitulatif : pages, champs, modèles
Récapitulons la relation technique entre les pages, les champs et les templates : Vous ajoutez des champs aux templates, et vous sélectionnez un template lors de la création d'une nouvelle page. Les champs que vous voyez lors de la modification d'une page sont les champs que vous avez ajoutés au modèle sélectionné.
Une autre façon de voir cela serait à travers une analogie avec le monde de la programmation :
- Les modèles sont comme des classes.
- Les champs sont comme les propriétés des classes.
- Les pages sont des instances de classes.
Une fois que vous aurez intériorisé ces concepts, vous serez équipé de tout ce que vous devez savoir pour développer dans ProcessWire. Et la raison en est que la philosophie de ProcessWire est basée uniquement sur ces trois concepts. Plutôt cool, non ?
Fichiers modèles et API : un couple destiné à être ensemble
L'endroit où vous récupérez les données entrées dans le back-end de ProcessWire et les sortez dans le front-end est, bien sûr, le système de fichiers - plus précisément, le dossier /site/templates/
de votre installation ProcessWire. Un modèle peut être associé à un fichier PHP physique du même nom ; ainsi, le modèle home
aurait un fichier home.php
dans le dossier /site/templates/
.
Remarque : La façon dont vous développez vos fichiers de modèle dépend entièrement de vous. Si vous êtes familier avec le style WordPress de développement, vous pouvez continuer comme vous en avez l'habitude. Ou, si vous avez une configuration assez complexe et volumineuse et que vous souhaitez créer une architecture plus sophistiquée, vous pouvez utiliser une approche inspirée de MVC, qui fonctionnerait tout aussi bien. Ryan Cramer propose un très bon didacticiel d'introduction, intitulé "Comment structurer vos fichiers de modèle", dans lequel vous pouvez apprendre différentes approches du développement de fichiers de modèle dans ProcessWire.
Le code que vous écrivez dans un fichier de modèle sera principalement composé de constructions PHP de base (conditions if
, boucles foreach
, instructions echo
), de balisage HTML et de l'API de ProcessWire. L'API est fortement inspirée de jQuery - c'est donc un peu comme itérer et parcourir le contenu que vous avez saisi dans le back-end via des méthodes, des sélecteurs et des capacités de chaînage (interface fluide). Il est facile à utiliser et très expressif, tout comme jQuery.
Commençons par examiner quelques exemples simples pour vous familiariser avec l'API. Mais avant de commencer, n'oubliez pas de mettre en signet la feuille de triche de l'API ProcessWire, une référence utile avec un aperçu de toutes les méthodes d'API disponibles.
La chose que nous voulons faire en premier est d'accéder et de sortir le contenu du champ d'une page. L'API nous expose une variable pour gérer cela : $page
.
Obtenir la page actuelle avec la variable $page
La variable $page
contient tous les champs d'une même page. Cela inclut les champs intégrés (comme le nom du modèle d'une page), ainsi que les champs que vous, en tant que développeur, avez ajoutés au modèle de la page.
Ouvrons home.php
, qui est le fichier modèle du modèle home
, et ajoutons-y cette ligne :
echo $page->title;
Cela indique à ProcessWire de saisir le champ "Titre" de la page sur laquelle nous nous trouvons actuellement ("Accueil") et de l'afficher. Supposons que nous ayons également un champ "Titre" sur la page, que nous voulons utiliser à la place du champ "Titre", mais uniquement si l'utilisateur y a entré quelque chose.
echo $page->get("headline|title");
Nous avons utilisé la méthode get
pour accéder au champ d'une page (donc, $page->get(“title”)
est fondamentalement équivalent au premier exemple de code ci-dessus), et nous avons écrit “headline|title”
dans la méthode get
. Cela indique à ProcessWire de vérifier d'abord le champ "Titre" et de sortir le contenu du titre. Mais si le champ « Titre » est vide, le champ « Titre » est utilisé comme solution de repli.
L'utilisation de variables API dans les chaînes PHP est également possible. Les deux instructions d' echo
suivantes pour afficher le nombre d'enfants d'une page sont équivalentes :
echo "This page has " . $page->numChildren . " children pages."; echo "This page has {$page->numChildren} children pages.";
Récupérons les enfants de notre page racine (rappelez-vous, nous sommes toujours dans home.php
) et affichons-les sous forme de liste de liens :
echo "<ul>"; foreach ($page->children as $child) { echo "<li><a href='{$child->url}'>{$child->title}</a></li>"; } echo "</ul>";
Un autre exemple de champ intégré (comme children
et url
dans l'exemple ci-dessus) consiste à parcourir tous les parents d'une page et à créer une navigation par fil d'Ariane :
echo "<ul>"; foreach ($page->parents as $parent) { echo "<li><a href='{$parent->url}'>{$parent->title}</a></li>"; } // output the page itself at the end echo "<li>{$page->title}</li>"; echo "</ul>";
Sur la page racine ("Accueil"), cela n'afficherait que son titre, car $page->parents
serait vide.
Plus tôt, je vous ai montré comment créer des vignettes d'image dans l'interface graphique d'administration. La création de vignettes peut également être effectuée par programmation à l'aide de l'API. Parcourons toutes les images téléchargées dans le champ "Images", créons une grande variante d'image de 600 pixels de large avec une hauteur proportionnelle et une vignette de 150 × 150 pixels, avec des options spécifiques telles que les paramètres de recadrage et la qualité de l'image. En fin de compte, nous voulons lier l'image miniature à la grande image. Cela semble compliqué ? Ce n'est pas le cas.
$options = array( "quality" => 90, "cropping" => "northwest" ); foreach ($page->images as $image) { $large = $image->width(600); $thumbnail = $image->size(150, 150, $options); echo "<a href='{$large->url}'><img src='{$thumbnail->url}' alt='></a>"; }
ProcessWire est assez intelligent à cet égard car il crée des images de n'importe quelle taille à la volée et en conserve un cache, de sorte qu'il ne doit créer les versions qu'une seule fois.
Voici un dernier exemple de $page
pour vous montrer que l'API donne l'impression d'interagir avec le DOM lors de l'utilisation de jQuery. Prenons le dernier enfant de la page parent sur laquelle nous nous trouvons actuellement.
$wantedPage = $page->parent->children()->last();
Outre la variable $page
, l'API en expose une autre importante : $pages
.
Obtenir toutes les pages avec la variable $pages
Avec $pages
, vous avez accès à toutes les pages de votre installation ProcessWire. En d'autres termes, il vous donne accès à tout votre contenu de n'importe où .
Par exemple, vous pouvez avoir une page de paramètres masquée (c'est-à-dire non accessible dans le frontal) dans votre installation ProcessWire ; vous pouvez ajouter des paramètres globaux, comme le titre et la description de votre site Web ; et vous pouvez accéder à ces blobs de contenu et les produire à partir de n'importe quel fichier de modèle de votre choix.
$settings = $pages->get("template=settings"); echo "<h1>{$settings->global_title}</h1>"; echo "<p>{$settings->global_description}</p>";
Un cas d'utilisation courant pour une page de sujet unique d'un blog consiste à afficher tous les articles de blog dans lesquels le sujet est référencé. Écrivez simplement ceci dans le fichier modèle du sujet :
$pages->find("template=blog-post, topics=$page");
Remarque : topics
sont un champ dans le modèle d' blog-post
où vous ajouteriez toutes les catégories de sujets spécifiques à l'article de blog.
Travaillons un peu plus avec le moteur de sélection de ProcessWire. Laissez-moi vous montrer quelques exemples en vous référant au site de démonstration de ProcessWire, un répertoire des gratte-ciel américains. Le site Web de démonstration contient de nombreuses pages et possède une architecture de modèle de données intéressante (c'est-à-dire des éléments tels que des architectes, des villes, des bâtiments et des emplacements se référençant les uns les autres), et c'est un bon cas d'utilisation pour montrer ce que vous pouvez faire avec les sélecteurs.
Cet exemple trouve tous les gratte-ciel qui mentionnent l'expression "empire state building" dans leur corps de texte :
$pages->get("template=cities")->find("template=skyscraper, body*=empire state building");
Remarque : Nous obtenons d'abord la page avec les cities
modèles ; ensuite, nous obtenons toutes les pages avec le modèle de skyscraper
-ciel . La raison pour laquelle nous pouvons enchaîner les méthodes de cette manière est que toutes les pages de gratte-ciel sont des sous-enfants de la page "Villes".
Retrouvons tous les gratte-ciel des architectes Adrian Smith, Eric Kuhne ou William Pereira et trions les résultats par hauteur dans l'ordre croissant :
$adrian = $pages->get("template=architect, name=adrian-smith"); $eric = $pages->get("template=architect, name=eric-kuhne"); $william = $pages->get("template=architect, name=william-pereira"); $skyscrapers = $pages->find("template=skyscraper, architects=$adrian|$eric|$william, sort=height");
Vous pourriez optimiser le code en trouvant tous les architectes demandés en une seule étape, au lieu de trois :
$architects = $pages->find("template=architect, name=adrian-smith|eric-kuhne|william-pereira"); $skyscrapers = $pages->find("template=skyscraper, architects=$architects, sort=height");
Remarque : La méthode get
renvoie potentiellement toujours une page ; la méthode find
retourne potentiellement toujours plusieurs pages.
Vous pouvez encore réviser le code en utilisant des sous-sélecteurs (oui, vous pouvez avoir des sélecteurs à l'intérieur des sélecteurs) :
$skyscrapers = $pages->find("template=skyscraper, architects=[name=adrian-smith|eric-kuhne|william-pereira], sort=height");
Autres variables d'API
$page
et $pages
ne sont pas les seules variables d'API avec lesquelles vous pouvez travailler. Il y en a beaucoup d'autres, comme $session
(pour connecter et déconnecter les utilisateurs et rediriger vers d'autres pages), $user
(pour établir une connexion avec l'utilisateur qui consulte actuellement la page) et $config
(qui sont pour paramètres spécifiques à votre installation ProcessWire). Prenons deux exemples.
Commençons par rediriger l'utilisateur vers la page d'accueil :
$session->redirect($pages->get("template=home")->url);
Et faisons quelque chose si l'utilisateur actuel est connecté :
if ($user->isLoggedin()) { /* do something */ }
Extension des fonctionnalités de ProcessWire avec des modules
ProcessWire est construit sur une architecture modulaire et facilement extensible, et cela montre : Chaque installation se compose du cœur de ProcessWire (l'essence de ProcessWire, qui permet la fonctionnalité de base) et d'un ensemble de modules préemballés (appelés modules de base) qui reposent sur le dessus du noyau et l'étendre.
Modules de base
Certains de ces modules prépackagés sont installés et activés par défaut, et d'autres sont désinstallés par défaut. Par exemple, le système de commentaires intégré de ProcessWire est un module que vous pouvez activer ou désactiver à tout moment. De plus, des choses comme le champ de répéteur dont nous avons parlé plus tôt et la prise en charge multilingue du contenu ne sont essentiellement que des modules que vous pouvez installer si vous en avez besoin dans votre projet.
Other examples of neat little core modules are Page Names , which validates text input when you're typing a page name (automatically transforming, say, umlauts like a to ae ), and Page Path History , which keeps track of past URLs where pages have lived and automatically redirects to the new location whenever an old URL is accessed.
Finding and Installing Modules
The official modules repository is the main spot where you can find and download ProcessWire modules. On a module's page, you will find the description and purpose of the module and links to the respective GitHub repository and support forum. Module authors are highly encouraged to post their modules in the official repository because it has the highest visibility and is the place people think of first when they want to find a ProcessWire module.
Installing a module is as easy as dragging the module's files to the /site/modules/
directory and installing it in the admin GUI. There are other ways to install a module, such as by installing the Modules Manager, which enables you to browse (and install) modules without leaving the admin GUI.
Commercial Modules
While most modules are free, there are a few commercial ones, too. The ones being promoted in ProcessWire's store are by the lead developer, Ryan Cramer. There you will find the following modules:
- ProDrafts enables you to maintain separate draft and live versions of any page. It also provides a comparison and diff tool, as well as automatic saving capabilities.
- ProFields are a group of ProcessWire modules that help you manage more data with fewer fields, saving you time and energy.
- ProCache (among other things) provides an impressive performance boost for your website by completely bypassing PHP and MySQL and enabling your web server to deliver pages of your ProcessWire website as if they were static HTML files.
Don't miss the screenshots and videos on the module pages to get a first impression. This is finely executed software.
There are also commercial modules outside of the official website, such as Padloper, an e-commerce platform built on top of ProcessWire. To be fair, what is definitely missing in the ProcessWire cosmos is a way for module authors to easily publish their commercial modules in a centralized spot.
How Do ProcessWire Modules Generally Compare to WordPress Plugins?
The reason why ProcessWire has so fewer modules than WordPress (approximately 400 versus more than 40,000) is not so much because it is less popular (an understatement, of course), but more because the core itself is already so feature-rich that adding a ton of modules to extend it is simply not necessary. For example, you don't need a module to create a gallery slideshow or to get the first child of something or to generate thumbnails. All of that (and much more) is already covered out of the box.
So, whereas in WordPress your typical method of solving a problem would be to search for a plugin, in ProcessWire you would first look to the tools available in core; in 90% of cases, that would provide you with the solution.
What You Can Build With ProcessWire
Because ProcessWire behaves more like a framework than a CMS (the core is actually a framework, and the CMS is an application built on top of it), the use cases for building things with ProcessWire are pretty broad. You may want to check out some websites powered by ProcessWire (especially the most liked websites).
ProcessWire is a good fit if you want to develop a JSON REST API, an image-resizing app for employees, a front end for managing millions of products (scalability is pretty impressive — you can have literally millions of pages on a single installation), a web application for displaying the financial results of companies, a simple blog, a website for a big university, or just a simple one-page informational website.
Where To Go From Here: There's A Lot To Discover
Naturally, a beginner's guide can't talk about everything the tool has to offer. So, here is a short list of other ProcessWire features, facts, links and tools worth mentioning:
- Check out ProcessWire Weekly and ProcessWire's blog to stay up to date on the latest news.
- ProcessWire has built-in caching mechanisms (for example, a template and markup cache).
- Wireshell is a command-line interface for ProcessWire based on the Symphony Console component.
- Security is a top priority for ProcessWire.
- Visit grab.pw (isn't that the coolest domain name ever?) to download the latest stable version of ProcessWire (ZIP file, 10MB).
- ProcessWire has a small and friendly community. The discussion board is the central place to discuss any questions and problems.
- ProcessWire has good multi-language support. The multi-language modules are part of the prepackaged core modules.
- ProcessWire has a transparent roadmap, and development is very active. There is a new minor release nearly every week.
- See what others have to say about ProcessWire in the reviews section and on alternativeTo. There's also an interesting Quora thread titled “How does ProcessWire compare to WordPress.”
- ProcessWire.tv is a searchable collection of ProcessWire tutorial videos.
Sommaire
ProcessWire is a system that rewards you [for] being curious. We aim to show you how to fish so that you can catch the big fish.
This statement by Ryan Cramer, the creator of ProcessWire, encapsulates what ProcessWire is all about.
I think what resonates with a lot of people is that ProcessWire is a system that goes from simple to complex, not the other way around. It doesn't assume what you want to build, but instead lays a strong, non-opinionated foundation by offering you effective, powerful tools and leaving the rest to you. That conceptual aesthetic has, to me, a certain appeal to it.