Можно ли динамически устанавливать настройки пейджера Views?


13

Например, у вас есть представление, которое отображается при просмотре определенного типа узла, но вы хотите, чтобы настройки пейджера были разными для каждого отдельного узла. Я думал о создании поля CCK наподобие «настройки пейджера», а затем дал ему целочисленную опцию xy. Но я не знаю, возможно ли как-то динамически подключить это поле к настройкам Views. Или есть другой способ сделать это, может быть?

Ответы:


18

Хук представлений, который вы хотели бы использовать, hook_views_pre_buildвызывается перед построением запроса. Теперь предполагается, что у вас есть некоторый базовый опыт разработки модулей и вы знакомы с API-интерфейсом views.

Вы должны быть в состоянии сделать:

/*
 * 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
Для Views 3.x соответствующий код должен быть изменен на$view->items_per_page = $pager_count;
stevenw00

Можно ли динамически устанавливать смещение каждой страницы?
Shekoufeh

2

Для Drupal 7, Only следует написать следующее:

$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

Вы должны использовать функцию представления preprocess

/*
 * 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 намного лучше.
Мойзис

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();

Но мне не нужно было добавлять результаты в представление.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.