Вывод количества материалов рядом с пунктом меню категории
Для вывода меню используется стандартный модуль меню. Требуется вывести рядом с пунктом меню категории счётчик количества материалов этой категории.
Оглавление
Поиск макета вывода
Сначала необходимо определить, какой макет отвечает за вывод пункта меню категории в модуле.
Напомним, что вывод данных модулей происходит в макеты, которые располагаются в директории tmpl модуля. По умолчанию подключается макет default.php. Так как мы используем стандартный модуль меню mod_menu, то ищем макет modules/mod_menu/tmpl/default.php. В нём ищем код, связанный с типами пунктов меню:
switch ($item->type) :
case 'separator':
case 'component':
case 'heading':
case 'url':
require JModuleHelper::getLayoutPath('mod_menu', 'default_' . $item->type);
break;
default:
require JModuleHelper::getLayoutPath('mod_menu', 'default_url');
break;
endswitch;
Нас интересует вот эта строка:
require JModuleHelper::getLayoutPath('mod_menu', 'default_' . $item->type);
Для вывода пункта меню категории используется тип меню компонент (component). Следовательно за вывод этого типа меню отвечает макет default_component.php.
Переопределение
Когда мы нашли нужный нам макет вывода, необходимо сделать его переопределение. Копируем найденный выше макет в директорию /templates/{наш_шаблон}/html/mod_menu.
Открываем макет и перед кодом:
$attributes = array();
Вставляем код, который будет подсчитывать количество материалов в категории:
use Joomla\CMS\Categories\Categories;
// Инициализируем вывода количества.
$itemsCount = '';
// Если это пункт меню компонента com_content и он относится к категории,
// то считаем количество материалов.
if ($item->query['option'] == 'com_content'
&& isset($item->query['view'])
&& $item->query['view'] == 'category')
{
// Получаем объект категориий расширения Content с параметром подсчёта элементов.
$categories = Categories::getInstance('Content', ['countItems' => 1]);
// Получаем количество элементов категории, ID которой присутствует в пункте меню.
$numItems = $categories->get($item->query['id'])->numitems;
// Стилизуем вывод количества (показываем цифру в скобках).
if ($numItems > 0)
{
$itemsCount = ' <span class="articles-count">(' . $numItems . ')</span>';
}
}
Итак, у нас есть переменная $itemsCount
, в которой хранится вывод количества материалов. Давайте соединим её с текстом пункта меню. Перед кодом:
echo JHtml::_('link', JFilterOutput::ampReplace(htmlspecialchars($item->flink, ENT_COMPAT, 'UTF-8', false)), $linktype, $attributes);
Вставляем код:
$linktype .= $itemsCount;
Теперь рядом с пунктом меню категории выводится количество материалов этой категории:
Как вы уже наверное поняли, пример кода, который подсчитывает количество элементов категории, можно использовать не только в пунктах меню. Главное здесь, это доступность ID категории.
Код создаёт запрос в базу данных. Старайтесь использовать его для небольшого количества пунктов меню категории.
На этом всё. Не забывайте делать переопределения макетов вывода и никогда не вносите изменения непосредственно в файлы ядра. Удачной разработки!
Categories переопределение макеты вывода
- Последнее обновление: .