Comment partager du contenu sur différents environnements sur Drupal 8

27/07/2018

Un des atouts indéniables de Drupal 8 est son partage de configuration. En effet, sur d'autres CMS, en phase de développement, lorsqu'un développeur fait une modification de configuration, il est très difficile d'envoyer cette modification simplement aux autres développeurs. Avec Drupal 8 ce n'est pas le cas. La configuration peut être exportée sous forme de fichier, donc versionnable, et réimportée via de simples commandes dans le terminal via drush.

C'est parfait mais dans la phase de production d'un projet, les développeurs sont encore parfois ralentis par la notion de contenu. En effet un site Drupal 8 est formé de trois grandes composantes logiques qui sont les sources, la configuration et le contenu. Comme évoqué précédemment, la configuration et les sources peuvent être partagées via simples fichiers. Il est donc facile de les partager / merger avec n'importe quel outil de versioning. Mais qu'en est-il du contenu ? La plupart du temps, les fonctionnalités d'un site sont dépendantes les unes des autres et dépendent aussi du contenu, et des liens entre ces contenus. Un développeur back à nécessairement besoin de créer ces contenus pour vérifier le fonctionnel. De la même manière, un développeur front aura besoin de ce même contenu pour intégrer dans des conditions réelles. Pour cela et pour de nombreuses autres raisons, j'ai créé un module d'export et d'import de contenu. Il vous permet facilement d'exporter des contenus bases sur des entités ainsi que leur dépendances.

Installation

Il n'y a pas de particularité quant à l'installation de Content Synchronizer. Pour plus d'informations techniques je vous renvoie vers la page de drupal.org :  https://www.drupal.org/project/content_synchronizer.

Une fois le module installé, une nouvelle entrée sera disponible dans la partie contenu. On verra par la suite à quoi elle correspond. De la même manière, de nouvelles sections d'export sont disponibles dans les formulaires d'édition d'entités et de bundle d'entités.

Le principe

Content Synchronizer a pour but de vous permettre d'échanger des contenus simplement et surtout en intégrant de manière transparente toutes les dépendances de contenu. Par exemple si un node contient un média composé d'une image et d'un terme de taxonomie, l'export ne générera pas uniquement une référence à ce média. En effet, l'export générera de manière récursive une entité node, l'entité media, l'entité image ainsi que le terme de taxonomie. 

Cette notion d'export récursif est à prendre en compte car il peut causer des surprises lors des mises à jour de contenu. Car les dépendances sont exportées et importées de manière transparente. Lors des imports, vous ne voyez que les entités "racines" ; on n'affiche pas la liste de toutes les dépendances car elles sont beaucoup trop nombreuses pour être lisibles la plupart du temps. Heureusement il existe des options lors des imports qui vous permettent de gérer correctement le comportement attendu lors d'une mise à jour (écrasement / publication automatique ...)

Content Synchronizer génère un fichier json pour chaque type d'entité. Chaque entité y est décrite, les assets sont stockés et le tout est intégré dans un fichier ZIP pour faciliter les échanges.

Comment partager son contenu

L'export d'une entité

Prenons l'exemple d'un node simple comprenant un champ référençant un terme de taxonomie et un champ texte formaté comprenant une image. Le but est d'exporter cet article qui a été rédigé sur un environnement de développement sur le site en production. On part du principe que les configurations sont identiques sur les deux environnements. Pour exporter ce node on va se rendre sur son formulaire d'édition se rendre dans la partie "Exporter" et cliquer sur le bouton "Export entity". L'export va se lancer et télécharger un fichier zip. Le node est exporté. 

Exemple de bouton d'export de contenu simple avec Content Synchronizer
Exemple d'export de contenu simple avec Content Synchronizer

Je m'arrête un instant sur ce Zip. Vous pouvez tout à fait le contrôler, vous verrez qu'il contient plusieurs fichiers json dont un part type d'entité node, taxonomy_term et file. Il contient également un répertoire d'assets comprenant l'image du texte formaté du node en question. Chaque entité y est décrite dans toutes ses traductions. 

L'import d'entité

Rendons nous maintenant sur le site en production vers lequel nous voulions ajouter l'article. Dans la partie "Contenu > Content Synchronizer > Import", on va créer un import en uploadant le fichier .Zip précédemment généré. Une fois validé on est redirigé vers une page d'options et de sélection d'entités. Notre import étant extrêmement simple nous n'avons que le node exporté à réimporter. En effet les entités secondaires, desquelles dépend le node, ne sont pas listées. Il existe donc une liste d'options très importantes afin de gérer l'import de ces dépendances : 

Action on entity creation : le type de publication à apporter lors de la création d'une entité. Autrement dit vous pouvez choisir de ne pas publier une entité qui sera créée lors de l'import. Le mode de publication par défaut est "publié".

 

Action on entity update : le type de mise à jour à effectuer lorsque une entité est déjà existante. Autrement dit vous pouvez choisir de

  • Remplacer systématiquement le contenu existant par le contenu de l'import 
  • Remplacer le contenu existant par le contenu de l'import uniquement si le contenu de l'import est plus récent que le contenu deja existant. (Valeur par défaut)
  • Ne jamais remplacer le contenu existant.
Exemple d'import de contenu avec Content Synchronizer
Exemple d'import de contenu avec Content Synchronizer

Une fois le type d'import choisi et les éléments à importer sélectionnés, il suffit de cliquer sur "Import selected entities" pour lancer l'import. A la fin de l'exécution vous pourrez vérifier que votre entité a bien été importée et que les dépendances sont bien conservées. 

 

A noter que lors d'un import, le processus crée une révision sur les entités "révisionnables". Ainsi en cas de problème il est toujours possible de faire un rollback. 

 

Aller plus loin

Notre exemple est assez simple et comprend une seule entité racine et peu de dépendances, mais content synchronizer est capable de gérer plus de difficultés :

  • L'export de plusieurs entités, en ajoutant plusieurs entités à un export  (à créer dans la partie "Contenu > Content Synchronizer > Export")
  • Les dépendances circulaires
  • Les poids et arborescences des termes de taxonomie
  • Des hooks pour modifier les processus d'import et export
  • Des plugins pour exporter vos entités et fields custom

Je ferai probablement un article détaillé sur la création de plugins custom. En attendant je vous invite à tester, éprouver, contribuer éventuellement sur ce module en vous rendant sur sa page drupal.org https://www.drupal.org/project/content_synchronizer 

Ajouter un commentaire

HTML restreint

  • Balises HTML autorisées : <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Les adresses de pages web et les adresses courriel se transforment en liens automatiquement.
Votre email ne sera pas publié mais permettra à l'administrateur de vous recontacter en cas de problème