pdoArchive — создание архива документов по датам в MODX

pdoArchive Дополнения

Сниппет pdoArchive предназначен для вывода архива документов сайта с автоматической разбивкой на годы, месяцы и дни. Он группирует ресурсы по датам создания, публикации или редактирования, формируя структурированный архив с подсчетом количества материалов в каждом периоде. Основное применение — создание временных архивов для блогов, новостных разделов, статей, объявлений и любого другого датированного контента.

Сниппет автоматически подсчитывает количество публикаций в каждом периоде и выводит их в виде иерархической структуры год/месяц/день. PdoArchive использует все возможности pdoTools включая JOIN операции, сложную фильтрацию и работу с TV-параметрами.

Базовый синтаксис использования

Простейший вызов для вывода архива всех ресурсов:

[[!pdoArchive? &parents=`0` ]]

Архив конкретного раздела:

[[!pdoArchive? &parents=`5` ]]

Архив с сортировкой по дате публикации:

[[!pdoArchive? &parents=`10` &dateField=`publishedon` &sortby=`publishedon` ]]

Вызов с пагинацией через pdoPage:

[[!pdoPage? &element=`pdoArchive` &parents=`5` &limit=`20` ]] [[!+page.nav]]

Параметры

PdoArchive принимает все общие параметры pdoTools и добавляет специфичные для работы с датами.

Параметр Значение по умолчанию Описание
&dateField createdon Поле даты для группировки: createdon, publishedon, editedon
&dateFormat %H:%M Формат даты для функции strftime()
&tpl Чанк для оформления документа
&tplYear Обертка для группы года с плейсхолдерами [[+year]], [[+count]], [[+wrapper]]
&tplMonth Обертка для группы месяца с плейсхолдерами [[+month]], [[+month_name]], [[+year]]
&tplDay Обертка для группы дня с плейсхолдерами [[+day]], [[+month]], [[+year]]
&tplWrapper Общая обертка архива с плейсхолдером [[+output]]
&wrapIfEmpty 0 Выводить обертку при пустых результатах
&sortby createdon Поле для сортировки документов
&sortdir DESC Направление сортировки
&limit 0 Ограничение количества результатов
&offset 0 Смещение от начала выборки
&depth 10 Глубина поиска дочерних ресурсов
&parents текущий Родительские контейнеры для выборки
&resources Конкретные ID ресурсов
&context текущий Контексты для выборки
&where Дополнительные условия SQL
&showHidden 1 Включать скрытые ресурсы
&showUnpublished 0 Включать неопубликованные
&showDeleted 0 Включать удаленные
&hideContainers 0 Исключить контейнеры
&includeTVs TV-параметры для включения
&prepareTVs 1 Подготовить указанные TV
&processTVs Обработать указанные TV
&tvPrefix tv. Префикс для TV-параметров
&scheme Схема генерации ссылок
&useWeblinkUrl 1 Учитывать тип ресурса в ссылках
&outputSeparator \n Разделитель результатов
&toPlaceholder Сохранить в плейсхолдер
&totalVar total Плейсхолдер для общего количества
&showLog 0 Показать отладочную информацию

Параметр &dateField

Параметр &dateField определяет какое поле использовать для группировки по датам.

Группировка по дате создания (по умолчанию):

[[!pdoArchive? &parents=`5` &dateField=`createdon`]]

Группировка по дате публикации:

[[!pdoArchive? &parents=`10` &dateField=`publishedon` &sortby=`publishedon`]]

Группировка по дате последнего редактирования:

[[!pdoArchive? &parents=`15` &dateField=`editedon` &sortby=`editedon`]]

Важно чтобы параметры &dateField и &sortby совпадали для корректной работы.

Шаблоны оформления архива

PdoArchive использует иерархическую систему шаблонов для разных уровней группировки.

Шаблон года — &tplYear

Параметр &tplYear определяет обертку для группы материалов одного года:

[[!pdoArchive? &parents=`5` &tplYear=`@INLINE <h3>[[+year]] <sup>([[+count]])</sup></h3><ul>[[+wrapper]]</ul>`]]

Доступные плейсхолдеры в tplYear:

  • [[+year]] — год (например 2026)
  • [[+count]] — количество документов за год
  • [[+wrapper]] — содержимое месяцев внутри года

Шаблон месяца — &tplMonth

Параметр &tplMonth задает обертку для группы материалов одного месяца:

[[!pdoArchive? &parents=`5` &tplMonth=`@INLINE <li><h4>[[+month_name]] <sup>([[+count]])</sup></h4><ul>[[+wrapper]]</ul></li>`]]

