IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

Comment définir des relations entre des tables personnelles dans Views


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 125
    Points : 55
    Points
    55
    Par défaut Comment définir des relations entre des tables personnelles dans Views
    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

  2. #2
    Membre averti Avatar de mapmip
    Profil pro
    ulla
    Inscrit en
    Juillet 2006
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ulla

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 326
    Points : 345
    Points
    345
    Par défaut
    Pourquoi ne pas utiliser directement une VUE (au sens sgbdr) ?
    Dans cette VUE tu fais directement les jointures qu'il faut.
    Il y a quelques années je suis arrivé à utiliser une VUE comme source de données à une VIEWS,
    enfin si ma memoire ne me joue pas de tours !
    Tiens nous au courant si tu arrives, ca serait chiouette

Discussions similaires

  1. comment créer une relation entre 2 table?
    Par giguoin dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 28/04/2010, 14h31
  2. Réponses: 6
    Dernier message: 15/04/2010, 10h22
  3. Comment établir une relation entre deux tables
    Par Monta^^ dans le forum Hibernate
    Réponses: 15
    Dernier message: 30/04/2009, 19h54
  4. Réponses: 6
    Dernier message: 23/12/2007, 14h06
  5. Réponses: 2
    Dernier message: 23/07/2007, 10h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo