Создание ленты новостей в CMS MODx с сортировкой по дате
Вопрос создания ленты новостей на сайте достаточно тривиален, но лично я не находил подробного описания по созданию новостей для CMS MODx. Естественно, что наиболее правильным вариантом является использования модуля Ditto, но иногда возникает задача сортировать новости не по дате создания, публикации, положению в меню, а по дате новости. Достаточно часто новости создаются с опозданием и необходимо вставить новость между уже опубликованных новостей или бывает, что дату новости нужно поменять.
О том, как создать ленту новостей с сортировкой по дате, введенной пользователем и пойдет речь.
Для этого нам потребуется модуль Ditto не ниже 2-ой версии (в нем есть параметры, которые отсутствовали в более ранних версиях).
Шаблон для новостей
Создадим шаблон для вывода подробной новости и присоединим к этому шаблону Template Variable.
Ресурсы -> Управление ресурсами-> Вкладка «Шаблоны»->Новый шаблон
По содержанию шаблон будет мало отличаться от шаблона внутренних страниц. Все зависит от желаемого отображения подробной новости.
У меня в шаблоне место под подробную новость (контент) выглядит так:
1 2 3 4 5 6 7 8 | <h2>Новости</h2> <h5>[*pagetitle*]</h5> <span><strong>[[convertDate?MyDate=`[*tvdate*]`]]</strong></span> <div class="content_news"> [*#content*] <br /><br /> <a href="../">Назад к списку новостей</a> </div> |
Пусть шаблон будет называться «Новости». Просто и понятно, а про сниппет convertDate поговорим чуть позже.
Можно вообще не создавать отдельный шаблон для новостей, но в таком случае TV для даты будет присутствовать и в тех документах, где он может и не требоваться.
Template Variable для даты новости
Переходим:
Ресурсы -> Управление ресурсами-> Вкладка «Параметры (TV)»->Новый параметр (TV)
В имени параметра обязательно вводим название date, заголовок заполняем по своему вкусу, тип ввода ставим Date (При выборе даты будет отображаться удобное всплывающее окошко для работы с датой), визуальный компонент обязательно ставим Unixtime (по нему мы и будем сортировать в дальнейшем).
Создание папки для хранения новостей
Создадим документ-каталог, в котором будем хранить наши новости:
Осталось последнее действие в этой части, а именно вывод списка новостей. В месте для контента вводим вызов Ditto следующего содержания.
[[Ditto? &startID=`18` &tpl=`news_list` &sortDir=`DESC` &summarize=`20` &sortBy=`date` ]]
startID - номер документа, откуда будем брать новости (у нас папка «Новости»)
tpl – название чанка для вывода одной новости
sortDir – сортировка по убыванию или возрастанию (у нас по убыванию)
summarize – количество новостей, выводимых на странице
sortBy – сортируем по нашему TV date
Создание новостей
А теперь перейдем собственно к созданию новостей. Создаем дочерний документ для только что созданного документа-каталога «Новости». Для этого нажмем правой кнопкой мыши на иконку возле названия каталога и выберем «Дочерний документ».
В новом созданном документе применим следующие манипуляции:
В поле «Заголовок» вводим название новости- В поле «Аннотация» вводим краткое содержание новости
- в поле «Шаблон» выбираем наш шаблон для новостей «Новости»
- В содержании документа вводим саму новость. Можно добавлять изображения и всячески оформлять в соответствии со стилями сайта.
- В дополнительном поле дату новости через кнопку
Как раз по этому полю и будем сортировать наши новости в списке. - Сохраняем наши изменения
По такому алгоритму и будем и создавать все наши новости. Естественно, не будем забывать, наши новости еще нужно и опубликовывать. Либо при нажатии правой кнопкой мыши на иконку рядом с новостью и выбрав в контекстном меню пункт «Опубликовать», либо при редактировании на вкладке «Настройки страницы» задать время публикации (и время снятия с публикации, если это Вам необходимо).
Создание чанка вывода одной новости в списке
Все зависит от верстки вашего сайта, а я приведу пример своего чанка.
Переходим в раздел Ресурсы -> Управление Ресурсами -> Чанки -> Новый чанк
Даем название чанку, к примеру, news_tpl
Содержание у меня такое:
1 2 3 4 | <div> <span class=”news_title”><a href="/[~[+id+]~]">[+pagetitle+]</a></span><span class=”news_date”> [[convertDate?MyDate=`[+tvdate+]`]]</span><br /> <p>[+introtext+]</p> </div> |
Наибольший интерес здесь, конечно же, представляет строчка [[convertDate?MyDate=`[+tvdate+]`]] . В ней мы вызываем специально написанный сниппет для конвертации даты в более читабельный вид. Параметром MyDate передаем текущую дату новости в списке новостей.
Создание сниппета для новости
Идем Ресурсы –> Управление Ресурсами –> Сниппеты –> Новый Сниппет
Назовем сниппет convertDate и содержание у него такое:
1 2 3 4 5 6 7 | <?php $monthes = array('','января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря'); $day = date("j",$MyDate); $month = $monthes[date("n",$MyDate)]; $year = date("Y",$MyDate); echo $day.' '.$month.' '.$year.' года'; ?> |
Простейший PHP-код по преобразованию даты. Создаем массив названий месяцев в родительном падеже, пропуская при этом нулевой элемент. Далее просто выводим дату в виде строки.
Выглядеть это будет примерно так.
Вот и всё. Список новостей готов. Сюда также можно добавить добавление новостей из разных папок. (если у вас идет деление новостей по разделам), добавив в параметр startID через запятую ID документов-папок с новостями.
Еще можно, а чаще всего даже нужно, создать переход по страницам для вывода новостей, но об этом уже в другой раз.
Ранее это статья публиковалась на хабре и сайте русского сообщества CMS MODx.