Доступные плейсхолдеры в tplMonth:

  • [[+month]] — номер месяца (1-12)
  • [[+month_name]] — название месяца (Январь, Февраль…)
  • [[+year]] — год
  • [[+count]] — количество документов за месяц
  • [[+wrapper]] — содержимое дней внутри месяца

Шаблон дня — &tplDay

Параметр &tplDay определяет обертку для группы материалов одного дня:

[[!pdoArchive? &parents=`5` &tplDay=`@INLINE <li><h5>[[+day]] <sup>([[+count]])</sup></h5><ul>[[+wrapper]]</ul></li>`]]

Доступные плейсхолдеры в tplDay:

  • [[+day]] — день месяца (1-31)
  • [[+month]] — номер месяца
  • [[+month_name]] — название месяца
  • [[+year]] — год
  • [[+count]] — количество документов за день
  • [[+wrapper]] — список документов дня

Шаблон документа — &tpl

Параметр &tpl задает шаблон для вывода отдельного документа:

[[!pdoArchive? &parents=`5` &tpl=`@INLINE <li>[[+date]] <a href="[[+link]]">[[+menutitle]]</a></li>`]]

Доступные плейсхолдеры в tpl — все стандартные поля ресурса:

  • [[+id]], [[+pagetitle]], [[+menutitle]], [[+longtitle]]
  • [[+link]] — ссылка на документ
  • [[+date]] — отформатированная дата
  • [[+createdon]], [[+publishedon]], [[+editedon]]
  • Любые TV-параметры указанные в &includeTVs

Общая обертка — &tplWrapper

Параметр &tplWrapper оборачивает весь архив:

[[!pdoArchive? &parents=`5` &tplWrapper=`@INLINE <div class="archive">[[+output]]</div>`]]

Единственный плейсхолдер: [[+output]] — весь контент архива.

Скрытие уровней иерархии

Чтобы убрать вывод года, месяца или дня, укажите соответствующий шаблон пустым.

Архив без группировки по годам:

[[!pdoArchive?
&parents=`5`
&tplYear=``
&tplMonth=`@INLINE <h4>[[+month_name]] [[+year]] <sup>([[+count]])</sup></h4><ul>[[+wrapper]]</ul>`
&tpl=`@INLINE <li>[[+date]] <a href="[[+link]]">[[+menutitle]]</a></li>`
]]

Архив только по месяцам (без дней):

[[!pdoArchive?
&parents=`5`
&tplDay=``
&tplMonth=`@INLINE <h4>[[+month_name]] [[+year]] <sup>([[+count]])</sup></h4><ul>[[+wrapper]]</ul>`
&tpl=`@INLINE <li><a href="[[+link]]">[[+menutitle]]</a></li>`
]]

Плоский список без группировки:

[[!pdoArchive?
&parents=`5`
&tplYear=``
&tplMonth=``
&tplDay=``
&tpl=`@INLINE <li>[[+publishedon:date=`%d.%m.%Y`]] — <a href="[[+link]]">[[+pagetitle]]</a></li>`
]]

Форматирование дат

Параметр &dateFormat определяет формат даты для плейсхолдера [[+date]].

Формат по умолчанию — время:

[[!pdoArchive? &parents=`5` &dateFormat=`%H:%M`]]

Полная дата и время:

[[!pdoArchive? &parents=`5` &dateFormat=`%d.%m.%Y %H:%M`]]

Только дата:

[[!pdoArchive? &parents=`5` &dateFormat=`%d %B %Y`]]

Использование русских названий месяцев:

[[!pdoArchive? &parents=`5` &dateFormat=`%e %B %Y года`]]

Формат strftime поддерживает следующие спецификаторы:

  • %d — день месяца (01-31)
  • %m — месяц числом (01-12)
  • %Y — год четырьмя цифрами
  • %y — год двумя цифрами
  • %H — час (00-23)
  • %M — минуты (00-59)
  • %B — полное название месяца
  • %b — сокращенное название месяца

Базовый пример архива блога

Простой архив статей блога с группировкой по месяцам:

[[!pdoArchive?
&parents=`[[++blog_id]]`
&dateField=`publishedon`
&sortby=`publishedon`
&sortdir=`DESC`
&limit=`500`
&tplYear=`@INLINE <div class="year-block"><h2>[[+year]]</h2>[[+wrapper]]</div>`
&tplMonth=`@INLINE 
<div class="month-block">
  <h3>[[+month_name]] [[+year]] <span class="badge">[[+count]]</span></h3>
  <ul class="posts-list">[[+wrapper]]</ul>
</div>`
&tplDay=``
&tpl=`@INLINE 
<li class="post-item">
  <span class="post-date">[[+publishedon:date=`%d.%m`]]</span>
  <a href="[[+uri]]">[[+pagetitle]]</a>
</li>`
]]

