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


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

 13
Author: Jay, 2011-03-29

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.

Надеюсь, это поможет.

 18
Author: ericduran, 2016-09-06 18:55:10

Для 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
Author: heilop, 2013-05-10 19:20:55

Вам следует использовать функцию предварительной обработки представлений

/*
 * 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
Author: dobeerman, 2011-03-29 11:46:22

Чтобы обновить результат просмотра и пейджер в 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
Author: tanmayk, 2013-03-26 12:29:33

Код @tanmayk сделал это за меня. В hook_views_pre_render добавлены только эти 2 строки кода

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

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

 0
Author: adevms, 2013-09-18 07:39:56