Как исключить первые посты из виджета

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО InstantCMS 2.X
#1 13 ноября 2017 в 20:45
Добрый день, подскажите как при добавлении виджета "Список контента" исключить из вывода заданное число первых постов? В настройках виджета что-то такого не увидел look
#2 14 ноября 2017 в 12:02

как при добавлении виджета "Список контента" исключить из вывода заданное число первых постов?

greshnik
Можно сделать так:
1. В нужном типе контента создаете набор с системным именем, например, cutted. С сортировкой по дате по убыванию.
2. B phpmyadmin находите ваш новый набор и исправляете или добавляете индекс dataset_cutted.
3. В своем виджете в опциях выставляете применить фильтры из набора — выбираете ваш новый набор.
4. В \system\controllers\content\hooks добавляете новый хук content_list_filter такого содержания:
  1. <?php
  2.  
  3. class onContentContentListFilter extends cmsAction {
  4.  
  5. public function run($data){
  6.  
  7. list($ctype, $model) = $data; /*Разворачиваем входящий массив*/
  8.  
  9. if (strpos($model->index_action, 'cutted')){ /* Если в модели есть нужный индекс*/
  10.  
  11. $max = $model->getMax('con_'.$ctype['name'], 'id'); /* Находим максимальный номер контента */
  12.  
  13. $model->filterLt('id', $max - 3); /* Обрезаем все, что больше максимума минус три */
  14.  
  15. }
  16.  
  17. return array($ctype, $model);
  18.  
  19. }
  20.  
  21. }
5. Дописываете content_list_filter в файле \system\controllers\content\manifest.php
6. В панели управления Компоненты — Управление событиями — Обновить события.
Всё. Должно обрезать три первых материала. Если нужно другое количество — исправить в хуке.
#3 14 ноября 2017 в 12:29
Если количество постов пропуска не ток много, то есть более топорный способ:
в админке настроить вывод на X постов больше, а в css виджета прописать
nth-child(-n+ X) {
display: none;
}
#4 14 ноября 2017 в 17:55
Интересно почему этого нет в самой CMS? По моему это обычная практика для размещения для тех же новостей на главной
#5 14 ноября 2017 в 18:15
Ris, молодец! Но есть одно но...greshnik смотрите естли вы задаете такой вопрос то говорите и зачем, есть масса возможностей штатно сделать это. Как говорит ув. letsgo!
#6 14 ноября 2017 в 18:34
Ris, после всех манипуляций в виджете все заработало, но когда открываешь категорию задействованную в наборе, вываливается такое:
Что я не так сделал, не подскажешь?
#7 14 ноября 2017 в 18:40
Алексей Тимофеев, допустим я на главной вывожу последние 3 записи из раздела "Новости" в виджете вверху сайта, потом ниже на этой же странице я хочу сделать ленту новостей из раздела "Новости", но уже без первых трех, которые я уже выводил. Те грубо говоря, зачем чтоб условно три первые записи дублировались и там и там
#8 14 ноября 2017 в 20:29
greshnik,
Да, что-то с категориями не проверил.
Ну сейчас посмотрю в чем дело...
=====================================
Надо изменить содержание хука на такое:
  1. <?php
  2.  
  3. class onContentContentListFilter extends cmsAction {
  4.  
  5. public function run($data){
  6.  
  7. list($ctype, $model) = $data; /*Разворачиваем входящий массив*/
  8.  
  9. if (strpos($model->index_action, 'cutted')){ /* Если в модели есть нужный индекс*/
  10.  
  11. $max = $this->model->getMax('con_'.$ctype['name'], 'id'); /* Находим максимальный номер контента */
  12.  
  13. $model->filterLt('id', $max - 3); /* Обрезаем все, что больше максимума минус три */
  14.  
  15. }
  16.  
  17. return array($ctype, $model);
  18.  
  19. }
  20.  
  21. }
А в phpmyadmin выполнить
  1. ALTER TABLE cms_con_articles ADD INDEX dataset_cutted (date_pub)
