Можно ли динамически настраивать параметры пейджера просмотров?
Скажем, например, у вас есть представление, которое отображается при просмотре определенного типа узла, но вы хотите, чтобы настройки пейджера были разными для каждого отдельного узла. Я думал о создании поля CCK, такого как "настройка пейджера", а затем дать ему целочисленный параметр x-y. Но я не знаю, возможно ли каким-то образом динамически подключить это поле к настройкам представлений. Или, может быть, есть другой способ сделать это?
5 answers
Крючок представлений, который вы хотели бы использовать, - это 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;
}
}
}
Выше мы используем крюк представлений, который вызывается до того, как запрос представления будет построен таким образом, чтобы пейджер и все остальное отражали изменения.
Предостережение: крючки для просмотра следует использовать только в том случае, если вы понимаете что происходит. Приведенный выше код написан для представлений-2.x.
Надеюсь, это поможет.
Для 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;
}
}
Это должно сработать!!;)
Код @tanmayk сделал это за меня. В hook_views_pre_render добавлены только эти 2 строки кода
$view->query->pager->total_items = $nr;
$view->query->pager->update_page_info();
Но мне не нужно было добавлять результаты в представление.