Drupal 8 - Views - Ajouter une relation vers une entité de type custom

Posté le Vendredi 28 juillet 2017 - 16:38
Dernière mise à jour le Vendredi 26 janvier 2018 - 18:35

Contexte :

Un type d'entité custom "Carte" qui utilise come table de stockage "cards". Cette entité possède une propriété "owner" qui permet de la relier à l'utilisateur qui possède la carte. (propriété du type "entity_reference").

Dans une vue listant les cartes, on peut facilement créer une relation vers le "owner" pour accèder à ses informations.

Par contre sur une vue listant les utilisateurs, on ne peut pas avoir la relation inverse, liant les utilisateurs à leur carte. Pour cela il faut utiliser le hook_views_data_alter :

/**
 * Implements hook_views_data_alter().
 */
function MONMODULE_views_data_alter(array &$data) {
  $data['users_field_data']['cards'] = [
    'title' => t("Les cartes de l'utilisateur"),
    'help' => t("Permet de relier l'utilisateur courant à ses cartes"),
    'relationship' => [
      'group' => t('Cartes'),
      'label' => t("Cartes de l'utilisateur"),
      'base' => 'cards', // nom de la table stockant nos entités custom
      'base field' => 'owner', // nom du champ sur lequel faire la jointure
      'relationship field' => 'uid', // nom du champ cible sur lequel faire la jointure (de la table users_field_data)
      'id' => 'standard',
    ],
  ];
}

Merci à flocondetoile sur IRC pour m'avoir mis sur la bonne piste !

Aller plus loin ?

 

Commentaires

Bonjour Kevin,
je lis habituellement avec délectation et soulagement vos billets...
Nouveau bonheur que de trouver celui-ci !
J'ai utilisé le présent billet non pas pour ajouter une relation "inverse" comme décrit ici, mais pour ajouter une relation depuis une vue de votes (table votingapi_vote) vers une entité custom (ce que ne prévoit pas le module voting_api)... Ca fonctionne parfaitement :

$data['votingapi_vote']['my_custom_name'] = [
'title' => 'Custom entity name',
'help' => '',
'relationship' => [
'group' => 'Custom entity name',
'label' => 'Custom entity type',
'base' => 'custom entity table',
'base field' => 'id',
'relationship field' => 'entity_id',
'id' => 'standard',
],
];

merci encore

Pour rajouter un peu de context, je préciserais que cette relation apparait dans la section "Avancé > Relations" de l'UI de la Vue. Elle sera nommée "title" et classé dans la catégorie "group". Le label correspond au préfix qui apparait lorsque l'on ajoute une champ issue de cette relation.

function _views_data_alter (&$data) {
// Table source (qui contient la clé) + "nom machine de la relation.
$data['node__field_email']['NOM_MACHINE_DE_CETTE_RELATION'] = [

// Nom de la rélation (dans "Avancé > Relations")
'title' => t("User to Project mail relationship"),
'relationship' => [
// Catégorie de la rélation (dans "Avancé > Relations")
'group' => t('Project owner'),

// Préfix ajouté aux champs de la vue
'label' => t("Project owner"),

// Table cible à joindre (JOIN).
'base' => 'users_field_data',
// Colonne de cette table avec la clé étrangère.
'base field' => 'mail',
// Colonne de la source qui contient la clé .
'relationship field' => 'field_email_value',
// Id du plugin du type de "relation" (Relationship plugin ID).
'id' => 'standard',
],
];
}

Ajouter un commentaire

Ne sera pas publié

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