web-dev-qa-db-ja.com

プログラムでビューの結果を反復処理する最良の方法は何ですか?

'Children'という名前のビュー(child_node_idとbirth_order_valueの2つのフィールド)が与えられた場合、display_idに 'default'を指定し、引数に親ノードIDを含む引数を指定して、ビューの結果セットを反復処理する最良の方法は何ですか?

以前は、次のようなコードを使用してブロックでビューを使用しました。

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')をサポートするコードのブロックを複数回呼び出したいです。ビューデータセットの結果を反復処理するときに、子ノードのクエリを繰り返して、子を照会します。

12
clsturgeon

ビューをいじくり回すと、アプローチがうまくいったようです。ただし、他の回答やより良い解決策については、質問を開いたままにしたいと思います。

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

ビューを複数回実行するための鍵は、結果セットの処理が完了したときにunset($ view)を実行することでした。

2
Jeremy French

以下の機能でかなりの走行距離を得ました。戻り値は、すべてのビューレコードの配列です。 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
theta-fish

Drupal APIに既に組み込まれているヘルパー関数があります。(Drupalドキュメントでしばらくたたいて、最終的にそれを見つけました。他の多くの人もこのヘルパーを使用しないソリューションを作成しており、このヘルパーは他のソリューションでは実行できない興味深いステップを実行します...実行前に$ viewオブジェクトでpre_renderを呼び出します)。

私はそれがうまく機能するかどうかを保証することはできませんが、少なくともこれらのアプローチの問題を指摘するための特定の場所です。

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

1
Christian Nally