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


13

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

回答:


18

使用するビューフック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用に書かれています。

お役に立てれば。


素晴らしいありがとう。私はまだモジュール開発の経験はありませんが、私が成し遂げたいいくつかのことから始めています。PHPを実際に把握しているので、上で貼り付けたコードチャンクで何が起こっているのかを追跡できます。これは私に大いに役立つと思います。ありがとうございました。
ジェイ

1
ビュー3.xの場合、関連するコードを$view->items_per_page = $pager_count;
stevenw00に

各ページのオフセットを動的に設定することは可能ですか?
shekoufeh

2

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のコード例を使用します。


1

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

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

「preprocess」はテーマ設定用で、pre_renderは遅すぎます(クエリはすでに実行されています)-pre_buildフックの方がはるかに優れています。
mojzis

1

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

これは動作するはずです!! ;)


優秀な!クエリによって返されるアイテムに応じて、特定のページのアイテム数を制限したかったのです。このメソッドをできるだけ早くチェックしてください。
イェンス

正確に機能しません。放電する行は、次のページには表示されません。そのため、コンテンツが欠落します。さらに調査が必要です。
イェンス

0

@tanmaykのコードが私にとってはうまくいきました。hook_views_pre_renderにこれらの2行のコードだけを追加しました

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

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

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