Drupal 8 - Type d'entitée & Views - Créer une relations inverse

Posté le Jeudi 22 mars 2018 - 17:35
Dernière mise à jour le Lundi 5 août 2019 - 09:05

Prenons deux types d'entités custom : « Bière » et « Brasserie » avec une relation 1-n entre les deux dans le sens :

  • Une bière provient d'une et d'une seule brasserie
  • Une brasserie peut proposer N bières

 Ainsi :

drupal-views-relations.png

En drupalisme, on aurait une propriété « entity_reference » au niveau de notre bière qui fera référence à la brasserie.

Dans views, si on fait un listing des bières, pas de soucis pour accéder au contenu de la brasserie depuis la bière, par contre l'inverse n'est pas possible.

Depuis un listing de brasserie, il n'est pas possible d’accéder aux bières de la brasserie.

Pour cela il faut utiliser la classe en charge de views_data, définie dans l'annotation de notre type d'entité brasserie :

drupal-entitee-annotation.png

Et voila le contenu de ce fichier

<?php

namespace Drupal\mon_module\Entity\ViewsData;

use Drupal\views\EntityViewsData;

class BrasserieViewsData extends EntityViewsData {

  /**
   * {@inheritdoc}
   */
  public function getViewsData() {
    $data = parent::getViewsData();
    $data['brasserie']['bieres'] = [
      'title' => t('Bieres'),
      'help' => t('Lie la brasserie aux bières produites'),
      'relationship' => [
        'group' => t('bieres'), // Affiché en information dans la partie « relationship » de views
        'label' => t('Bières de la brasserie'), // Affiché en information dans la partie « relationship » de views
        'base' => 'biere', // Table de base de l'entitée cible
        'field table' => 'biere', // Table contenant le champ de l'entitée cible sur lequel on fera la jointure
        'base field' => 'brasserie',// Champ de l'entité cible Champ sur lequel on fera la jointure
        'relationship field' => 'brasserie_id', // Champ de l'entité source sur lequel on fera la jointure
        'id' => 'standard',
      ],
    ];
    return $data;
  }
}

Et voila le travail !

views-relationship.png

Autre exemple ici sur mon module de pronostics : https://github.com/mespronos/mespronos/blob/8.x-2.x/src/Entity/ViewsData/GameViewsData.php

Aller plus loin ?

 

Commentaires

Bonjour,

merci pour cette présentation. Est ce que modifier le code est suffisant pour ensuite créer les view directement depuis l'interface utilisateur? Ou bien faut-il envisager de de tout faire par le code à partir de ce niveau de complexité?

Ajouter un commentaire

Ne sera pas publié

CAPTCHA Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...