Это перевод статьи Брайана Тимана (Brian Teeman) о доработке модуля Материалы (mod_articles), позволяющей выводить заголовки материалов категории (ий) с группировкой по годам и месяцам.
Благодарю за идейное вдохновение, корректировку и наставничество, при создании статьи, Joomla-разработчика Сергея (WebTolk) Толкачёва.
Шаг 1 - настройка модуля
В административной панели Joomla перейдите в раздел Система → Модули сайта → Создать.
Выберите Материалы (
mod_articles) в качестве типа модуля.-
В настройках создаваемого модуля:
Количество материалов: установите значение 0, чтобы отобразить все материалы.
Категория: выберите какие материалы вы хотите включить для вывода модулем (например: выбрать категории, исключить/включить дочерние категории и т.д.).
Отображение: установите "Список материалов (только заголовки)" = Да.
Сортировка: укажите дату по которой будут отсортированы материалы (например: "Дата начала публикации") и направление сортировки (например: "По убыванию").
Группировка: установите значение параметров "Группировка материалов" = Месяц и год, "Поле для группировки" = например: Дата начала публикации, "Направление группировки" = например: по убыванию.
Выберите для модуля позицию, привяжите к пунктам меню, если это необходимо, сохраните и опубликуйте.
Результат: на странице сайта mod_articles выведет список ваших материалов, сгруппированных по месяцам и годам.

Примечание переводчика:
Из-за особенностей русской локализации Jommla мы видим, что месяца переводятся на русский язык в родительном падеже. Чтобы отобразить месяца в именительном падеже, мною внесены изменения в код файла макета модуля. Подробнее смотрите в конце шага 3
Шаг 2 - группировка по годам
Давайте реализуем вариант, чтобы список материалов был дополнительно разбит по годам. Такой опции нет в настройках модуля, но мы можем добавить небольшой фрагмент PHP-кода для достижения этой цели.
Используя переопределение шаблона вы можете применить свою HTML-верстку при выводе модуля Joomla, без изменения основных файлов, что обеспечит сохранение ваших изменений при обновлениях.
1.Создайте переопределение шаблона модуля.
Перейдите в раздел Система → Шаблоны сайта.
Кликните по активному шаблону.
Перейдите на вкладку Создание переопределений.
Найдите модуль, который мы хотим переопределить (
mod_articles) и нажмите на него. Joomla автоматически создаст копию макета модуля в вашем шаблоне, в папке/templates/template_name/html/mod_articles.
2.Переименуйте переопределенные файлы. Нам нужно переименовать три файла, например: date.php, date_details.php и date_title.php.

3.Обновите настройки модуля, чтобы использовать переопределение.
-
вернитесь в модуль, перейдите на вкладку "Дополнительные параметры" и в параметре "Макет" выберите в раскрывающемся списке переопределенный файл макета модуля.

4.Добавьте PHP-код для группировки по году.
Вернитесь в редактор шаблонов и откройте файл
date.phpдля редактирования.Добавьте следующий код, чтобы разделить дату и сгруппировать ее по году, а затем по месяцу.
<?php
// Группируем материалы по году, а затем по месяцу.
$groupedByYear = [];
foreach ($list as $groupName => $items) {
// Разделим название группы на месяц и год.
[$month, $year] = explode(' ', $groupName);
// Инициализируйте группу год если она не существует.
if (!isset($groupedByYear[$year])) {
$groupedByYear[$year] = [];
}
// Добавим месяц и материалы в нем в соответствующий год
$groupedByYear[$year][$month] = $items;
}
?>
Визуальных изменений на странице пока нет!
Шаг 3 - добавление постепенного раскрытия
Следующий шаг изменить отображение применением HTML-тегов <details>и<summary>.
В редакторе шаблонов откройте файл
date.phpдля редактирования.Удалите имеющийся код отображения заголовков материалов.
<?php if ($grouped) : ?>
<?php foreach ($list as $groupName => $items) : ?>
<div class="mod-articles-group">
<<?php echo $groupHeading; ?>><?php echo Text::_($groupName); ?></<?php echo $groupHeading; ?>>
<?php require ModuleHelper::getLayoutPath('mod_articles', $params->get('layout', 'default') . $layoutSuffix); ?>
</div>
<?php endforeach; ?>
<?php else : ?>
<?php $items = $list; ?>
<?php require ModuleHelper::getLayoutPath('mod_articles', $params->get('layout', 'default') . $layoutSuffix); ?>
<?php endif;
И вставьте вместо него этот код:
<?php
$months = [
'января' => 'январь',
'февраля' => 'февраль',
'марта' => 'март',
'апреля' => 'апрель',
'мая' => 'май',
'июня' => 'июнь',
'июля' => 'июль',
'августа' => 'август',
'сентября' => 'сентябрь',
'октября' => 'октябрь',
'ноября' => 'ноябрь',
'декабря' => 'декабрь',
];
foreach ($groupedByYear as $year => $months) : ?>
<details class="mod-articles-year">
<summary><?php echo $year; ?></summary>
<?php foreach ($months as $month => $items) :
<details class="mod-articles-month">
<summary><?php echo $months[$month]; ?></summary>
<?php require ModuleHelper::getLayoutPath('mod_articles', $params->get('layout', 'date') . $layoutSuffix); ?>
</details>
<?php endforeach; ?>
</details>
<?php endforeach; ?>
Убедитесь, что $params->get('layout', 'date') соответствует названию вашего переопределенного файла.
Примечание переводчика:
В процессе перевода оригинальной статьи, в выше приведенный код мною были внесены изменения, а именно:
создан массив с изменением падежа месяцев (строки 2 - 15);
исключен класс
Text::_при выводе года и месяца.
Шаг 4 - доработка с помощью CSS
Сейчас на вашем сайте все должно работать, но вы можете улучшить отображение с помощью CSS.

Вернемся в редактор шаблонов, чтобы добавить немного CSS.
Если вы используете шаблон Cassiopeia, то можете добавить свой CSS-код в файл user.css расположенный в папке media/templates/site/cassiopeia/css. Если у вас файл user.css еще не создан, то вы можете создать его прямо сейчас.
Добавьте в файл следующий CSS-код:
/* раскрытие блога */
details.mod-articles-month {
padding-inline-start: 1em;
}
.mod-articles-month ul {
margin-bottom: 0;
}
.mod-articles-month li {
margin-inline-start: 2em;
list-style: disc;
}
Конечный результат
Ниже вы можете увидеть конечный результат со всеми изменениями HTML и CSS, а также его работу в действии на сайте Брайана Тимана https://brian.teeman.net/.
