Jaki jest najlepszy programowo sposób na iterację wyników widoku?


12

Biorąc pod uwagę widok o nazwie „Dzieci” (z dwoma polami: child_node_id i birth_order_value), jaki jest najlepszy sposób, programowo, na iterację przez zestaw wyników widoków, biorąc pod uwagę display_id „default” i argument zawierający identyfikator węzła nadrzędnego?

Wcześniej korzystałem z widoku w bloku przy użyciu kodu podobnego do następującego:

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

Jednak w innym bloku chcę wykonać logikę na podstawie wartości znalezionych w widoku. Być może będziesz w stanie odgadnąć tę logikę biznesową w oparciu o moje ostatnie wymaganie: chcę, aby blok kodu obsługujący widok („Dzieci”) był wywoływany wiele razy. Podczas iteracji po wynikach zestawu danych widoku chcę rekurencyjnie iterować przez węzły potomne, które szukają swoich dzieci.


Twoje podejście wygląda dobrze. Jeśli podasz odpowiedź, ludzie mogą głosować na nią i zatwierdzać. Jedną z rzeczy, które możesz wypróbować, jest nie rozbijanie widoku za każdym razem. Wykonaj $ view-> clone_view () przed wykonaniem. Ładowanie widoku jest dość duże, co może pomóc w pamięci i wydajności.
Jeremy French

Przepraszam, jeśli jestem tu poza bazą, ale czy jest to coś, co można osiągnąć za pomocą relacji i grupowania na polu w tabeli nadrzędnej. Nie jestem pewien, czy musisz jeszcze uciekać się do kodu. Może być również prostsze wywołanie widoku podrzędnego i logiki z nadpisania szablonu nadrzędnego.
Jason Smith,

Powinieneś rozważyć foreach zamiast dla (.. sizeof ()), działa on znacznie lepiej (ponieważ jest to C zamiast PHP).
berkes

Warto zauważyć, że zamiast tego if (arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2))lepiej użyć if ($node = menu_get_object()).
Chris Pliakas,

Odciąłem odpowiedź z pytania i opublikowałem jako odpowiedź. W ten sposób dla użytkowników witryny jest jasne, że na to pytanie ma odpowiedź.
Jeremy French

Odpowiedzi:


2

Wydaje mi się, że trochę się bawiłem z Widokami. Chciałbym jednak pozostawić moje pytanie otwarte na inne odpowiedzi i lepsze rozwiązania.

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

Kluczem do wielokrotnego wykonywania widoku było dla mnie rozbrojenie ($ view), kiedy skończyłem z zestawem wyników.


1

Mam dobry przebieg dzięki poniższej funkcji. Wartość zwracana to tablica wszystkich rekordów widoku. Wywołanie dsm ($ return_value) da ci dobre wyobrażenie o strukturze twojego konkretnego widoku.

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

Oto funkcja pomocnicza już wbudowana w API Drupala. (Spędziłem trochę czasu grzebiąc w Drupal Docs i ostatecznie go znalazłem. Wygląda na to, że wielu innych opracowało również rozwiązania, które nie używają tego pomocnika, a także, że ten pomocnik robi jeden interesujący krok, którego inne rozwiązania nie… wywołać pre_render na obiekcie $ view przed uruchomieniem).

Nie mogę poręczyć za to, czy działa dobrze, czy nie, ale przynajmniej jest to szczególne miejsce do zgłaszania problemów z tymi podejściami.

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

A dla D7 http://api.drupal.org/api/views/views.module/function/views_get_view_result/7

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.