web-dev-qa-db-ja.com

ビューのページャー設定を動的に設定することは可能ですか?

たとえば、特定のノードタイプを表示したときに表示されるビューがあり、ページャー設定を個々のノードごとに異なるものにしたいとします。 「ページャー設定」のようなCCKフィールドを作成し、x-yの整数オプションを指定することを考えていました。しかし、どういうわけかそのフィールドをビューの設定に動的にプラグインできるかどうかはわかりません。それとも、これを行う別の方法はありますか?

13
Jay

使用するビューフックはhook_views_pre_buildクエリが構築される前に呼び出されます。これは、基本的なモジュール開発経験があり、ビューAPIに精通していることを前提としています。

あなたはできるはずです:

/*
 * Implementation of hook_views_pre_build().
 */
function hook_views_pre_build(&$view) {

  // Make sure this is only for the specific view you want to modified
  if ($view->name == "foo_bar") {

    // Get the x-y value from where you're storing it (in your example the node object).
    $pager_count = get_count_for_this_node();

    // Lets also make sure that this is a number so we won't destroy our view.
    if (is_numeric($pager_count)) {

      // Now lets set the pager item to what ever out count is.
      $view->pager['items_per_page'] = $pager_count;
    }
  }
}

上記では、ビュークエリがページャーなどの方法で構築される前に呼び出されるビューフックを使用しており、その他すべてに変更が反映されます。

注意:ビューのフックは、何が起こっているのかを理解している場合にのみ使用してください。上記のコードは、views-2.x用に書かれています。

お役に立てれば。

18
ericduran

Drupal 7の場合、次のように書くだけです。

$view->items_per_page = $pager_count;

例では:

/**
 * Implements hook_views_pre_build().
 */
function module_name_views_pre_build(&$view) {
  if ($view->name == "foo_bar" && $view->current_display == 'foo_display') {
    $pager_count = get_count_for_this_node();
    if (is_numeric($pager_count)) {
      $view->items_per_page = $pager_count;
    }
  }
}

@ericduranのコード例を使用します。

2
heilop

Hook_views_pre_renderでビューの結果とページャーを更新するには、次のようにします。

<?php

/**
 * Implementation of hook_views_pre_render().
 */
function MODULENAME_views_pre_render(&$view) {
  if ($view->name == 'my_view' && $view->current_display == 'my_display') {
    // View result update logic.
    // e.g.
    // $result = array();
    // foreach ($view->result as $k => $row) {
    //   if (whatever is your condition) {
    //     $result[$k] = $row;
    //   }
    // }

    // Assuming $result has data as per your logic.
    // Update the pager according to result.
    $view->query->pager->total_items = count($result);
    $view->query->pager->update_page_info();
    // Add results to view.
    $view->result = $result;
  }
}

これはうまくいくはずです!! ;)

1
tanmayk

ビューの前処理機能を使用する必要があります

/*
 * Implementation of hook_views_pre_render().
 */
function MYMODULE_views_pre_render(&$view){
  // $view->name
  // $view->current_display
  // ...
  // look for other variables in $view object
}
1
dobeerman

@tanmaykのコードが私にとってはトリックでした。 hook_views_pre_renderに次の2行のコードだけを追加しました

$view->query->pager->total_items = $nr;
$view->query->pager->update_page_info();

しかし、ビューに結果を追加する必要はありませんでした。

0
adevms