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:
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.
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.
Réponses:
Juste au sommet de ma tête
Avec les vues 'get_nids' et 'get_related', get_related prend un
nid
argument, qui est configuré pour accepter plusieurs valeurs. Cette option est cachée sous "plus", en bas de la fenêtre de configuration.Option 1:
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.
la source
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 :
Ensuite, si vous voulez réellement charger des valeurs à partir de champs dans les nœuds, vous utiliseriez
node_load
pour récupérer plus d'informations sur les nœuds que vous souhaitez, comme ceci:Maintenant,
$ans_node
c'est un tableau (ou un objet, j'oublie) qui contient toutes les informations dans tous les champs du nœud. Voilá!la source
Ok une solution codée (il y en a peu) mais en voici une:
Code de l'étape 2
Devrait-il s'agir d'une réponse distincte ?? ou un montage ??
la source