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 :

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 :

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.

Laisser un commentaire