Чи можливо динамічно встановити параметри пейджера Views?


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

Вище ми використовуємо гачок перегляду, який викликається перед тим, як буде побудований запит перегляду, таким чином пейджер та все інше відображатимуть зміни.

Слово обережності: гачки для перегляду слід використовувати лише якщо ви розумієте, що відбувається. Наведений вище код написаний для перегляду-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
}

"попередній процес" призначений для тематизації, і pre_render занадто пізно (його запит вже запустився) - гачок pre_build набагато краще.
— mojzis

1

Щоб оновити результат і пейджер переглядів у програмі_кніги_предмета, можна зробити наступне:

<?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 зробив для мене трюк. У гачку_види_пре_рендер додано саме ці 2 рядки коду

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

Але мені не потрібно було додавати результати до перегляду.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.