回答:
使用するビューフック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用に書かれています。
お役に立てれば。
$view->items_per_page = $pager_count;
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のコード例を使用します。
ビューの前処理機能を使用する必要があります
/*
* Implementation of hook_views_pre_render().
*/
function MYMODULE_views_pre_render(&$view){
// $view->name
// $view->current_display
// ...
// look for other variables in $view object
}
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;
}
}
これは動作するはずです!! ;)