• Дмитрий Рекун

Вывод количества материалов рядом с пунктом меню категории

Для вывода меню используется стандартный модуль меню. Требуется вывести рядом с пунктом меню категории счётчик количества материалов этой категории.

Поиск макета вывода

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

Напомним, что вывод данных модулей происходит в макеты, которые располагаются в директории 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 категории.

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

На этом всё. Не забывайте делать переопределения макетов вывода и никогда не вносите изменения непосредственно в файлы ядра. Удачной разработки!


© 2020 BinaryCraft. Все права защищены.