Каков программный лучший способ перебрать результаты представления?


12

Для данного представления с именем 'Children' (с двумя полями: child_node_id и birth_order_value), каким программным способом лучше всего выполнить итерацию по набору результатов представлений с помощью display_id 'default' и аргумента, который содержит идентификатор родительского узла?

Ранее я использовал View в блоке, используя код, подобный следующему:

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

Однако в другом блоке я хочу выполнить некоторую логику на основе значений, найденных в представлении. Вы можете догадаться, что бизнес-логика основана на моем последнем требовании: я хочу, чтобы блок кода, поддерживающий представление ('Children'), вызывался несколько раз. Поскольку я перебираю результаты набора данных представления, я хочу рекурсивно перебирать дочерние узлы, запрашивающие их потомков.


Ваш подход выглядит хорошо. Если вы поставите его в ответ, люди могут проголосовать за него и одобрить. Одна вещь, которую вы можете попробовать, это вместо того, чтобы каждый раз отключать вид. Сделайте $ view-> clone_view () до выполнения. Загрузка просмотра довольно тяжелая, и это может помочь памяти и производительности.
Джереми Френч

Прошу прощения, если я не здесь, но разве это то, чего вы можете достичь, используя отношения и группировку по полю в родительской таблице? Я не уверен, что вам нужно прибегать к коду еще. Также может быть проще вызвать подпредставление и логику из переопределения родительского шаблона.
Джейсон Смит

Вы должны рассмотреть foreach вместо for (.. sizeof ()), он работает намного лучше (потому что это C вместо PHP).
Беркес

Стоит отметить, что вместо того, чтобы делать if (arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2)), лучше использовать if ($node = menu_get_object()).
Крис Плиакас

Я урезал ответ от вопроса и отправил его как ответ. Таким образом, пользователям сайта будет понятнее, что на этот вопрос есть ответ.
Джереми Френч

Ответы:


2

Немного поигравшись с Views, я, кажется, выработал подход. Однако я хотел бы оставить свой вопрос открытым для других ответов и лучших решений.

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

Ключ к выполнению представления несколько раз был для меня неустановленным ($ view), когда я закончил с набором результатов.


1

Я получил хороший пробег от следующей функции. Возвращаемое значение представляет собой массив всех записей представления. Вызов dsm ($ return_value) даст вам хорошее представление о структуре вашего конкретного представления.

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

Вот вспомогательная функция, уже встроенная в Drupal API. (Я провел некоторое время в Drupal Docs и в конце концов нашел его. Кажется, многие другие также создали решения, которые не используют этот помощник, а также что этот помощник делает один интересный шаг, которого нет в других решениях .. . вызвать pre_render для объекта $ view перед выполнением).

Я не могу поручиться за то, хорошо ли это работает или нет, но, по крайней мере, это определенное место, чтобы выявить проблемы с этими подходами.

Для D6 http://api.drupal.org/api/views/views.module/function/views_get_view_result/6

И для D7 http://api.drupal.org/api/views/views.module/function/views_get_view_result/7

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.