Was ist programmgesteuert die beste Methode, um die Ergebnisse einer Ansicht zu durchlaufen?


12

In einer Ansicht mit dem Namen "Children" (mit zwei Feldern: "child_node_id" und "birth_order_value") können Sie die Ansichtsergebnisse am besten programmgesteuert durchlaufen, wenn Sie die display_id "default" und ein Argument mit der ID des übergeordneten Knotens angeben.

Bisher habe ich die Ansicht in einem Block mit folgendem Code verwendet:

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

In einem anderen Block möchte ich jedoch eine Logik basierend auf den in der Ansicht gefundenen Werten ausführen. Vielleicht können Sie diese Geschäftslogik anhand meiner letzten Anforderung erraten: Ich möchte, dass der Codeblock, der die Ansicht ('Children') unterstützt, mehrmals aufgerufen wird. Während ich die Ergebnisse des View-Datasets durchlaufe, möchte ich die Kinderknoten, die nach ihren Kindern fragen, rekursiv durchlaufen.


Ihr Ansatz sieht in Ordnung aus. Wenn Sie es in eine Antwort setzen, können die Leute darüber abstimmen und zustimmen. Eine Sache, die Sie möglicherweise versuchen, ist, die Ansicht nicht jedes Mal zu deaktivieren. Führen Sie vor der Ausführung eine $ view-> clone_view () aus. Das Laden von Ansichten ist ziemlich umfangreich und dies kann zu einer Verbesserung des Speichers und der Leistung führen.
Jeremy French

Entschuldigen Sie, wenn ich hier nicht auf der Basis bin, aber so etwas können Sie mithilfe von Beziehungen und Gruppierungen in einem Feld in der übergeordneten Tabelle erreichen. Ich bin mir nicht sicher, ob Sie noch auf Code zurückgreifen müssen. Es kann auch einfacher sein, die Unteransicht und die Logik über die Überschreibung der übergeordneten Vorlage aufzurufen.
Jason Smith

Sie sollten berücksichtigen, dass foreach anstelle von for (.. sizeof ()) eine viel bessere Leistung erzielt wird (da es sich um C anstelle von PHP handelt).
Berkes

Eine Sache zu beachten, anstatt zu tun if (arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2)), könnte es besser sein, zu verwenden if ($node = menu_get_object()).
Chris Pliakas

Ich habe die Antwort von der Frage abgeschnitten und als Antwort gepostet. Auf diese Weise wird den Benutzern der Website klarer, dass diese Frage eine Antwort hat.
Jeremy French

Antworten:


2

Ich habe ein bisschen mit Views herumgespielt und einen Ansatz gefunden. Ich möchte meine Frage jedoch offen lassen für andere Antworten und bessere Lösungen.

<?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();
      ....
   }
}
?>

Der Schlüssel zum mehrmaligen Ausführen der Ansicht war für mich, die Einstellung ($ view) aufzuheben, wenn ich mit der Ergebnismenge fertig war.


1

Ich habe mit der folgenden Funktion eine gute Laufleistung erzielt. Der Rückgabewert ist ein Array aller Ansichtsdatensätze. Durch Aufrufen von dsm ($ return_value) erhalten Sie eine gute Vorstellung von der Struktur Ihrer bestimmten Ansicht.

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

Hier ist eine Hilfsfunktion, die bereits in die Drupal-API integriert ist. (Ich habe eine Weile in den Drupal-Dokumenten herumgespielt und sie schließlich gefunden. Es scheint, dass viele andere auch Lösungen entwickelt haben, die diesen Helfer nicht verwenden, und dass dieser Helfer einen interessanten Schritt ausführt, den andere Lösungen nicht ausführen.) (um pre_render für das $ view Objekt aufzurufen, bevor es ausgeführt wird).

Ich kann nicht dafür bürgen, ob es gut funktioniert oder nicht, aber es ist zumindest ein bestimmter Ort, an dem Probleme mit diesen Ansätzen angesprochen werden.

Für D6 http://api.drupal.org/api/views/views.module/function/views_get_view_result/6

Und für D7 http://api.drupal.org/api/views/views.module/function/views_get_view_result/7

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.