Вы здесь

Изменить items_per_page в views на специфичной странице pager(а)

0

суть задачи

идет блок из 4 элементов, 3 из них это строки views, 4й это рекламный блок который прописан в шаблоне.

под ним идет пагинация views_load_more + ajax.

задача: в первом блоке показываем 3 строки views + 1 фальш элемент (http://c2n.me/3sx5ga1), сделано через темизацию формата.
при нажатии на load more, показываем 4 (ЧЕТЫРЕ) следующих элемента.

то есть, загвоздка в том чтобы изменить в views количество items_per_page на лету.

есть у кого то умные мысли или наработки?

спасибо

Версия Drupal: 
7.x
Категория: 
AJAX
Связанные проекты: 
Views
Вопрос задан 04.01.2016 - 18:30

Непонятно, зачем менять items_per_page..
Если для темизации (управления положением "блоков" на странице), то перепешите шаблон вывода..

А возможно, можно обойтись совсем без "костылей", создав для "рекламного" блока отдельный тип материала и добавив в его вывод в вьюс..
Осталось бы только сделать "хитрую" сортировку, чтобы рекламные материалы "правильно" располагались между "простыми" материалами.

Комментарий оставлен 04.01.2016 - 22:01

еще раз
http://c2n.me/3sxF1Lm
стрелкой отмечен "лишний" блок.

  1. переопределение шаблона, не затронет pager, который мне нужен
  2. views выводит по 4 блока на страницу. то есть я не могу сначала вывести 5, а потом добавлять по 4.
  3. на первой странице, нужно заменить 3й блок на рекламный, после чего сдвинуть все остальные вниз. то есть, третий, становится четвертым и т.п.
  4. с трудом представляю себе как можно при сортировке по дате создания, запихнуть запросом строку на определенное место
Комментарий оставлен 04.01.2016 - 22:54

Может, зайти с другой стороны.
1. Сделать вложение перед вьювом ( 3 материала + реклама )
2. Первую страницу вьюва (с offset 3; 4 строки на страницу) скрыть и вывести кнопку "Показать еще", такую же, как сделал бы модуль views_load_more
3. По нажатию на кнопку "Показать еще", отобразить первую страницу, с тем же эффектом, как у модуля. Кнопку скрыть.
4. Дальше, листать страницы модулем.

Комментарий оставлен 05.01.2016 - 23:26

Ответы

1

Попробуйте примерно так...

function MYMODULE_views_pre_build(&$view) {
  if ($view->name == 'my_view') {
    // The view normally has 4 items per page, put 3 for the first page..
    if (!isset($_GET['page']) || $_GET['page'] <= 0) {
      $view->items_per_page = 3;
    }
    else {
      $view->offset = -1;
    }
  }
}
Ответ дан 06.01.2016 - 00:38
0
/**
 * Implements hook_views_pre_view(). 
 */
function mymodule_views_pre_view(&$view, &$display_id, &$args)  {
    if ($view->name == 'my_special_view' && $display_id == 'public_display') {
        if (!empty($view->query->pager->current_page)) {
            $view->set_items_per_page($number);
        }
    }
}
Ответ дан 04.01.2016 - 19:28

я уже все перепробовал.

проблема любого из этих хуков в том, что они переопределяют views разово, то есть. нельзя перестративать pager в зависимости от условий

Комментарий оставлен 05.01.2016 - 00:18
0

Используйте препроцесс-хук HOOK_preprocess_pager(&$variables)

Ответ дан 05.01.2016 - 00:42

извините, но, какое отношение имеет темизация pager к поставленной мной задаче?

плюс, не припомню такого хука.

Комментарий оставлен 05.01.2016 - 01:12

"извините, но, какое отношение имеет темизация pager к поставленной мной задаче? "

"переопределение шаблона, не затронет pager, который мне нужен"

"плюс, не припомню такого хука. "

Вызывается в функции theme (process и preprocess хуки)

Вот и я не пойму, зачем вам items_per_page...

Как я понял, надо всего лишь добавить "строку" в выводе вьюса..
тут (или в подобном шаблоне) это легко делается: https://api.drupal.org/api/views/theme!views-view-unformatted.tpl.php/7

Комментарий оставлен 05.01.2016 - 06:57

Вы меня не поняли. еще раз.

views выводит по 4 элемента на страницу. на каждую страницу пагинатора.

если добавить еще одну строку через темизацию, получится 5 элементов на первой странице пагинатора. что поломает верстку.

поэтому, мне нужно сделать так, чтобы на ПЕРВОЙ странице пагинатора выводилось 3 элемента (плюс 1 мой кастамный). а на всех остальных, выводилось по 4 элемента.

Комментарий оставлен 05.01.2016 - 10:15

Немного понятнее-)
Ну тогда Вам просто на "первой" странице надо подкорректировать запрос (limit, или как он там называется, "отладка" покажет),
скорее всего хуком hook_views_query_alter
Проверяете параметры запроса (GET или POST), если это первая страница - уменьшаете limit на единицу.

Описание хуков views в папке модуля views, файл views.api.php

Комментарий оставлен 05.01.2016 - 10:25

Или такой лайфхак:
Добавляете материал с датой создания-изменения на 1000 лет вперед(или назад, в зависимости от направления сортировки).

Он у Вас будет всегда ПЕРВЫМ на странице.
Вот вместо него в шаблоне и подставляйте свою рекламу-)

Комментарий оставлен 05.01.2016 - 10:41

вот тут то и загвоздка.

я перепробовал уже все возможные views хуки, проблема в том, что НЕЛЬЗЯ менять items_per_page,offset, pages и т.п. в одной вьюхе несколько раз.

то есть, примеры

http://c2n.me/3sycjR8. добавляет строку, не не перезаписывает pager
http://c2n.me/3sycmyQ, перезаписывает количество позиций глобально, для всей вьюхи.

попробую через query_alter, но мне кажется что будет то же самое. ведь запрос то делается разово, а потом уже views его разбивает на страницы.

Комментарий оставлен 05.01.2016 - 10:49

Добавляете материал с датой создания-изменения на 1000 лет вперед(или назад, в зависимости от направления сортировки).>

думал про это. только согласно тз, реклама должна быть на третьем месте. )

Комментарий оставлен 05.01.2016 - 11:01

В шаблоне вьюса расстанавливаете строки в нужном порядке, и все..

Кстати.. Да.. Кол-во элементов на страницу в запросе наверное менять нельзя, а вот offset полюбому можно..

На перной странице вьюса заменяете последний материал рекламой... а на второй странице уменьшаете offset на единицу, чтобы "пропущеный" материал попал в выборку.

Комментарий оставлен 05.01.2016 - 12:23