#9 14 ноября 2017 в 22:12
Ris, спасибо, вроде то что надо
#10 15 ноября 2017 в 21:12
Ris, подскажите, пожалуйста, делаю второй виджет по аналогии, только везде меняю cutted на cutted2, но срабатывает только первый хук, где я косячу?
вот мой хук:
  1. <?php
  2.  
  3. class onContentContentListFilter2 extends cmsAction {
  4.  
  5. public function run($data){
  6.  
  7. list($ctype, $model) = $data; /*Разворачиваем входящий массив*/
  8.  
  9. if (strpos($model->index_action, 'cutted2')){ /* Если в модели есть нужный индекс*/
  10.  
  11. $max = $this->model->getMax('con_'.$ctype['name'], 'id'); /* Находим максимальный номер контента */
  12.  
  13. $model->filterLt('id', $max - 3); /* Обрезаем все, что больше максимума минус три */
  14.  
  15. }
  16.  
  17. return array($ctype, $model);
  18.  
  19. }
  20.  
  21. }
в manifest.php content_list_filter2 дописал, в БД на dataset_cutted поменял

И еще вопрос, почему я ставлю $model->filterLt('id', $max — 2);, а обрезает 3 записи? ну понятно что я -2 оставил, интересно просто почему))
#11 15 ноября 2017 в 21:42
В первом хуке есть такая строка:
strpos($model->index_action, 'cutted')
Так вот это означает "если в модели есть индекс, в котором есть слово cutted.
И в cutted2 это слово тоже есть!
Назовите как-нибудь по-другому. smile
#12 28 ноября 2017 в 23:43
Ris, взгляните, пожалуйста, Вашим опытным глазом, что не так?

1. В нужном типе контента создал набор с системным именем pruning. С сортировкой по дате по убыванию.
2. B phpmyadmin в новом наборе исправил индекс на dataset_pruning.
3. В виджете поставил применить фильтр из набора — выбрал этот набор.
4. Добавил новый хук content_list_pruning такого содержания:
<?php

class onContentContentListFilter extends cmsAction {

public function run($data){

list($ctype, $model) = $data; /*Разворачиваем входящий массив*/

if (strpos($model->index_action, 'pruning')){ /* Если в модели есть нужный индекс*/

$max = $this->model->getMax('con_'.$ctype['name'], 'id'); /* Находим максимальный номер контента */

$model->filterLt('id', $max — 3); /* Обрезаем все, что больше максимума минус три */

}

return array($ctype, $model);

}

}
5. В phpmyadmin выполнил ALTER TABLE cms_con_articles ADD INDEX dataset_pruning (date_pub)
6. Добавил content_list_pruning в файл \system\controllers\content\manifest.php
7. В панели управления Компоненты — Управление событиями — Обновил события.

Сделал так для второй обрезки, вроде все верно, но почему-то не работает?
#13 29 ноября 2017 в 03:03
Зачем так все усложнять? Хуки, наборы, индексы shock

Надо пропустить 3 новости и все!?

Задача решается двумя строчками в шаблоне виджета.
В list_basic.tpl.php в начале добавляем счетчик и проверку с декрементом.
  1. <?php if ($items){ $backcounter=3; ?>
  2.  
  3. <div class="widget_content_list">
  4. <?php foreach($items as $item) { if ($backcounter-- >0) continue;
Всё!
#14 29 ноября 2017 в 08:17
greshnik,
Сколько Вы уже таких хуков сделали для разных виджетов?
Сведите их все в один. То есть
if (strpos($model->index_action, 'pruning') || strpos($model->index_action, 'cutted')) и т.д.
Чтобы при любом из нужных индексов срабатывало.
Или сделайте, как Sonat советует. Это проще и надежнее.
#15 29 ноября 2017 в 11:01

Или сделайте, как Sonat советует. Это проще и надежнее.

Ris
Кстати, можно править не сам list_basic.tpl.php, а создать его копию — list_basic-3.tpl.php, и править ее.
Выбирать ее в редакторе в тех местах где пропуск нужен, а где не нужен ставить родной smile
Если надо в другом месте пропускать 5, без проблем создадим и выберем шаблон list_basic-5.tpl.php
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.