Який програмний спосіб найкраще повторити результати перегляду?


12

З огляду на "Діти" (з двома полями: child_node_id та birth_order_value), що є найкращим програмним способом перетворення результатів перегляду, встановлених display_id 'default' та аргументом, що містить ідентифікатор батьківського вузла?

Раніше я використовував Перегляд у блоці, використовуючи код, аналогічний наступному:

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

Однак в іншому блоці я хочу виконати певну логіку на основі значень, знайдених у поданні. Можливо, ви можете здогадатися, що бізнес-логіка базується на моїй остаточній вимозі: я хочу, щоб блок коду, що підтримує погляд ("Діти"), називався кілька разів. Коли я повторюю результати результатів набору даних, я хочу рекурсивно повторювати запити дочірніх вузлів для своїх дітей.


Ваш підхід виглядає нормально. Якщо ви поставите це у відповідь, люди можуть проголосувати за неї та затвердити. Ви можете спробувати одне, а не скасувати перегляд кожного разу. Перед виконанням виконайте $ view-> clone_view (). Завантаження перегляду досить важка, і це може допомогти пам’яті та продуктивності.
Джеремі Френч

Вибачте, якщо я тут не базуюсь, але це така річ, яку ви можете досягти, використовуючи зв'язки та групуючи по полі батьківської таблиці. Я не впевнений, що потрібно ще вдаватися до коду. Також може бути більш простим виклик субперегляду та логіки з батьківського шаблону, що перекриває.
Джейсон Сміт

Вам слід розглянути foreach замість for (.. sizeof ()), він працює набагато краще (тому що це C замість PHP).
berkes

Варто відзначити одне, а не робити if (arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2))це, можливо, краще використовувати if ($node = menu_get_object()).
Кріс Плякас

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

Відповіді:


2

Трохи погравши з Поглядами, я, здається, розробив підхід. Однак я хотів би залишити своє питання відкритим для інших відповідей та кращих рішень.

<?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

Ось допоміжна функція, вже вбудована в API Drupal. (Я провів деякий час, розмовляючи в Документах Друпала, і врешті-решт знайшов це. Здається, багато інших також створили рішення, які не використовують цей помічник, а також, що цей помічник робить один цікавий крок, який інші рішення не роблять .. для виклику 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.