Qual è il modo migliore, a livello di codice, di scorrere i risultati di una vista?


12

Data una vista, denominata "Bambini" (con due campi: child_node_id e un birth_order_value) qual è il modo migliore, a livello di programmazione, di scorrere i risultati delle viste impostati, dato un display_id di "default" e un argomento che contiene l'id del nodo padre?

In precedenza, ho usato la vista in un blocco usando un codice simile al seguente:

if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2)) {
   $node = node_load(arg(1));
   $args = array($node->nid);
   $view = views_get_view('Children');
   print $view->preview('default', $args);
}

Tuttavia, in un altro blocco, voglio eseguire alcune logiche basate sui valori trovati nella vista. Potresti essere in grado di indovinare che la logica aziendale in base al mio requisito finale: voglio che il blocco di codice che supporta la vista ("Bambini") venga chiamato più volte. Mentre eseguo l'iterazione attraverso i risultati del set di dati di visualizzazione, desidero eseguire l'iterazione ricorsiva attraverso i nodi figlio che eseguono query per i loro figli.


Il tuo approccio sembra ok. Se lo metti in una risposta, le persone possono votare e approvare. Una cosa che potresti provare è piuttosto che annullare la visualizzazione ogni volta. Esegui $ view-> clone_view () prima dell'esecuzione. Il caricamento della vista è piuttosto pesante e questo può aiutare la memoria e le prestazioni.
Jeremy French,

Perdonatemi se sono fuori base qui, ma è questo il tipo di cose che potete realizzare usando le relazioni e il raggruppamento su un campo nella tabella padre. Non sono ancora sicuro che dovrai ricorrere al codice. Potrebbe anche essere più semplice chiamare la vista secondaria e la logica dall'override del modello padre.
Jason Smith,

Dovresti considerare foreach invece di (.. sizeof ()), funziona molto meglio (perché è C invece di PHP).
Berkes,

Una cosa da notare, invece di fare if (arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2)), potrebbe essere meglio usare if ($node = menu_get_object()).
Chris Pliakas,

Ho tagliato la risposta dalla domanda e l'ho pubblicata come risposta. In questo modo è più chiaro per gli utenti del sito che questa domanda ha una risposta.
Jeremy French,

Risposte:


2

Giocando un po 'con Views sembra che abbia elaborato un approccio. Tuttavia, vorrei lasciare la mia domanda aperta ad altre risposte e soluzioni migliori.

<?php
if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2) ) {
   $node = node_load(arg(1));
   $args = array($node->nid );
   unset($view);
   $view = views_get_view('Children');
   $view->set_display('default');  
   $view->set_arguments($args);
   $view->set_items_per_page(20);
   $view->execute();
   $newarg = array();
   for ($i=0; $i<sizeof($view->result); $i++) {
      $newarg[$i] = $view->render_field('nid_1', $i);
   }
   for ($i=0; $i<sizeof($newarg); $i++) {
      unset($view);
      $view = views_get_view('Children');
      $view->set_display('default');  
      $view->set_arguments($newarg[$i]);
      $view->set_items_per_page(20);
      $view->execute();
      ....
   }
}
?>

La chiave per eseguire la vista più volte è stata per me annullare l'impostazione ($ view) quando avevo finito con il set di risultati.


1

Ho ottenuto un buon chilometraggio dalla seguente funzione. Il valore restituito è un array di tutti i record della vista. Chiamare dsm ($ return_value) ti darà una buona idea della struttura della tua vista particolare.

function _get_view_data($view_name, $args, $page = NULL, $page_size = 0 ) {
    $view = views_get_view($view_name);
    $view->pager['items_per_page'] = $page_size;
    $view->set_arguments($args);
    if ($page) {
        $view->build($page);
        $view->execute($page);
    }
    else {
        $view->execute();
    }
    return $view->result;
}

1

Ecco una funzione di supporto già integrata nell'API Drupal. (Ho passato un po 'a vagare nei Drupal Docs e alla fine l'ho trovato. Sembra che molti altri abbiano anche prodotto soluzioni che non usano questo aiutante, e anche che questo aiutante fa un passo interessante che altre soluzioni non .. per chiamare pre_render sull'oggetto $ view prima di eseguirlo).

Non posso garantire se funziona bene o meno, ma almeno è un posto specifico per segnalare problemi con questi approcci.

Per D6 http://api.drupal.org/api/views/views.module/function/views_get_view_result/6

E per D7 http://api.drupal.org/api/views/views.module/function/views_get_view_result/7

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.