La Revanche du Site

Le retour de la revanche

Quelques commentaires sur SilverStripe

Je suis tombé dernièrement sur cet article en anglais qui compare plusieurs ténors du monde des CMS libres : Drupal, Joomla, Wordpress, Expression Engine et Silverstripe. C’est ce dernier (comment ça vous vous en doutiez ?) qui remporte son adhésion.

Voici ces arguments et mes commentaire :

An installation of SilverStripe is extremely portable between different server environments. As long as a server supports the base requirements, I can move the all the files into another webroot, enter the DB credentials (or even make the system detect what server its on and have the correct DB credentials load), run the build script through the web browser, and we’re good to go. Server paths and domain names don’t get stored in the database like with most other systems.

Facilité de migration d’un site SilverStripe d’un hébergement à l’autre. On retrouve une fonctionnalité présente notamment dans Ruby on Rails qui permet de définir différents environnements de travail (développement / test / production) dans un seul fichier de configuration. Les chemins d’accès aux fichiers ne sont pas stockés en base ce qui évite pas mal de soucis en cas de changement de serveur.

None of its configurations or settings are stored in the database. Where most CMS’s make the settings available in the admin UI, SilverStripe relegates that to the code level, citing that the end maintainer doesn’t ever need access to those settings.

Suite logique du commentaire précédent, les éléments techniques de configuration du site ne sont pas accessibles via l’administration de ce dernier mais sont stockés séparément dans le code. C’est un choix, mais je trouve qu’il est pertinent pour l’utilisateur final qui ne devrait pas avoir à se soucier de cela, d’éviter tout risque de mauvaise manipulation de ces informations.

The admin panel is for managing content ONLY. With a base installation, I get the ability to manage the site’s pages, uploaded files, comments (which is getting abstracted out in a future release), and user accounts.

L’administration d’un site SilverStripe est centrée sur son contenu, le contenu rien que le contenu.

Creating a new page is as simple as choosing where you want to create the new page, filling in the content, and publishing it, all in one place. Managing pages in your site is really easy and you can see the structure of the site at a glance.

Pas besoin d’en dire plus. La colonne de gauche dans l’interface d’admin montre très clairement l’arborescence du site, un système de drag-and-drop permet d’effectuer rapidement les modifications.

It has a very simple templating language that provides simple conditional and looping structures, template variable to output content, and a few other minor things. These template files are converted to PHP and cached and it’s these cached versions that get used when a request comes in. Since the templates are parsed as PHP in the end, you can next as deep as you want and you get no performance drop since it’s PHP that gets parsed in the end and you get consistent behavior.

Ici ce sont un peu les goûts et les couleurs de chacun. De part ma propre expérience, j’ai trouvé que ce système de templating était vraiment très simple à prendre à main par des intégrateurs et graphistes web. Il est beaucoup plus rassurant que Smarty ou d’autres. Un exemple tiré de la série de tutoriels disponibles sur silverstripe.org

<% control Menu(1) %>

    $MenuTitle

  <% end_control %>

<% control Menu(1) %> : utilise une méthode disponible pour chaque page qui permet d’afficher votre menu. Le paramètre 1 indique le niveau de profondeur. Il suffit ensuite de bien formater sa boucle en utilisant les variables disponibles :

  • $LinkingMode : cette variable prend automatiquement la valeur active sur la page en cours,

  • $Link : le lien vers la page

  • $Title : le titre complet de la page ( la notation {$Title} permet d’inclure la variable dans une chaîne de caractère)

  • $MenuTitle : le titre de la page tel qu’il doit apparaître dans le menu (c’est ce genre de petits détails qui rendent SilverStripe adorable)

  • <% end_control %> : fin de la boucle.

Autre Exemple :

<% if Menu(2) %>

  <% control Menu(2) %>
    $MenuTitle
  <% end_control %>

<% end_if %>

Imaginons que nous soyons dans la partie de votre gabarit en charge du sous-menu. <% if Menu(2) %> : contrôle l’existence de sous-pages liées à la page en cours. Avec un peu d’astuce, on peut très bien faire en sorte d’avoir un gabarit d’une colonne lorsque la page est racine et de 2 colonnes lorsqu’il y a des sous-pages !

<% if Level(2) %>

    $Breadcrumbs

  <% end_if %>
    $Content
    $Form
  • <% if Level(2) %> Si nous sommes dans une sous-page !
  • $Breadcrumbs affiche un fil d’ariane
  • $Content : le contenu tel que rentré par l’utilisateur
  • $Form : un formulaire lié à cette page

