Как исключить первые посты из виджета
Можно сделать так:как при добавлении виджета "Список контента" исключить из вывода заданное число первых постов?
1. В нужном типе контента создаете набор с системным именем, например, cutted. С сортировкой по дате по убыванию.
2. B phpmyadmin находите ваш новый набор и исправляете или добавляете индекс dataset_cutted.
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;
}
Да, что-то с категориями не проверил.
Ну сейчас посмотрю в чем дело...
=====================================
Надо изменить содержание хука на такое:
<?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)
вот мой хук:
<?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 оставил, интересно просто почему))
strpos($model->index_action, 'cutted')
Так вот это означает "если в модели есть индекс, в котором есть слово cutted.
И в cutted2 это слово тоже есть!
Назовите как-нибудь по-другому.
1. В нужном типе контента создал набор с системным именем pruning. С сортировкой по дате по убыванию.
2. B phpmyadmin в новом наборе исправил индекс на dataset_pruning.
3. В виджете поставил применить фильтр из набора — выбрал этот набор.
4. Добавил новый хук content_list_pruning такого содержания:
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 в начале добавляем счетчик и проверку с декрементом.
<?php if ($items){ $backcounter=3; ?> <div class="widget_content_list"> <?php foreach($items as $item) { if ($backcounter-- >0) continue;
Сколько Вы уже таких хуков сделали для разных виджетов?
Сведите их все в один. То есть
if (strpos($model->index_action, 'pruning') || strpos($model->index_action, 'cutted')) и т.д.
Чтобы при любом из нужных индексов срабатывало.
Или сделайте, как Sonat советует. Это проще и надежнее.
Кстати, можно править не сам list_basic.tpl.php, а создать его копию — list_basic-3.tpl.php, и править ее.Или сделайте, как Sonat советует. Это проще и надежнее.
Выбирать ее в редакторе в тех местах где пропуск нужен, а где не нужен ставить родной