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 !
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