ビューの結果を反復処理するための、プログラムによる最適な方法は何ですか?


12

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

ただし、別のブロックでは、ビューで見つかった値に基づいていくつかのロジックを実行します。私の最終要件に基づいたビジネスロジックを推測できるかもしれません。ビューをサポートするコードブロック(「子」)を複数回呼び出す必要があります。ビューデータセットの結果を反復処理するときに、子ノードをクエリして子ノードを再帰的に反復処理する必要があります。


あなたのアプローチは大丈夫に見えます。回答に入れると、人々は投票して承認することができます。毎回ビューを設定解除するのではなく、試してみることをお勧めします。実行前に$ view-> clone_view()を実行します。ビューの読み込みは非常に重いため、メモリとパフォーマンスの向上に役立つ可能性があります。
ジェレミーフランス語

私がここに居ない場合はご容赦ください。しかし、これは親テーブルのフィールドでリレーションシップとグループ化を使用して達成できる種類のことです。まだコードに頼る必要があるかどうかはわかりません。親テンプレートのオーバーライドからサブビューとロジックを呼び出す方が簡単な場合もあります。
ジェイソンスミス

foreach for(.. sizeof())の代わりに考慮する必要があります(PHPの代わりにCであるため)。
バーク

注意すべきことの1つは、実行する代わりに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();
      ....
   }
}
?>

ビューを複数回実行する鍵は、結果セットの処理が完了したときにunset($ 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をあちこち探し回っていましたが、最終的にそれを見つけました。他の多くの人もこのヘルパーを使用しないソリューションを生み出しているようです。実行前に$ 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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.