9.11. API des entités de Drupal. Créer un type d’entité personnalisé. Générer un type d’entité à l’aide de Drupal Console.
Nous avons déjà étudié le Form API, le Fields API et nous savons comment les données sont stockées dans la base de données de Drupal. Voyons maintenant le fondement de tous les sites Drupal, à savoir l’Entity API.
Vous avez probablement remarqué que les champs n’existent pas par eux-mêmes, mais sont “rattachés” à des entités : nœuds, blocs, termes de taxonomie, vues, etc. Vous pouvez créer des entités regroupées (bundles), par exemple, des types de contenu, des types de blocs, des vocabulaires de taxonomie. Mais que faire si vous devez créer une nouvelle entité avec vos propres bundles ? Dans ce cas, vous aurez besoin de l’Entity API pour créer une nouvelle entité.
J’ai ajouté tout le code sur GitHub dans le module drupalbook_product, vous pouvez télécharger le module et l’ajouter à votre site web :
https://github.com/levmyshkin/drupalbook8
La façon la plus simple de créer de nouveaux types d’entités est d’utiliser Drupal Console, car cela nécessite l’exécution d’une seule commande.
Il n’est pas fréquent de devoir créer de nouveaux types d’entités. La plupart des projets petits et moyens utilisent des modules contribués comme base, par exemple Commerce pour les boutiques en ligne :
https://www.drupal.org/project/commerce
Si vous envisagez de créer votre propre module personnalisé, vous devrez peut-être créer un nouveau type d’entité. Cependant, vous pouvez aussi trouver parmi les modules Drupal un module déjà prêt avec les fonctionnalités nécessaires, que vous pouvez compléter si besoin.
Dans cet article, nous allons analyser l’Entity API et créer notre propre type d’entité Product, qui servira de base à un petit catalogue ou magasin personnalisé. Si vous décidez de créer une boutique sur mesure, je vous recommande vivement d’utiliser Commerce, car cela vous fera gagner énormément de temps, à vous et à vos clients.
Lorsque vous souhaitez créer un nouveau type d’entité, une question se pose : pourquoi ne pas simplement créer un autre type de contenu Product et l’utiliser pour un catalogue ? Oui, cela peut suffire pour un petit catalogue de produits avec un affichage via Views et des filtres simples par prix et stock. Mais quand le nombre de produits atteint des milliers, le gestionnaire sera gêné pour rechercher un produit sur la page de contenu. Il voudra des filtres par référence, catégorie, couleur, nom, etc. directement sur la page
/admin/content
Cela paraîtra excessif et gênera le travail avec d'autres types de contenu comme les Actualités, Articles, Événements ou Pages. C’est pourquoi, dans de telles situations, on crée un type d’entité Product séparé avec son propre panneau d’administration et ses propres réglages.
Commençons la création d’un type d’entité Product séparé. Avant d’exécuter la commande pour créer un type d’entité, je recommande fortement de faire une sauvegarde du site, au moins de la base de données. Car le processus de création d’un type d’entité implique la génération de configurations qui sont enregistrées dans la base de données. Et si une erreur survient et qu’une partie des configs est enregistrée sans que les fichiers d’entité soient présents dans le module, cela peut casser le site. Faites d’abord une sauvegarde.
Nous créons maintenant un nouveau module, que l’on peut aussi créer via Drupal Console :
drupal generate:module
https://hechoendrupal.gitbooks.io/drupal-console/en/commands/generate-module.html
$ vendor/bin/drupal generate:module
// Bienvenue dans le générateur de modules Drupal
Entrez le nom du nouveau module :
> Drupalbook Product
Entrez le nom machine du module [drupalbook_product] :
>
Entrez le chemin du module [modules/custom] :
>
Entrez une description pour le module [My Awesome Module] :
> Catalogue de produits
Entrez le nom du paquet [Custom] :
>
Entrez la version du core de Drupal [8.x] :
>
Voulez-vous générer un fichier .module ? (yes/no) [yes] :
> no
Définir le module comme une fonctionnalité (yes/no) [no] :
> no
Voulez-vous ajouter un fichier composer.json ? (yes/no) [yes] :
> no
Voulez-vous ajouter des dépendances de module ? (yes/no) [no] :
> no
Voulez-vous générer une classe de test unitaire ? (yes/no) [yes] :
> no
Voulez-vous générer un template personnalisable ? (yes/no) [yes] :
> no
Voulez-vous continuer l’opération ? (yes/no) [yes] :
> yes
Fichiers générés ou mis à jour
Chemin de génération : /home/laptop/projects/drupalbook
1 - /modules/custom/drupalbook_product/drupalbook_product.info.yml
Lignes générées : "5"
Ou simplement créer un module avec le fichier drupalbook_product.info.yml :
name: 'drupalbook_product'
type: module
description: 'Catalogue de produits'
core: 8.x
package: 'Drupalbook'
Nous pouvons maintenant générer le type d’entité Product.
https://hechoendrupal.gitbooks.io/drupal-console/en/commands/generate-entity-content.html
$ drupal generate:entity:content
$ vendor/bin/drupal generate:entity:content
// Bienvenue dans le générateur d’entité de contenu Drupal
Entrez le nom du module [admin_toolbar] :
> drupalbook_product
Entrez le nom de la classe de votre nouvelle entité de contenu [DefaultEntity] :
> DrupalbookProductEntity
Entrez le nom machine de votre nouvelle entité de contenu [drupalbook_product_entity] :
>
Entrez le label de votre entité de contenu [Drupalbook product entity] :
> Product
Entrez le chemin de base pour les routes de l’entité de contenu [/admin/structure] :
>
Cette entité doit-elle avoir des bundles ? (yes/no) [no] :
> yes
Cette entité est-elle traduisible ? (yes/no) [yes] :
> yes
Cette entité est-elle révisable ? (yes/no) [yes] :
> no
// generate:entity:config
Entrez le chemin de base pour les routes de l’entité de config [/admin/structure] :
>
Fichiers générés ou mis à jour
Chemin de génération : /home/laptop/projects/drupalbook
1 - modules/custom/drupalbook_product/drupalbook_product.permissions.yml
2 - modules/custom/drupalbook_product/drupalbook_product.links.menu.yml
...
29 - modules/custom/drupalbook_product/src/DrupalbookProductEntityTypeListBuilder.php
Lignes générées : "1060"
Maintenant que le module est généré, vous pouvez l’activer pour faire apparaître le nouveau type d’entité sur le site :
Lors de la génération d’une entité, Drupal Console vous demande quel type d’entité créer.
Entrez le nom de la classe de votre nouvelle entité de contenu [DefaultEntity] :
Le nom de la classe PHP pour notre entité. Il est recommandé d’ajouter “Entity” à la fin du nom.
Entrez le nom machine de votre entité [drupalbook_product_entity] :
Le nom machine proposé sera basé sur le nom de la classe. Appuyez sur Entrée pour l’accepter.
Entrez le chemin de base pour les routes de l’entité de contenu [/admin/structure] :
Votre entité aura sa propre interface pour les opérations CRUD :
L’affichage de la page produit est assez basique, mais pourra être amélioré ou recréé avec Views :
Pour créer une nouvelle entité, vous devez d’abord créer un bundle pour le type d’entité Product. Nous avons choisi de créer une entité avec bundles :
Cette entité doit-elle avoir des bundles ? (yes/no) :
Nous créons donc un nouveau type de produit. Cela nous permettra d’ajouter des champs différents comme Poids, Taille, Couleur et d’autres caractéristiques supplémentaires. Par exemple, les écrans auront une diagonale, et les chaussures une pointure.
Créons un nouveau type de produit – Vêtements :
Vous pouvez maintenant personnaliser les champs pour votre nouveau type de produit :
Nous avons absolument besoin d’un champ de prix au minimum.
Créons quelques produits et jetons un œil à la base de données. Nous y trouvons la table drupalbook_product_entity où sont stockés les UUIDs de nos produits :
Il y a aussi la table drupalbook_product_entity_field_data, dans laquelle sont stockées les propriétés. Ce sont des champs spéciaux d’entité stockés directement dans les tables, car ces champs comme Nom (étiquette de l’entité, par exemple le Titre d’un nœud) ne changent pas selon les révisions.
Si vous ajoutez des champs, deux tables seront créées pour chaque champ, car nous avons choisi de rendre l’entité révisable :
Cette entité est-elle révisable ? (yes/no) [yes]
Je pense que vous comprenez maintenant comment créer de nouveaux types d’entités. Dans les articles suivants, nous étendrons les possibilités de notre catalogue ou boutique personnalisée.
J’ai ajouté tout le code sur GitHub dans le module drupalbook_product, vous pouvez le télécharger et l’ajouter à votre site :