Il y a aussi des méthodes pour modifier l’affichage des variables. $Date.Nice permet de modifier l’affichage et le rendre plus lisible (bien entendu il faut que $Date représente bien une date). $Description.LimitCharacter(50) : ne va afficher que les 50 premiers caractères d’un texte, bien pratique pour présenter une liste d’articles, etc.

SilverStripe reprend aussi dans son système de templating des concepts familiers des utilisateurs de rails : layouts et rendus partiels. Petite explication très simpliste : A la racine du répertoire contenant mon template, je vais avoir : * un fichier page.ss (oui c’est l’extension utilisée) * un répertoir layouts contenant * un fichier page.ss * un fichier homepage.ss * un répertoire includes

Le fichier racine page.ss peut contenir tout l’aspect général, header, menus, footer etc. Admettons que vous ayez une div principale chargée d’afficher le contenu de chaque page. Il suffit de placer la variable $Layout à cet endroit. SilverStripe sera assez intelligent pour aller chercher en fonction du type de page affiché, le bon contenu dans le répertoire layouts, à savoir page.ss ou homepage.ss et l’insérer dans le fichier page.ss initial.

Il y a un également un système d’includes très simple <% include MonInclude %> sur la même base que les includes PHP.

Ce que j’en retiens, c’est que la prise en main de ce système n’est vraiment pas compliquée. Un intégrateur peut se l’approprier en quelques jours, et surtout grâce à la séparation code / mise en pages, les designers sont vraiment très libres de leurs choix.

Néanmoins ce système simple peut parfois paraître simpliste par rapport à ce qui peut se faire ailleurs. Les boucles de contrôle se limitent au if/else, on ne peut pas les imbriquer à l’infini non plus, etc. Actuellement, je ne me sens pas trop limité, mais ça pourrait refroidir certaines personnes (je pressens qu’on pourrait contourner ces limitations en créant de nouvelles fonctions dans la partie contrôleur mais… je n’en suis pas encore là)

It uses SEF URL’s out of the box, period.

Oui, on peut redéfinir l’URL de chaque page et pour chaque page modifier les métas qui vont bien. C’est aussi simple que cela. Le plug-in Sitemap est inclus d’office. Créer un flux RSS (pour ceux que ça intéresse encore) ne demande pas beaucoup d’efforts. Le contenu, encore le contenu, tout ceci est accessible aux rédacteurs du site. Je regrette qu’il ne soit pas possible de limiter simplement l’utilisation de cette partie à un certain type d’utilisateurs. Ce serait vraiment un gros plus, dans le cas où l’utilisateur final du site n’y connaîtrait rien ou pour sous-traiter cette partie à un expert SEO.

It uses OOP, MVC, ORM, Decorator Pattern, Singleton Pattern to name a few methods and they all play really nicely.

Je ne vais pas trop m’étendre là-dessus parce que je ne ferais pas longtemps illusion auprès de développeurs patentés, mais oui, Silverstripe est orienté objet et utilise un modèle MVC. Si l’organisation du code de Drupal ou de Wordpress vous donne des sueurs froides, jetez un coup d’oeil à SilverStripe. Personnellement, je trouve tout cela bien plus clair et plus organisé. Une question d’habitude ?

Je pourrai aussi rajouter que SilverStripe marche très bien avec PHPunit, SVN et très prochainement Git. Ca ne gâche rien !

It’s bundled with a RESTful API for easy web service and AJAX development.

Je veux bien croire l’auteur de l’article (et certains sites réalisés avec SS qui exploitent tout cela), mais je n’en suis pas là.

It’s a CMS built on top of a generic development framework called Sapphire, also produced by the SilverStripe company. This is huge and makes the CMS more easily extendable since the CMS itself is merely a module built on top of the framework. ExpressionEngine got the same right idea with its version 2.0 release.

Le saviez-vous ? Le CMS de SilverStripe n’est que la partie émergée de l’iceberg, une application parmi d’autres réalisée à l’aide du Framework Sapphire. Ce n’est qu’un module parmi d’autres, au même titre que le module Blog ou Forum. Vous pouvez faire un site e-commerce avec SilverStripe ou même vous servir de son Back-Office pour gérer le contenu d’un site Full Flash.

Vous avez créé une nouvelle fonctionnalité pour un site qui pourrait servir ailleurs ? Il est simple de la transformer en module, encapsulée dans un seul dossier. Module qui pourra être copié et redéployé sur un autre site d’un simple glisser / déposer de ce répertoire.

