Вывод количества материалов рядом с пунктом меню категории
Для вывода меню используется стандартный модуль меню. Требуется вывести рядом с пунктом меню категории счётчик количества материалов этой категории.
Оглавление
Поиск макета вывода
Сначала необходимо определить, какой макет отвечает за вывод пункта меню категории в модуле.
Напомним, что вывод данных модулей происходит в макеты, которые располагаются в директории 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 = ' (' . $numItems . ')';
	}
}
  Итак, у нас есть переменная $itemsCount, в которой хранится вывод количества материалов. Давайте соединим её с текстом пункта меню. Перед кодом:
echo JHtml::_('link', JFilterOutput::ampReplace(htmlspecialchars($item->flink, ENT_COMPAT, 'UTF-8', false)), $linktype, $attributes);Вставляем код:
$linktype .= $itemsCount;Теперь рядом с пунктом меню категории выводится количество материалов этой категории:
 
Как вы уже наверное поняли, пример кода, который подсчитывает количество элементов категории, можно использовать не только в пунктах меню. Главное здесь, это доступность ID категории.
Код создаёт запрос в базу данных. Старайтесь использовать его для небольшого количества пунктов меню категории.
На этом всё. Не забывайте делать переопределения макетов вывода и никогда не вносите изменения непосредственно в файлы ядра. Удачной разработки!
Categories переопределение макеты вывода
- Последнее обновление: .