Existe-t-il un moyen d'intercepter une liste de NID créés par une vue et de les utiliser comme filtre pour une autre vue?

8

Je suis au point de l'expérience Drupal où j'essaie de résoudre les problèmes de conception de sites au niveau du code personnalisé à l'aide des API Drupal et Views. Comme d'habitude, ma tentative apparemment simple de résoudre un problème m'a démontré combien je ne sais pas encore!

J'ai un champ de référence de nœud qui pointe vers un contenu de «faits liés» utilisé par de nombreux types de contenu et sous-catégories différents pour chacun de ces types. Bien que je puisse créer une relation et afficher les «faits associés» pour une vue, il y a des problèmes. D'une part, je veux que les faits connexes soient placés dans un bloc distinct et pour afficher une seule liste de faits connexes pour la liste complète des articles fournis par la vue. Views ne gère pas les doublons pour plusieurs nids avec la même référence de «faits liés». En outre, je devrais générer des vues distinctes sur les «faits connexes» pour chaque type de contenu et sous-catégorie, qui seront un nombre assez important.

Si je pouvais créer une vue des faits connexes distincte pouvant accepter une liste de nids comme argument, la vue des faits connexes pourrait être simplifiée. Ma question est donc de savoir comment procéder. Bien que cela puisse être possible à partir des vues, je cherche une solution php de module personnalisé , j'ai donc besoin de réaliser ce qui suit:

  1. Extrayez les résultats de n'importe quelle vue de type de contenu sous forme de liste d'arguments. En plus d'afficher les résultats de la vue, je dois charger la liste des NID affichés.

  2. Appelez la vue des faits liés et passez-lui la liste des nids à utiliser comme filtre ou filtre contextuel dans la vue des «faits liés».

Information additionnelle:

En utilisant cette stratégie, j'ai commencé par définir une vue et tenter d'en extraire les résultats. Cette tentative a conduit à un problème pour trouver les résultats dans l'objet de vue ( voir cette question ). Une fois que j'aurai les résultats, je devrai générer une autre vue qui aura ces résultats sous forme de filtres. J'ai vu des vues implémentées à partir de code comme des fichiers d'inclusion où tous les paramètres sont codés, mais je n'ai pas trouvé d'exemples qui définissent et génèrent une vue et manipulent les résultats à l'aide d'une fonction php. Tous les exemples ou liens seraient appréciés.

Jusqu'ici:

Deux réponses ont porté sur le processus d'application des résultats d'une vue et de placement dans une autre vue en tant que filtre contextuel. Mais je suis toujours confronté au problème d'avoir des dizaines de types de contenu avec au moins une douzaine de variantes de volet de contenu d'affichage dans chacun. Au lieu de lier directement chaque vue aux faits connexes, je devrai faire en sorte que chacune de mes vues de contenu de vue1 transmette ses résultats à une seule vue de «fait lié» distincte.

CONTENT TYPE    SUB-CATEGORY       RELATED FACT (nid)
    Type 1 --------- General Info       101, 105 
                     Specifications     103, 105
                     Inspections        102 
                     Quality  
                     etc...   
   Type 2 ----------General Info       101, 106
                    Specifications     102, 103 
                    Cost factors       107
                    etc... 

View1 recherche un type de contenu spécifique et contient divers articles de sous-catégorie triés par valeur dans un champ de sous-catégorie. En outre, il contient un champ de référence de nœud pour les faits associés. Affichez un filtre pour un type de contenu et une sous-catégorie et a des champs exposés pour l'affichage et un champ masqué avec les nœuds de référence de faits associés.

View2 filtre les articles «faits associés» et contient un ensemble de filtres contextuels pour nid (bien que le paramètre s'applique à l'URL)

