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