Чи можливо динамічно встановити параметри пейджера 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.