En utilisant le code dans la réponse de Letharion, la boucle foreach à la ligne 6 compile une liste des ID d'article, pas les identifiants de faits associés (les articles contiennent une référence à des faits liés, mais les faits liés n'ont pas de référence de nœud aux articles) . J'ai besoin d'extraire les identifiants de faits associés du champ de faits de chaque nœud. J'ai inclus le champ des faits dans la définition de View1, mais je ne trouve pas le résultat depuis la commande dpm ($ node); s'est écrasé et je ne sais pas où les valeurs sont stockées dans le tableau.

Puisqu'il y aura plus d'un View1 cloné pour différents types de contenu, j'ai pensé qu'il pourrait être judicieux d'utiliser hook_views_post_execute et je l' ai codé comme suit:

function mymodule_views_post_execute (&$sourceview) {

  $nids = '';
  foreach($sourceview->result as $node) {
    $nids += $node->nid . ',';  //I need field name for $node->facts

  }

  $nids = rtrim($nids, ',');
  $view = views_get_view('get_related');

  //dpm($nids);  // Fatal error: Cannot unset string offsets...

  $view->execute_display('panel_pane_1', array($nids));
  }

Enfin, je ne sais pas si je dois diriger l'affichage de la vue vers l'emplacement approprié ou cela se fait-il simplement en plaçant le volet de contenu des faits connexes à l'emplacement du panneau via l'interface utilisateur des panneaux et en laissant le thème des panneaux gérer le reste.

Pierre de taille
la source
2
Est-ce Drupal 7? Si c'est le cas, je recommanderais d'utiliser EntityFieldQuery pour récupérer une liste de nœuds répondant à vos critères.
beth
Pouvez-vous indiquer un exemple de code où cette API est utilisée. Je suis nouveau dans le monde du codage Drupal et j'ai besoin de suivre un exemple de type réel pour comprendre les choses.
Ashlar
drupal.org/node/1343708 est une page intitulée "Comment utiliser EntityFieldQueries".
beth

Réponses:

3

Juste au sommet de ma tête

Avec les vues 'get_nids' et 'get_related', get_related prend un nidargument, qui est configuré pour accepter plusieurs valeurs. Cette option est cachée sous "plus", en bas de la fenêtre de configuration.

Option 1:

$view = views_get_view('get_nids');
// Repeating query, ensure the View is set to cache the results.
$view->preview('display_machine_name', array($arg1, $arg2));

$nids = '';
foreach($view->result as $node) {
  $nids += $node->nid . ',';
}
$nids = rtrim($nids, ',');
$view = views_get_view('get_related');
$view->execute_display('display_machine_name', array($nids));
print $view->render();

Option 2:

Ajoutez un type d'affichage "contextuel" à get_nids et passez ce contexte comme argument à un affichage du volet de contenu de get_related. Malheureusement, je devrais deviner que les contextes de vues ne prennent pas en charge la compression de plusieurs résultats dans un seul contexte, ce qui peut nécessiter une demande de fonctionnalité dans Ctools.

Option 3:

Beth a une excellente suggestion dans un commentaire, qui utilise EntityFieldQuery , lorsque vous voulez une solution de code pur, qui fonctionnerait également avec MongoDB . Les vues ont cependant l'avantage que la plupart du travail peut être effectué dans une interface utilisateur, ce qui est souvent pratique.

Létharion
la source
Suivre le code dans views_db_object pour la méthode -> execute (ligne Views.inc 1060). Je ne vois rien dans le code de la méthode qui lit l'argument (tableau ($ nid)). De plus, comment configurer la vue 'get_related' pour accepter les valeurs de filtre dans l'argument tableau ($ nids)? Dois-je définir des filtres sur «contenu associé» et des filtres contextuels pour accepter les NID?
Ashlar
Désolé, vous avez absolument raison, cela aurait dû être execute_display , ajout d'informations sur le filtre contextuel pour répondre. :)
Letharion
J'ai ajouté plus d'informations pour terminer le problème d'affichage du contenu des faits liés à la question. Veuillez voir "Jusqu'ici".
Ashlar
Désolé, je ne comprends pas où est le problème. Selon votre article, le champ de référence de nœud est partagé entre vos types de contenu et, en tant que tel, la vue «get_nids» rassemblera toutes les entités référencées. Sinon cependant, il faudrait une boucle sur la première vue.
Letharion
1
Hum! Je pense que j'étais confus et peut rendre cela plus compliqué que nécessaire. Merci
Ashlar
2

