Aller au contenu

Relations entre entités

Le champ Entity Reference permet de créer des relations entre différentes entités Drupal :

  • Contenu → Taxonomie
  • Contenu → Contenu
  • Contenu → Utilisateur
  • Contenu → Média

C’est le cœur du modèle relationnel de Drupal !

🛒 Champs de référence pour le type “Product”

Section intitulée « 🛒 Champs de référence pour le type “Product” »

Ce champ a normalement été créé dans l’Étape 2. Vérifions sa configuration :

  1. Allez dans StructureContent typesProductManage fields

  2. Si le champ field_category n’existe pas, créez-le :

  3. Create a new fieldReferenceTaxonomy term

Dans Manage form display :

WidgetUtilisation
Select listPeu d’options (< 20)
AutocompleteBeaucoup d’options
Check boxes/radioAfficher toutes les options

→ Choisissez Select list pour ce champ

  1. Create a new fieldReferenceTaxonomy term

  2. Configurez :

ParamètreValeur
LabelMarque
Machine namefield_brand
Allowed vocabularies✓ Marque
RequiredYes
Allowed number of values1

Widget : Select list

Ce champ permet de sélectionner plusieurs tailles disponibles.

ParamètreValeur
LabelTailles disponibles
Machine namefield_sizes
Allowed vocabularies✓ Taille
RequiredNo
Allowed number of valuesUnlimited

Widget : Checkboxes/radio buttons

Même logique que les tailles.

ParamètreValeur
LabelCouleurs disponibles
Machine namefield_colors
Allowed vocabularies✓ Couleur
RequiredNo
Allowed number of valuesUnlimited

Widget : Checkboxes/radio buttons

  1. Allez dans StructureContent typesBlog ArticleManage fields

  2. Create a new fieldReferenceTaxonomy term

  3. Configurez :

ParamètreValeur
LabelCatégorie
Machine namefield_blog_category
Allowed vocabularies✓ Catégorie Blog
RequiredYes
Allowed number of values1

Widget : Select list

Allez dans Manage display de chaque type de contenu.

Options de formatage pour les références taxonomie

Section intitulée « Options de formatage pour les références taxonomie »
FormatterRendu
LabelTexte simple : “Nike”
Label (linked)Lien vers la page du terme : <a href="/taxonomy/term/1">Nike</a>
Entity IDJuste l’ID : “1”
Rendered entityAffiche le terme avec son template

Recommandations :

  • Label pour affichage simple
  • Label (linked) si la page du terme existe et est utile
  • Rendered entity pour les marques avec logo

Pour le type Product :

ChampFormatterFormat
field_categoryLabel (linked)-
field_brandLabel-
field_sizesLabelInline, séparé par ”, “
field_colorsLabelInline, séparé par ”, ”
┌──────────────────────────────────────────────────────────┐
│ PRODUCT │
├──────────────────────────────────────────────────────────┤
│ │
│ field_category ──────► product_category (1) │
│ └── Hommes, Femmes, etc. │
│ │
│ field_brand ──────► brand (1) │
│ └── Nike, Adidas, etc. │
│ │
│ field_sizes ──────► size (*) │
│ └── S, M, L, XL... │
│ │
│ field_colors ──────► color (*) │
│ └── Rouge, Bleu, Noir... │
│ │
└──────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────┐
│ BLOG ARTICLE │
├──────────────────────────────────────────────────────────┤
│ │
│ field_blog_category ──────► blog_category (1) │
│ └── Tendances, Conseils... │
│ │
└──────────────────────────────────────────────────────────┘
Légende : (1) = une seule valeur, (*) = valeurs multiples

Utilisez l’interface comme décrit ci-dessus.

  1. Allez dans ContentAdd contentProduct
  2. Remplissez les champs :
    • Titre : T-shirt Nike Sportswear
    • Catégorie : T-shirts
    • Marque : Nike
    • Tailles : S, M, L, XL
    • Couleurs : Noir, Blanc, Rouge
    • Prix : 39.99
    • Description : T-shirt confortable pour le sport
  3. Save
Fenêtre de terminal
# Voir les champs d'un nœud
drush ev "
\$node = \Drupal::entityTypeManager()->getStorage('node')->load(1);
echo 'Catégorie: ' . \$node->field_category->entity->label() . PHP_EOL;
echo 'Marque: ' . \$node->field_brand->entity->label() . PHP_EOL;
echo 'Tailles: ';
foreach (\$node->field_sizes as \$size) {
echo \$size->entity->label() . ' ';
}
echo PHP_EOL;
"
// Via Entity Query
$query = \Drupal::entityTypeManager()
->getStorage('node')
->getQuery()
->accessCheck(TRUE)
->condition('type', 'product')
->condition('status', 1)
->condition('field_category.entity.name', 'T-shirts');
$nids = $query->execute();
// Récupérer le TID de la marque
$brand_tid = \Drupal::entityTypeManager()
->getStorage('taxonomy_term')
->getQuery()
->accessCheck(FALSE)
->condition('vid', 'brand')
->condition('name', 'Nike')
->execute();
$brand_tid = reset($brand_tid);
// Trouver les produits de cette marque
$query = \Drupal::entityTypeManager()
->getStorage('node')
->getQuery()
->accessCheck(TRUE)
->condition('type', 'product')
->condition('field_brand', $brand_tid);
$nids = $query->execute();
Fenêtre de terminal
# Exporter tous les fichiers de configuration
drush cex -y
# Vérifier les fichiers de champs créés
ls config/sync/field.field.node.product.field_*.yml

Fichiers attendus :

field.field.node.product.field_category.yml
field.field.node.product.field_brand.yml
field.field.node.product.field_sizes.yml
field.field.node.product.field_colors.yml
field.field.node.blog_article.field_blog_category.yml

Vérifiez que :

  • field_category créé et lié à product_category
  • field_brand créé et lié à brand
  • field_sizes créé (multiple) et lié à size
  • field_colors créé (multiple) et lié à color
  • field_blog_category créé et lié à blog_category
  • Widgets configurés dans Manage form display
  • Formatters configurés dans Manage display
  • Au moins un produit de test créé avec les références
  • Configuration exportée

Excellent ! Les taxonomies et les relations sont en place. Passons aux Exercices pour consolider ces acquis.