Grav CMS
Parmi tous les CMS disponibles Grav se distingue sur de nombreux points. Il est moderne, simple, rapide, élégant, bien documenté et se passe de base de données. D’autre part le développement est très actif et les thèmes et plugins disponibles très nombreux. Dans cet article je vais vous le présenter.
C’est quoi Grav ?
Vous trouvez tout ce qui concerne ce CMS sur ce site :
Grav est un « flat-file » CMS, de quoi s’agit-il ? Tout simplement que tout se trouve dans des fichiers et qu’aucune base de donnée n’est nécessaire. On voit immédiatement les avantages d’une telle approche en terme d’installation et de performances mais qu’en est-il des possibilités ?
Comme gage de qualité il a été nomminé meilleur CMS open source 2016 sur le site CMS Critic.
Ce qui dépayse dans un premier temps c’est que l’installation se résume à la copie des fichiers et c’est tout ! d’autre part les technologies utilisée font parti des meilleures actuelles :
- Twig Template: le célèbre moteur de template
- Markdown: pour la création du contenu avec cette syntaxe de plus en plus utilisée
- YAML: pour la configuration
- Parsedown: une amélioration de Markdown
- Cache Doctrine: pour la performance
- Pimple Dependency Injection Container: pour la facilité de maintenance et l’extension
- Symfony Event Dispatcher: pour les plugins
- Console Symfony: le CLI
- Gregwar Image Library: pour la manipulation des images
On peut se demander comment le contenu s’organise sans base de données, tout simplement la structure de contenu est elle-même prise comme base de navigation pour le site. d’autre part un système d’événements permet de contrôler finement le comportement.
Installation
Comme je l’ai dit ci-dessus l’installation est d’un simplicité extrême. Il faut toutefois avoir le minimum requis côté serveur (pour mes essais j’ai utilisé Laragon), tout simplement un PHP avec une version minimale de 5.5.9 et c’est tout !
Pour l’installation il y a plusieurs façons de procéder :
- télécharger le package sur le site
- utiliser composer
- cloner à partir de Github
Il me semble que le plus simple est d’utiliser composer lorsqu’on l’a déjà installé, ce qui est le cas quand on développe avec Laravel :
composer create-project getgrav/grav grav
Il suffit d’attendre un peu que tout soit chargé et mis en place.
Je suis juste tombé sur un souci de lancement du script d’installation :
Ce qui est normal parce que je ne suis pas dans le bon dossier et je n’ai pas le PHP devant. J’ai donc relancé manuellement :
Et là tout s’est parfaitement installé avec cette structure de dossiers :
Je tombe sur la page d’accueil :
Apparemment tout roule !
Les dossiers
On a un certain nombre de dossiers :
- /assets : pour recueillirle css et le js temporaire
- /bin : contient le CLI de Grav
- /cache : pour les fichiers du cache
- /images : un cache pour mémoriser les images modifiées
- /logs : les fichiers de log
- /system : les fichiers de fonctionnement de Grav
- /vendor : les librairies de dépendance
- /user : c’est là qu’on construit l’application
Les pages
Puisque le plus important dans ce CMS est le contenu voyons où il se trouve. Dans l’installation de base on a une seule page, on trouve son code ici :
Tout le contenu intéressant va se trouver dans le dossier /user. On y trouve en particulier un dossier /pages qui contient… les pages du site. ici on en a qu’une : 01.home. L’indice numérique est optionnel et ne figure pas dans les url, il sert uniquement :
- à hiérarchiser les pages
- à préciser qu’elles doivent être identifiées dans le menu (c’est du moins ce qui est précisé dans la documentation mais apparemment c’est dans le menu sans la numérotation…)
Modifier une page
Puisque les pages sont en Markdown il faut soit être habitué à cette syntaxe, soit utiliser une application qui facilite la tâche. Il existe des éditeurs en ligne comme Dillinger. Qu’on aime cette syntaxe ou pas on peut lui trouver deux gros avantages : simplicité et lisibilité. La documentation de Grav fournit la syntaxe complète. mais on peut la trouver sur le site officiel. IL est à noter que Grav utilise aussi la version étendue de la syntaxe.
Il existe de nombreux éditeurs en ligne pour ceux qui ont du mal avec la syntaxe de Markdown, mon préféré est StackEdit, il supporte l’extension de syntaxe. Mais la plupart des éditeurs de code proposent des plugins dédié (Atom, Brackets, Sublime Text…) avec pour certains une prévisualisation :
Pour modifier la page de l’installation il suffit de modifier son fichier :
# Mon Grav fonctionne ! ## J'ai réussi à installer **Grav**
Créer une page
Pour créer une nouvelle page il faut faire deux choses :
- créer le dossier pour la page
- créer le code de la page
Il faut donner un titre à la page et un contenu (le header est en YAML) :
--- title: Ma Nouvelle Page --- # C'est ma nouvelle page! Cette nouvelle **page** se situe après la première.
Et la magie de Grav opère :
Le nom de la page apparaît automatiquement dans le menu et l’url a la forme …/mapage.
Le nom dans le menu est celui du nom du dossier mais on peut changer ce comportement en ajoutant une propriété dans le header :
--- title: Ma Nouvelle Page menu: mabellepage ---
La configuration
La configuration se trouve dans le dossier config :
On y trouve 3 fichiers pour tout ce qui concerne : le site, le système et la sécurité. Par exemple la page d’accueil est définie dans le fichier system.yaml :
home: alias: '/home'
La syntaxe est en YAML.
On trouve aussi dans ce fichier le nom du thème utilisé :
pages: theme: antimatter
Dans site.yaml on trouve des renseignements sur le site :
title: Grav author: name: Joe Bloggs email: 'joe@test.com' metadata: description: 'Grav is an easy to use, yet powerful, open source flat-file CMS'
Toutes ces valeurs viennent surcharger celles contenues dans les fichiers de même noms situés en system/config :
On peut donc aller voir dans ces fichiers ce qui est fixé par défaut et recopier la syntaxe pour faire la surcharge. Par exemple pour inverser l’ordre des pages :
pages: ... order: dir: desc
Les pages collection (listing)
Les pages constituent un point clé de Grav, il en existe 3 types :
Dans l’installation de base on a une page standard qui est le type le plus commun. Mais il en existe deux autres.
Une page collection (listing) référence une collection de pages. L’exemple le plus simple est celui du blog dont les pages listent un certain nombre d’articles.
Pour se rendre compte de quoi il s’agit le mieux est de télécharger un squelette d’application. Il en existe tout un tas sur le site :
Je vous propose de télécharger ce squelette de blog :
Vous copiez le paquet dans un dossier du serveur et ça fonctionne du premier coup !
Dans ce type de page on a des pages enfants. Voici le dossier de la page principale :
On a 9 pages enfants avec chacune un dossier. Si on regarde le fichier blog.md on a en particulier ce code :
content: items: @self.children order: by: date dir: desc limit: 5 pagination: true
La propriété content.items référence la collection, et la valeur @self.children signifie qu’on veut les enfants non modulaires publiés. Il y a de nombreuses autres valeurs possibles.
D’autre part avec les autres propriétés on définit l’ordre (par dates descendantes), le nombre d’items à afficher par page et si on doit avoir une pagination.
Pour la pagination il y a un petit souci sous Windows parce que le séparateur pour le paramètre de la page est le signe « : » et il est mal digéré par le système. Pour réparer ça il suffit de changer ce séparateur dans system.yaml, par exemple le classique :
param_sep: '='
La taxonomie a une bonne place dans ce CMS, elle est utilisée dans ce blog. Pour chaque page enfant sont définis plusieurs termes pour les tags :
taxonomy: category: blog tag: [journal, text]
Ce qui rend la recherche par tag très simple.
L’objet Collection de Grav est très riche, on trouve toutes les méthodes disponibles dans la documentation. Les possibilités de ces pages collections sont intéressantes avec la possibilité d’avoir des collections multiples
Les pages modulaires
Le dernier type de page est le modulaire. Le concept est assez facile à comprendre : on utilise plusieurs pages pour en constituer une. Là aussi le plus simple est de prendre un exemple avec le squelette Woo Site :
C’est un site d’une seule page modulaire. Voici les dossiers :
Les pages enfants ont leur nom précédé du caractère de soulignement, on en a ici 7 qui constituent la page complète.
Si on regarde par exemple le code du module :
--- title: Get Hosting. buttons: - text: Sign Up Now url: http://www.dreamhost.com/r.cgi?287326|STYLESHOUT --- ##[Host This Template on Dreamhost.](http://www.dreamhost.com/r.cgi?287326|STYLESHOUT) Looking for an awesome and reliable webhosting? Try [DreamHost](http://www.dreamhost.com/r.cgi?287326|STYLESHOUT). Get <span>$50 off</span> when you sign up with the promocode <span>STYLESHOUT</span>.
On se rend compte qu’il s’agit de cette partie de la page :
Et évidemment dans la page principale modular.md on définit l’emplacement des modules :
--- ... content: items: @self.modular order: by: default dir: asc custom: - _showcase - _features - _pricing - _callout - _screenshots - _testimonials - _subscribe ---
C’est simple et efficace !
Un panneau d’administration
Aller tripatouiller dans le code c’est bien mais avoie une belle interface de gestion c’est encore mieux ! Grav propose de nombreux plugins :
Et justement un panneau d’administration :
Il faut l’installer à partir de la console :
php bin/gpm install admin
Il réclame l’installation additionnelle de ces dépendances :
Il faut ensuite créer un administrateur :
On arrive ensuite dans l’administration :
Ce qu’il est possible de faire à partir de là serait trop long à citer, pratiquement tout est accessible. On peut par exemple voir la constitution de la page modulaire vue ci-dessus :
C’est quand même plus pratique que d’aller voir dans le fichier ! On peut aussi changer tous les paramètres des pages à partir d’un Formulaire ou en supprimer ou ajouter une. On a aussi accès à toute la configuration.
Les thèmes
Un autre aspect intéressant de ce CMS est la présence de nombreux thèmes disponibles et la facilité pour en créer un :
On a vu que les pages sont en Markdown. Les thèmes sont en Twig. La relation entre les deux est nominative. Par exemple avec le squelette modulaire vu ci-dessus :
La page modular.md est en relation avec le template modular.html.twig :
{% block content %} {{ page.content }} <div id="content"> {% for module in page.collection() %} {{ module.content }} {% endfor %} </div> {% endblock %}
On voit dans le code twig que les modules de la collection sont affichés avec une boucle.
Les thème utilisé est défini dans le fichier config/system.yaml :
pages: theme: woo
Il faudrait un article complet pour parler des thèmes !
Conclusion
Grav est un CMS vraiment intéressant et je n’en ai offert ici qu’une vue très partielle parce que je n’ai pas parlé par exemple des formulaires, des groupes et permission, de la gestoin des images… Ou aussi sur la possibilité d’importer un site complet réalisé avec WordPress !
C’est un CMS relativement jeune mais qui est déjà bien pourvu et la documentation est riche et complète. Les plugins sont nombreux et variés. D’autre part la présence de nombreux squelettes très bien faits est un argument de poids en sa faveur.
Si on n’a pas besoin particulièrement d’une base de données ce CMS est un choix judicieux.