La recherche de champs au sein d'un nœud et le renvoi d'une liste de NID est exactement la raison pour laquelle EntityFieldQueries est né. (Voir aussi: ma propre question sur le sujet ).

Un exemple de mon code, qui s'exécute lors de la soumission du formulaire Web, et dans lequel je recherche des nœuds de type "Quiz Anzwer Key" pour trouver celui (s) avec le champ "Quiz Reference" rempli avec le NID du formulaire Web en cours de validation :

    $arg = arg();
    $nid = $arg[1]; //this finds us the NID of the current page
    $query = new EntityFieldQuery;  // this EntityFieldQuery searches through Entities for Nodes that point to the current Webform.
    $result = $query
        ->entityCondition('entity_type', 'node') // find nodes
        ->propertyCondition('status', 1) // that are published
        ->propertyCondition('type', 'quiz_answer_key')  // of type Quiz Answer Key
        ->fieldCondition('field_answer_quiz', 'nid', $nid, '=') // that point to the current node in their Quiz reference field
        ->execute(); // do the query
    $results        = $query->ordered_results; //grab the results

Ensuite, si vous voulez réellement charger des valeurs à partir de champs dans les nœuds, vous utiliseriez node_loadpour récupérer plus d'informations sur les nœuds que vous souhaitez, comme ceci:

    $ans_key_id     = $results[0]->entity_id;
    $ans_node       = node_load($ans_key_id);       //once the correct node has been identified, load the contents of that node and suss out the answers 

Maintenant, $ans_nodec'est un tableau (ou un objet, j'oublie) qui contient toutes les informations dans tous les champs du nœud. Voilá!

beth
la source
0

Ok une solution codée (il y en a peu) mais en voici une:

  1. Créez une vue qui obtient toutes les sorties du nid ces nid sous forme de liste délimitée par des virgules, vous pouvez le faire en utilisant des champs comme sortie et en définissant vos paramètres de style sur Style non mis en forme, champs de style de ligne -> rendre le champ nid en ligne et utiliser une virgule comme séparateur.
  2. Dans votre module, créez une fonction qui appelle cette vue et obtient la sortie
  3. Créez votre deuxième vue (ou affichage) utilisez cette fonction comme argument dans votre deuxième vue qui fait réellement la sortie d'affichage, donc sous les arguments l'argument devrait être node: nid, l' action à entreprendre devrait être définie sur "fournir par défaut" et vous puis utilisez le paramètre de code PHP pour appeler votre fonction: return mymodule_get_nids (); assurez-vous que la case "autoriser plusieurs termes par argument" est cochée

Code de l'étape 2

function mymodule_get_nids() {
    $view = views_get_view('getmynids')) // View name
        $view->set_display('mynids'); // Display name
        $view->execute();
        if ($view->result) {
         return $view->preview(); // Can't remember if this needs to be echo or return try both.
        }
    }
}

Devrait-il s'agir d'une réponse distincte ?? ou un montage ??

André
la source
Je recherche des solutions codées. Je vais clarifier la question.
Ashlar
Veuillez me corriger si je me trompe, mais pour autant que je sache, cela ne résoudra même pas le problème, car Ashlar cherche à extraire des données de plusieurs relations en même temps, tandis que les pièces jointes ne seront que le "courant" une? (Cela fait un moment que je n'ai pas utilisé de pièces jointes, donc je peux me tromper)
Letharion
Merci pour votre effort. J'ai ajouté plus d'informations pour terminer le problème d'affichage du contenu des faits liés à la question. Veuillez voir "Jusqu'ici".
Ashlar