Entity Share : partagez vos contenus entre plusieurs Drupal
- Blog
- CMS
- Entity Share : Comment créer un Content Hub entre plusieurs sites Drupal
Exploiter le même contenu sur plusieurs site avec un Content Hub Entity Share
Drupal, de par sa nature de CMS, est construit autour du concept de contenu. Celui-ci est donc l'élément central autour duquel gravite de multiples fonctionnalités. Notamment grâce aux vues et aux modes d’affichages, un contenu peut être réutilisé sous diverses formes au sein d’un même site. Nous allons voir aujourd’hui comment exploiter de manière simple le même contenu sur plusieurs sites, en créant un content hub l’aide du module Entity Share.
Pourquoi un content hub ?
Lorsqu'une organisation édite de nombreux services en lignes, ses contenus (articles, composants, médias, ...) risquent de se retrouver éparpillés et difficiles à gérer, à retrouver. C'est pour répondre à cette problématique que le concept de content hub a été créé.
Le content hub est une application permettant de centraliser le stockage (et parfois l'édition) tous ses contenus afin de les partager avec les différents services et applications en ayant besoin.
Drupal 8 facilitant grandement l'exposition de contenus, son arrivée a permis l'émergence d'un module qui délivre l'ensemble des fonctionnalités nécessaire à un tel outil au sein du CMS : Entity Share.
Qu’est ce que le module Entity Share ?
Créé en 2015, Entity Share est un module basé sur le module JSON:API (qui est intégré au core depuis Drupal 8.7) dont le but est de faciliter le partage de contenus entre plusieurs sites Drupal.
Entity Share est composé d’un module qui constitue essentiellement un socle technique et de deux sous-modules :
- entity_share_server, qui est chargé du partage des contenus ;
- entity_share_client, qui s’occupe du téléchargement des contenus.
Nous allons voir comment mettre en place une configuration simple : deux sites Drupal communiquant entre eux, l’un d’entre eux jouant le rôle du content hub.
Ces deux sites peuvent être basés sur la même installation en multisite ou hébergés sur des serveurs et domaines différents. Entity Share s'accommode de n’importe quelle configuration (ou presque).
Vous souhaitez en savoir plus ?
Prenez un rendez-vous de 15 minutes avec Hakim pour en discuter :
Hakim Rachidi
CTO & Head of DevOps Business Unit
Quelles sont les prérequis pour mettre un place un content hub ?
Pour reproduire cet exemple :
- vous devez disposer de deux installations de Drupal ;
- celle destinée à accueillir le content hub doit être accessible sans restriction (type Basic auth) ;
- vous devez disposer sur ces deux installations d’un même type de contenu strictement identique : même nom et mêmes champs.
Dépendance de Entity Share
Sur chacun des sites, le module entity_share doit être présent.
composer require drupal/entity_share
Installation du serveur Entity Share
Sur le content hub, on active le module entity_share_server.
drush en entity_share_server
Une fois activé, nous allons créer un utilisateur Drupal nommé entityshare qui sera utilisé exclusivement par Entity Share.
drush user:create entityshare --password="letmein"
Cet utilisateur aura a minima besoin de la permission Access channels list.
Pour cela, nous allons créer un rôle nommé entityshare auquel nous allons accorder cette permission, ainsi que les permissions nécessaires pour lire le type de contenu avec lequel nous travaillons.
Dans le cadre de cet article, nous allons utiliser un type de contenu nommé Event.
Ensuite, il faut donner ce rôle à l’utilisateur entityshare.
drush user:role:add entityshare entityshare
L’étape suivante consiste à créer un channel. Cela s’effectue dans Configuration > Services > Entity share > Channels.
Nous allons créer un channel avec les caractéristiques suivantes :
- Name : Events
- Entity type : Content
- Bundle : Event
- Language : not specified
Il faut noter que dans le cas d’un site multilingue, un channel est obligatoirement lié à une langue. Il faudra donc prévoir autant de channels que de langues, et ce pour chaque bundle qu’on souhaite partager.
Si aucun contenu correspondant aux critères du channel que nous venons d’ajouter n’est présent sur votre content hub, c’est le moment d’en créer quelques-uns.
Vous pouvez vous aider du module Devel Generate pour cela.
Installation du client Entity Share
A présent, nous devons activer entity_share_client sur le site sur lequel nous souhaitons récupérer les contenus event.
drush en entity_share_client
Il faut maintenant nous rendre sur Configuration > Web services > Entity share > Remote websites afin d’ajouter les informations de notre content hub.
Synchroniser un contenu
Maintenant que le serveur est configuré, rendons-nous sur Content > Entity share > Pull entities.
Nous allons sélectionner notre remote Content hub, puis le channel Events que nous venons de créer.
Les events correspondant aux critères du channel s’affichent alors.
Il suffit maintenant de cocher un contenu et de cliquer sur Synchronize entities pour lancer la synchronisation et le récupérer depuis le content hub.
Les statuts de synchronisation
Le contenu qui vient d’être récupéré est à présent en statut entities synchronized, ce qui signifie qu’il est strictement identique dans le site client et dans le contenu hub.
Tout changement d’un côté comme de l’autre entraînera un passage au statut entities not synchronized. Il reste toujours la possibilité de resynchroniser le contenu, mais cela se fera nécessairement dans le sens prévu initialement : le content hub écrasera les éventuelles modifications effectuées sur le site client.
De fait, il est donc possible de remettre à jour des contenus du site client qui auraient déjà été synchronisés depuis le content hub.
Comment supprimer un contenu du content hub ?
Le cas de la suppression du contenu sur le content hub avec une répercussion sur le site client comporte une subtilité : le site client se basant sur une liste d’entités fournie par le content hub pour gérer les statuts de synchronisation, en l’absence de statut pour un contenu qui viendrait d’être supprimé du content hub (et qui disparaît donc de cette liste), il va considérer ce contenu comme l’un de ses propres contenus, et le conserver.
Il est donc impossible de supprimer un contenu du site client depuis le content hub. En revanche, il existe une solution de contournement : il est tout à fait possible de dépublier, voire d’archiver un contenu avec l’utilisation de Content moderation par exemple. Son changement d’état de publication sera considéré comme une mise à jour et sera répercuté lors de la prochaine synchronisation.
Automatiser les synchronisations avec Entity Share Cron
Les synchronisations manuelles constituent une première étape, mais si vous souhaitez créer un certain nombre de channels ou synchroniser votre site de manière fréquente, lancer les synchronisations à la main peut vite devenir compliqué à gérer. Pourquoi ne pas laisser votre site gérer cela tout seul ?
A l’aide du module Entity Share Cron, vous pouvez vous abonner à des channels créés sur votre content hub. Pour chaque channel sélectionné, il est possible de récupérer automatiquement les nouveaux contenus et/ou les mises à jour de contenus déjà synchronisés.
La synchronisation se lancera automatiquement, selon la configuration, à chaque exécution du cron ou avec un intervalle minimum. On peut par exemple définir une synchronisation quotidienne des contenus, même si le cron est programmé pour s’exécuter toutes les heures.
Aller plus loin
Nous avons construit un bel exemple de content hub communiquant avec un site web. Le scénario utilisé dans cet article permet de poser les bases, mais n’est en aucun cas exhaustif. Voici quelques pistes pour aller plus loin dans la conception de votre content hub :
- L’intérêt d’un content hub est surtout dans la synchronisation des contenus vers plusieurs sites clients.
- Presque tous les types d’entité fournis par Drupal sont synchronisables, à l’exception des utilisateurs et des entités de configuration.
- Les entités rattachées sont embarquées dans la synchronisation (images illustrant un article, par exemple).
- Il est possible de synchroniser des contenus multilingues en conservant les traductions.