Esiste un modo per intercettare un elenco di NID creati da una vista e usarli come filtro per un'altra vista?


8

Sono al punto dell'esperienza di Drupal in cui sto cercando di risolvere le sfide di progettazione del sito a livello di codice personalizzato utilizzando le API di Drupal e Views. Come al solito, il mio tentativo apparentemente semplice di risolvere un problema mi ha dimostrato quanto non so ancora!

Ho un campo di riferimento al nodo che punta a un contenuto di "fatti correlati" utilizzato da molti diversi tipi di contenuto e sottocategorie per ciascuno di questi tipi. Mentre posso creare una relazione e visualizzare i "fatti correlati" per una vista, ci sono problemi. Per uno, voglio che i fatti correlati vengano inseriti in un blocco separato e che visualizzi un unico elenco di fatti correlati per l'intero elenco di articoli forniti dalla vista. Views non gestisce alcun duplicato per nid multipli con lo stesso riferimento "fatti correlati". Inoltre, dovrei generare visualizzazioni separate di "fatti correlati" per ciascun tipo di contenuto e sottocategoria, che sarà un numero piuttosto elevato.

Se potessi creare una vista dei fatti correlati separata che potesse accettare un elenco di nid come argomento, la vista dei fatti correlati potrebbe essere semplificata. Quindi la mia domanda è come procedere. Anche se può essere possibile all'interno delle viste, sto cercando una soluzione php con modulo personalizzato , quindi devo ottenere quanto segue:

  1. Estrarre i risultati di una qualsiasi delle viste del "tipo di contenuto" come un elenco di argomenti. Oltre a visualizzare i risultati della vista, devo caricare l'elenco dei NID che vengono visualizzati.

  2. Chiama la vista dei fatti correlati e passa l'elenco di nidici da utilizzare come filtro o filtro contestuale nella vista "fatti correlati".

Informazioni aggiuntive:

Usando questa strategia ho iniziato definendo una vista e tentando di estrarne i risultati. Questo tentativo ha comportato un problema nel trovare i risultati nell'oggetto vista ( vedere questa domanda ). Una volta ottenuti i risultati, dovrò generare un'altra vista che abbia quei risultati come filtri. Ho visto le viste implementate dal codice come file di inclusione in cui tutti i parametri sono codificati, ma non ho trovato esempi che definiscono e generano una vista e manipolano i risultati usando una funzione php. Eventuali esempi o collegamenti sarebbero apprezzati.

Finora:

Due risposte hanno indirizzato il processo per applicare i risultati di una vista e metterlo in un'altra vista come filtro contestuale. Ma devo ancora affrontare il problema di avere dozzine di tipi di contenuto con almeno una dozzina di varianti del riquadro del contenuto in ciascuno. Invece di collegare direttamente ciascuna vista ai fatti correlati, dovrò far sì che una qualsiasi delle viste di contenuto della mia vista1 passi i suoi risultati a una singola vista separata dei 'fatti correlati'.

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 trova un tipo di contenuto specifico e contiene vari articoli di sottocategoria ordinati per valore in un campo di sottocategoria. Inoltre contiene un campo di riferimento del nodo per i fatti correlati. Visualizza un filtro per un tipo di contenuto e una sottocategoria e ha campi esposti per la visualizzazione e un campo nascosto con i nodi di riferimento dei fatti correlati.

View2 filtra gli articoli dei "fatti correlati" e contiene un set di filtri contestuali per nid (sebbene l'impostazione si applichi all'URL)

Utilizzando il codice nella risposta di Letharion, il ciclo foreach nella riga 6 sta compilando un elenco degli ID degli articoli, non degli ID dei fatti correlati (gli articoli contengono un riferimento a fatti correlati, ma i fatti correlati non hanno un riferimento nodo agli articoli) . Devo estrarre gli ID dei fatti correlati dal campo dei fatti in ciascun nodo. Ho incluso il campo dei fatti nella definizione di View1, ma non riesco a trovare il risultato dal comando dpm ($ node); si è arrestato in modo anomalo e non so dove siano archiviati i valori nell'array.

Dato che ci sarà più di una View1 clonata per diversi tipi di contenuto, ho pensato che potesse avere senso usare hook_views_post_execute e averlo codificato come segue:

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));
  }

Infine, non sono sicuro di dover indirizzare la visualizzazione della vista nella posizione corretta o ciò avviene semplicemente posizionando il riquadro del contenuto dei fatti correlati nella posizione del pannello attraverso l'interfaccia utente dei pannelli e lasciando che i temi dei pannelli gestiscano il resto.


2
Questo è Drupal 7? In tal caso, consiglierei di utilizzare EntityFieldQuery per recuperare un elenco di nodi che soddisfano i criteri.
Bet

