9.9.1. Gestion de la configuration dans Drupal. Importer le contenu et la configuration.
Lorsque vous importez une configuration d’un site vers un autre, certaines configurations sont nécessaires pour afficher du contenu, mais le contenu de la configuration elle-même ne les contient pas. Dans ce tutoriel, nous allons expliquer comment transférer des blocs, des nœuds et des termes de taxonomie d’un site à un autre.
Créons un bloc sur un site et transférons la configuration vers un autre site. Vous pouvez voir comment transférer les configurations d’un site à un autre dans l’article précédent 9.9. Travailler avec les configurations dans Drupal. Configuration Active, Sync, transfert de configurations de DEV vers LIVE.
Vous verrez cette erreur : « Ce bloc est cassé ou manquant. Vous pouvez manquer du contenu ou vous devez activer le module d’origine. » :
Le bloc nécessite un bloc entité avec un UUID spécifique. L’UUID est un identifiant unique de l’entité, même si nous créons un bloc identique avec le même contenu sur le nouveau site, ce bloc ne sera pas pris en compte par la configuration car le nouveau bloc aura un UUID différent. Vous pouvez voir l’UUID requis dans la configuration du bloc :
Ne confondez pas l’UUID du bloc avec l’UUID de la configuration. En effet, les configurations sont aussi des entités dans Drupal, mais contrairement aux blocs et nœuds qui sont des entités de contenu, les configurations sont des entités de configuration. Dans une prochaine leçon, nous étudierons les classes ContentEntity et ConfigEntity.
Maintenant que vous savez quel UUID est nécessaire pour le bloc, vous devez créer ce bloc via le code afin que lors du déploiement, votre bloc avec le bon UUID soit créé. Pour cela, nous utiliserons hook_update_n()
:
https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Extension%
Le hook_update_n() doit être ajouté dans le fichier .install du module personnalisé, afin que la mise à jour soit prise en compte, le module doit être ajouté au site au préalable et activé. Chaque nouveau hook_update_n() est exécuté lors du lancement de update.php ou de la mise à jour de la base via drush ou drupal console. Contrairement aux autres hooks où il suffit de remplacer le mot hook au début, dans hook_update_n() vous devez changer aussi le n à la fin pour que chaque mise à jour ait sa propre version, on utilise généralement les numéros 8000 et plus pour Drupal 8.x, 7000 et plus pour Drupal 7.x, c’est-à-dire que le premier chiffre correspond à la version du noyau Drupal.
/modules/custom/drupalbook/drupalbook.install :
/**
* Ajouter un bloc simple avec texte et image.
*/
function drupalbook_update_8001(&$sandbox) {
$uuid = 'dc0876cf-a242-4f4c-af0e-8a27fbe9e142';
$block = \Drupal::entityManager()->loadEntityByUuid('block_content', $uuid);
if (empty($block)) {
$block = \Drupal\block_content\Entity\BlockContent::create([
// Titre du bloc.
'info' => 'Bloc texte simple avec image',
// Type de bloc.
'type' => 'basic',
'uuid' => 'dc0876cf-a242-4f4c-af0e-8a27fbe9e142'
]);
$block->body->value = 'Bonjour, Monde !';
$block->save();
}
}
Vous devez maintenant transférer ce code vers le second site et lancer le fichier update.php là-bas :
Drupal détectera cette mise à jour et vous verrez votre bloc une fois terminée.
Si vous regardez le code qui crée le bloc, avant de créer le bloc, on vérifie qu’il n’existe pas déjà, ainsi lors de la mise à jour de votre site source où le bloc existe déjà, il n’y aura pas d’erreur liée à la création d’un bloc avec un UUID existant.
Notez également que seul le texte du bloc est transféré, les images insérées dans le texte via le navigateur d’images CKEditor ne seront pas transférées, car les fichiers doivent être transférés séparément. Il est possible de les télécharger via drush, ssh, ftp ou de les placer dans git (si ce sont 1 ou 2 fichiers, pour plus gros il vaut mieux ne pas alourdir git avec des fichiers images). Le processus de déploiement varie selon les projets et utilise différentes approches, il est donc important que le projet ait au moins une documentation minimale décrivant ce processus.
Il en va de même pour la création des termes de taxonomie, on ne transfère que les paramètres du vocabulaire et les champs des termes de taxonomie dans la configuration, mais les termes eux-mêmes doivent être créés séparément, par exemple ainsi :
\taxonomy\Entity\Term;
...
/**
* Créer un terme de taxonomie de manière programmatique.
*/
function drupalbook_update_8002(&$sandbox) {
$term = Term::create([
'name' => 'Drupal 8',
'vid' => 'tags',
])->save();
}
Dans le champ vid
, vous devez indiquer le nom machine du vocabulaire de taxonomie (Vocabulary ID).
Pour créer des nœuds, vous devez utiliser un code similaire :
/**
* Créer un nœud de manière programmatique.
*/
function drupalbook_update_8003(&$sandbox) {
$node = Node::create(['type' => 'page']);
$node->set('title', 'À propos de nous');
$body = [
'value' => 'Texte à propos de nous',
'format' => 'basic_html',
];
$node->set('body', $body);
$node->status = 1;
$node->enforceIsNew();
$node->save();
}
En gros, vous pouvez aussi écrire au lieu de set()
simplement :
= [
'value' => 'Texte à propos de nous',
'format' => 'basic_html',
];
$node->set('body', $body);
// ou
$node->body->format = 'basic_html';
$node->body->value = 'Texte à propos de nous';
Chaque fois que vous ajoutez un nouveau hook_update_n(), vous devez lancer update.php. Si vous utilisez Acquia ou un autre hébergeur avec déploiement automatique, ce processus est automatisé et vous devez vous renseigner sur le déroulement du déploiement.
Les exemples de code sont disponibles sur GitHub :
https://github.com/levmyshkin/drupalbook8