Ajouter une Table de Jointure, Où, et de l'Ordre Par des Vues de la Requête en views_query_alter()

Je suis en train de modifier la requête pour les Vues dans Drupal (Vues de la version 3, Drupal version 7).

Ce que je veux faire est de changer la requête avant l'exécution telles que la GAUCHE se Joint à une table dans laquelle j'ai coefficients de pondération attribués aux nœuds.

Si je devais écrire la requête que je veux en SQL, il devrait ressembler à ceci:

    SELECT a.nid, a.title, a.description
    FROM node a
    LEFT OUTER JOIN node_weights b
    ON a.nid = b.nid
    WHERE b.uid = $uid
    ORDER BY b.weight DESC

Cette requête fonctionne comme un champion quand je le lance dans l'analyseur de requêtes. Donc, maintenant, j'ai besoin pour le faire fonctionner dans mon module.

J'ai vu plusieurs approches détaillées sur les différents blogs pour les différentes manières de modifier des requêtes d'Affichage, mais ils semblent être en train de traiter les différentes versions de Vues. Donc, il est très déroutant pour essayer de déterminer si quelque chose, je suis à la recherche pourrait même éventuellement travailler pour mon application.

Il semble que j'ai besoin d'utiliser un MODULE_NAME_views_tables() fonction qui vous permet de Vues quelle est la relation entre la table je veux rejoindre et le nœud de la table.

J'ai ajouté les fonctions suivantes pour NOM_DU_MODULE.les vues.inc:

    function MODULE_NAME_views_tables() {
      $tables['node_weights'] = array(
        "name" => "node_weights",
        "join" => array(
          "left" => array(
            "table" => "node",
            "field" => "nid"
          ),
          "right" => array(
            "field" => "nid"
          ),
        ),
      );
      return $table;  
    }

Cela ne semble pas fonctionner, car lorsque j'utilise Krumo à regarder la requête de tableau, je vois mon "node_weights" tableau dans le "table_queue" élément.

Dans le views_query_alter fonction de (), j'aimerais qu'il fonctionne quelque chose comme ceci:

    function MODULE_NAME_views_query_alter(&$view, &$query) {
      $uid = $_COOKIE['uid']; 
      $view->query->add_relationship('node_weights', new views_join('node_weights', 'nid', 'node', 'nid','LEFT'));
      $view->query->add_where('node_weights', "node_weights.uid", $uid);
      krumo($query);
    }

Cette fonction barfs assez mal. Bien que ma table de jointure fait son apparition dans l'objet $view, le add_relationship méthode est de lancer une erreur pour un 3ème argument, mais je ne vois pas d'exemples en ligne qui ont 3 arguments donc je ne sais pas ce qu'il manque.

Aussi, je suis sûr que mon add_where méthode n'est pas correcte, mais je ne sais pas ce que les entrées. C'est juste un aveugle deviner.

La ligne de fond est que je veux rejoindre le nœud de la table à mon node_weights table, puis assurez-vous que mon poids sont utilisés dans la requête pour trier les résultats en descendant la mode, où l'id d'utilisateur = l'id de l'utilisateur dans ma table, et les tables sont jointes sur le nid de terrain.

Merci à l'avance.

Je ne peux pas poster une réponse à ma propre question pour une raison quelconque, mais je n'ai trouver une solution à ce problème, donc je vais tenter de l'expliquer dans les commentaires.
La première étape est de définir une fonction pour décrire la relation de données dans la jointure de la nouvelle table à l'aide de HOOK_views_table().
La prochaine étape est de créer un HOOK_views_query_alter() fonction. À l'intérieur de cette fonction, il ya plusieurs éléments que vous avez à ajouter.
$join = new views_join; $rejoignez->construire('MODULE_NAME_node_weight','noeud','nid','nid',$aryextra,'LEFT OUTER');
La déclaration ci-dessus essentiellement présente la structure de la jointure. La viande est dans le $aryextra tableau qui a la structure suivante (j'ai eu un moment difficile de trouver une bonne documentation, si elle est ici): $aryextra[] = array('table' => 'TABLENAME','field' => "FIELDNAME','opérateur' => '=','valeur' => 'FIELDVALUE','numeric' => false);

OriginalL'auteur user830694 | 2011-07-27