Puoi indicare un codice di esempio in cui viene utilizzata questa API. Sono nuovo nel mondo della codifica Drupal e ho bisogno di seguire un esempio di tipo reale per capire le cose.
Ashlar,

drupal.org/node/1343708 è una pagina chiamata "Come usare EntityFieldQueries".
Beth,

Risposte:


3

Appena al di sopra della mia testa

Con le viste 'get_nids' e 'get_related', get_related accetta un nidargomento impostato per accettare più valori. Questa opzione è nascosta sotto "altro", nella parte inferiore della finestra di configurazione.

Opzione 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();

Opzione 2:

Aggiungere un tipo di visualizzazione "contesto" a get_nids e passare tale contesto come argomento a una visualizzazione del riquadro del contenuto di get_related. Sfortunatamente, dovrei indovinare che i contesti di Views mancano del supporto per comprimere più risultati in un singolo contesto, quindi ciò potrebbe richiedere una richiesta di funzionalità in Ctools.

Opzione 3:

Beth ha un eccellente suggerimento in un commento, che utilizza EntityFieldQuery , per quando si desidera una soluzione di codice puro, che funzioni anche con MongoDB . Le viste hanno però il vantaggio che gran parte del lavoro può essere svolto in un'interfaccia utente, che è spesso conveniente.


Seguendo il codice in views_db_object per il metodo -> execute (Views.inc line 1060). Non vedo nulla nel codice del metodo che legge l'argomento (array ($ nid)). Inoltre, come configuro la vista 'get_related' per accettare i valori del filtro nell'argomento array ($ nids)? Devo impostare i filtri su "contenuto correlato" e filtri contestuali per accettare i NID?
Ashlar,

Spiacenti, hai assolutamente ragione, avrebbe dovuto essere execute_display , ha aggiunto informazioni sul filtro contestuale per rispondere. :)
Letharion,

Ho aggiunto ulteriori informazioni per completare il problema della visualizzazione del contenuto per i fatti correlati nella domanda. Si prega di consultare "Fino ad ora".
Ashlar,

Spiacenti, non capisco dove sia il problema. Secondo il tuo post, il campo di riferimento del nodo è condiviso tra i tuoi tipi di contenuto e come tale vista 'get_nids' raccoglierà tutte le entità referenziate. In caso contrario, sarebbe necessario un ciclo sulla prima vista.
Letharion,

1
Hmm! Penso di essere stato confuso e potrebbe renderlo più complicato di quanto debba essere. Grazie
Ashlar il

2

Cercare i campi all'interno di un nodo e restituire un elenco di NID è la cosa esatta per cui è nata EntityFieldQueries . (Vedi anche: la mia domanda sull'argomento ).

Un esempio dal mio codice, che viene eseguito su invio del modulo web, e in cui cerco nodi di tipo "Quiz Anzwer Key" per trovare quello / i con il campo "Quiz Reference" compilato con il NID del modulo web attualmente in corso di validazione :

    $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

Quindi, se si desidera caricare effettivamente valori dai campi nei nodi, si utilizzerà node_loadper ottenere più informazioni dai nodi desiderati, in questo modo:

    $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 

Ora $ans_nodeè un array (o un oggetto, dimentico) che contiene tutte le informazioni in tutti i campi nel nodo. Ecco!


0

Ok una soluzione codificata (ce ne sono poche) ma eccone una:

  1. Crea una vista che ottenga tutti i nid di output di questi nid come un elenco di limiti di virgola, puoi farlo usando i campi come output e impostando le tue impostazioni di stile su Style Unfomatted, campi di stile di riga -> rendi il campo nid in linea e usa una virgola come separatore.
  2. Nel tuo modulo crea una funzione che chiama questa vista e ottiene l'output
  3. Crea la tua seconda vista (o display) usa questa funzione come argomento nella tua seconda vista che effettivamente fa l'output di visualizzazione, quindi sotto argomenti l'argomento dovrebbe essere nodo: nid, l' azione da intraprendere dovrebbe essere impostata su "fornire default" e tu quindi utilizza l'impostazione del codice PHP per chiamare la tua funzione: return mymodule_get_nids (); assicurati che la casella "consenti più termini per argomento" sia selezionata

Codice passaggio 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.
        }
    }
}

Questa dovrebbe essere una risposta separata ?? o una modifica ??


Sto cercando soluzioni codificate. Chiarirò la domanda.
Ashlar,

Per favore, correggimi se sbaglio, ma per quanto ne so, questo non risolverebbe nemmeno il problema, dato che Ashlar sta cercando di recuperare dati da più relazioni contemporaneamente, mentre gli allegati saranno solo "attuali" uno? (Era da un po 'che non
usavo gli

Grazie per i tuoi sforzi. Ho aggiunto ulteriori informazioni per completare il problema della visualizzazione del contenuto per i fatti correlati nella domanda. Si prega di consultare "Fino ad ora".
Ashlar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.