Это перевод статьи Брайана Тимана (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/.