Il y a vraiment plus qu’un simple CSM derrière SS, il y a Sapphire !

Et derrière Sapphire ? Sans doute une certaine admiration pour Ruby (à peine déguisée) de la part des développeurs du projet qui ont voulu pouvoir appliquer certaines des bonnes idées du framework Rails dans un environnement PHP.

Creating a custom page type with custom data needs is as simple as extending 2 classes and creating a template file.

Oui c’est aussi simple que cela et c’est d’ailleurs la lecture d’un tutoriel sur cette fonctionnalité qui m’a donné envie d’installer SilverStripe en local pour la première fois. Nul besoin d’aller modifier de façon bancale tel ou tel fichier, de rajouter des champs spéciaux ou que sais-je ? Il suffit de faire une simple définition de ces besoins en étendant la classe Page.

The database is very intelligently laid out. It resembles a collection of PHP classes and subclasses. When you create a subclass of the ORM class, it creates a new table with columns matching the fields you define in the ORM subclass. If I subclass that subclass and add some new fields to the new subclass, a new table is created with only those new columns and the system joins the entries on the two tables as needed.

A moins de venir de Rails et d’être habitué aux db:migrate, c’est un peu surprenant au départ. Revenons un peu en arrière et imaginons que je crée un nouveau type de page, par exemple Employé. Cette page dispose (en plus des caractéristiques habituelles d’une page comme un titre, un contenu etc.), de champs nom, prénom et d’une emplacement pour une image. Vous déclarez ces attributs dans le code de cette page, certes, mais comment faire pour modifier la base de données en conséquence ? Il suffit d’ouvrir son navigateur et taper : www.monsite.tld/dev/build SilverStripe va parcourir votre code à la recherche de nouveautés et modifier tout seule sa BDD comme un grand. Un employé peut occuper plusieurs postes, définissez-le et laisser le framework s’occuper des relations entre la table employé et la table poste.

It comes with built-in image manipulation class for easy cached resizing of images and a robust form building collection for easy form building and tying into the database.

Il y a des fonctions bien utiles pour la génération de formulaires et la manipulation d’images, rien à dire de plus effectivement.

Mais où sont les défauts alors ???

Managing the page entries is not scalable. The SiteTree that allows you to view the pages on your site resembles a folder/file structure on a computer and lazy loads the subpages as you open the “folders” which is great for static pages. When you get into blogs, forums, and anything that has new content added to it often, managing it can without a special interface (which is relatively simple to build) bogs down in the long run.

Effectivement la représentation de l’organisation d’un site sous forme d’arborescence marche très bien pour du contenu statique mais montre ses limites quand on aborde des grosses quantités d’information à afficher (ex : catalogue produit). Mais il est possible de modifier très facilement (enfin c’est prévu et c’est documenté) l’interface d’admin pour avoir une interface adaptée à cette gestion. Regardez ce tuto si vous voulez en savoir plus (il y a des copies d’écran de l’interface obtenue).

The selection of available modules is pretty slim but many have great promise and are quite good despite their early stages.

SilverStripe n’a malheureusement pas la même quantité de modules / plug-ins disponibles que Wordpress ou Joomla. C’est un fait. Mais cela change petit à petit et les essentiels sont là.

The Sapphire framework is big. Not Zend big, but I’ve been working on SilverStripe for a couple years now and I still find new things I didn’t know about.

Je ne sais pas si c’est un défaut.

The documentation on the framework and CMS is not great. CodeIgniter and Wordpress both have excellent documentation. SilverStripe’s needs some work. There’s a lot of classes in the framework and some of them are pretty vague in their function.

Ô que oui ! La partie CMS se documente peu à peu, pour le FrameWork c’est le vide (hormis l’API, mais ça n’est pas très glamour pour le commun des mortels). De gros efforts et de grosses avancées ont été réalisées ces derniers temps. Il faut espérer que la communauté SilverStripe gardera ce rythme.

Pour ma part je vous conseille de le tester et de vous faire votre propre opinon. Commentaires bienvenus ! En attendant quelques liens utiles :

  • Le site Officiel du framework bien entendu.

  • SSbits des tutoriels pour tous les niveaux, des petits bouts de code bien sympa, un concours permanent des meilleurs sites réalisés avec SS, etc.

  • Left & Main le Site d’UncleCheese, une figure de la communauté, tutos et modules bien utiles !

  • Le Channel IRC assez actif, n’oubliez pas que SilverStripe est une création néo-zélandaise et qu’il vaut mieux venir tôt le matin pour croiser des core-developpers de la société.