Je développe un module qui récupère les informations de Youtube. J'ai pour celà créé 3 tables :
  • youtube_video (avec les champs : vid, vtitle, description...)
  • youtube_playlist (avec les champs : pid, ptitle, description...)
  • youtube_video_playlist (avec les champs: vid, pid, weight) = table de croisement

J'aimerais avoir une vue qui affiche toutes les vidéos d'une playliste donnée (filtrée avec un filtre contextuel). J'utilise Views 7.x-3.8 etDrupal 7.

En terme de sql, j'aimerais avoir :

Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
SELECT v.vtitle, v.vid 
FROM youtube_video AS v 
JOIN youtube_video_playlist AS vp
    ON vp.vid = v.vid
JOIN youtube_playlist AS p
    ON p.pid = vp.pid
WHERE p.pid = valeur_contextuelle_de_playlist_pid

J'ai regardé la "doc" officielle pour hook_views_data() mais il n'y a pas d'exemple avec une table intermédiaire.
En activant le module advanced_help, on a accès à une aide "complémentaire" pour Views et j'ai regardé le lien: Describing tables to Views qui dans un de ses exemple explique la syntaxe pour déclarer un join avec une table intermédiaire.
En testant l'exemple de la doc officielle, les champs apparaissent bien, en testant avec l'exemple de l'aide complémentaire mais en laissant la "left_table" à node, celà fonctionne.
Mais dans mon cas je n'y arrive pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function MONMODULE_views_data() {
 
  $data['youtube_video']['table']['group'] = t('Youtube video');
 
  $data['youtube_video']['table']['base'] = array(
    'field' => 'vid',
    'title' => t('youtube video'),
    'help' => t('youtube video should be related to youtube playlist.'),
    'weight' => -10,
  );
 
  $data['youtube_playlist']['table']['join'] = array(
    'youtube_video' => array(
      'left_table' => 'youtube_video_playlist',
      'left_field' => 'vid',
      'field' => 'vid',
    ),
  );
 
  $data['youtube_video']['vtitle'] = array(
    'title' => t('youtube_video text field'),
    'help' => t('youtube_video text field.'),
    'field' => array(
      'handler' => 'views_handler_field',
      'click sortable' => TRUE,
    ),
    'sort' => array(
      'handler' => 'views_handler_sort',
    ),
    'filter' => array(
      'handler' => 'views_handler_filter_string',
    ),
    'argument' => array(
      'handler' => 'views_handler_argument_string',
    ),
  );
 
  return $data;
}
Je pense que le problème vient de la partie 'join' : si je change cette partie pour faire, comme dans la doc officielle, par exemple une jointure directe avec {node}, celà fonctionne : le groupe 'Youtube video' apparaît et le champ vtitle aussi.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
  $data['youtube_video']['table']['join'] = array(
    'node' => array(
      'left_field' => 'nid',
      'field' => 'vid',
    ),
  );
Quelle est la bonne syntaxe du hook pour pouvoir au final arriver à cette requête que j'indique au début ?
Merci d'avance