Архив новостей с группировкой по дням

Подробный архив с разбивкой до дней:

[[!pdoArchive?
&parents=`10`
&dateField=`publishedon`
&sortby=`publishedon`
&sortdir=`DESC`
&limit=`1000`
&tplYear=`@INLINE <h2 class="archive-year">[[+year]] год</h2>[[+wrapper]]`
&tplMonth=`@INLINE 
<div class="archive-month">
  <h3>[[+month_name]] ([[+count]])</h3>
  [[+wrapper]]
</div>`
&tplDay=`@INLINE 
<div class="archive-day">
  <h4>[[+day]] [[+month_name]]</h4>
  <ul>[[+wrapper]]</ul>
</div>`
&tpl=`@INLINE 
<li>
  <time>[[+publishedon:date=`%H:%M`]]</time>
  <a href="[[+uri]]">[[+longtitle:default=`[[+pagetitle]]`]]</a>
</li>`
]]

Архив с пагинацией

Использование pdoPage для разбивки большого архива на страницы:

[[!pdoPage?
&element=`pdoArchive`
&parents=`5`
&limit=`50`
&dateField=`publishedon`
&sortby=`publishedon`
&sortdir=`DESC`
&tplYear=``
&tplMonth=`@INLINE <h3>[[+month_name]] [[+year]] ([[+count]])</h3><ul>[[+wrapper]]</ul>`
&tpl=`@INLINE <li>[[+date]] <a href="[[+uri]]">[[+pagetitle]]</a></li>`
]]

<div class="pagination">
  [[!+page.nav]]
</div>

Фильтрация по шаблонам и классам

Архив только определенного типа ресурсов:

[[!pdoArchive?
&parents=`0`
&templates=`5,7`
&dateField=`publishedon`
&sortby=`publishedon`
]]

Работа с TV-параметрами

Вывод TV в архиве:

[[!pdoArchive?
&parents=`5`
&includeTVs=`thumbnail,author_name`
&tvPrefix=``
&dateField=`publishedon`
&sortby=`publishedon`
&tpl=`@INLINE 
<li class="archive-item">
  <img src="[[+thumbnail:pthumb=`w=50&h=50&zc=1`]]" alt="[[+pagetitle]]">
  <div>
    <a href="[[+uri]]">[[+pagetitle]]</a>
    <small>Автор: [[+author_name]]</small>
  </div>
</li>`
]]

Вызов через Fenom

Использование шаблонизатора Fenom для более чистого синтаксиса:

{'!pdoArchive' | snippet : [
'parents' => '5',
'dateField' => 'publishedon',
'sortby' => 'publishedon',
'sortdir' => 'DESC',
'limit' => '500',
'tplYear' => '@INLINE <h2>{$year}</h2>{$wrapper}',
'tplMonth' => '@INLINE <h3>{$month_name} {$year} ({$count})</h3><ul>{$wrapper}</ul>',
'tpl' => '@INLINE <li><a href="{$uri}">{$pagetitle}</a></li>'
]}

Оптимизация для больших архивов

Для архивов с тысячами материалов используйте параметры оптимизации:

[[!pdoArchive?
&parents=`0`
&limit=`1000`
&maxLimit=`1000`
&scheme=`uri`
&includeContent=`0`
&dateField=`publishedon`
&sortby=`publishedon`
]]

Параметры оптимизации:

  • &scheme=uri — быстрая генерация ссылок через поле uri
  • &includeContent=0 — не выбирать поле content
  • &maxLimit=1000 — увеличить лимит для pdoPage
  • Кешировать вызов если архив статический

Стилизация архива

CSS для базового оформления архива:

.archive { padding: 20px 0; } .year-block { margin-bottom: 40px; } .year-block h2 { font-size: 32px; border-bottom: 2px solid #333; padding-bottom: 10px; margin-bottom: 20px; } .month-block { margin-bottom: 30px; } .month-block h3 { font-size: 24px; color: #555; margin-bottom: 15px; } .month-block .badge { background: #0066cc; color: white; padding: 2px 8px; border-radius: 12px; font-size: 14px; margin-left: 10px; } .posts-list { list-style: none; padding: 0; } .post-item { padding: 8px 0; border-bottom: 1px solid #eee; display: flex; gap: 15px; } .post-date { color: #999; min-width: 50px; } .post-item a { color: #333; text-decoration: none; } .post-item a:hover { color: #0066cc; }

Оцените статью
MODX 3
Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.