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

Как сделать вывод количества материалов рядом с меткой

На странице материала выводится список меток. Задача - вывести рядом с каждой меткой счётчик количества материалов, в которых эта метка присутствует.

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

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

В Joomla за материалы отвечает компонент com_content. Непосредственно за вывод материала отвечает представление article. Ищем макет components/com_content/views/article/tmpl/default.php, а в нём ищем код, связанный с tags (метками):

<?php if ($info == 0 && $params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
	<?php $this->item->tagLayout = new JLayoutFile('joomla.content.tags'); ?>

	<?php echo $this->item->tagLayout->render($this->item->tags->itemTags); ?>
<?php endif; ?>

Нас интересует вот эта строка:

<?php $this->item->tagLayout = new JLayoutFile('joomla.content.tags'); ?>

Обратите внимание на параметр, который передаётся в класс JLayoutFile. Это так называемый идентификатор файла. Его последний сегмент – это название файла, а все что находится до него – это относительный путь до файла. Относительный путь строится от базовой директории расположения макетов /layouts, которая находится в корне установки Joomla.

Итак, складывая всё вместе, мы получаем, что за вывод меток отвечает макет tags.php, который расположен в директории /layouts/joomla/content.

Переопределение

Когда мы нашли нужный нам макет вывода, необходимо сделать его переопределение. Копируем найденный выше макет в директорию /templates/{наш_шаблон}/html/layouts/joomla/content.

Открываем макет и заменяем содержимое на код ниже:

Теперь рядом с меткой выводится количество материалов, в которых эта метка присутствует:

Вывод меток вместе с количеством материалов

Пояснение по коду

Давайте разберёмся, каким же образом мы достигли желаемого результата.

Для определения количества материалов мы использовали возможности вспомогательного класса меток TagsHelper. В нём есть метод getTagItemsQuery, который формирует объект SQL-запроса JDatabaseQuery для получения списка элементов заданной метки. А раз есть список, значит можно посчитать количество его элементов.

Метод принимает два параметра: ID метки и ID типа контента. ID метки нам доступен в макете: $tag->tag_id. А вот с ID типа контента всё немного сложнее. Чтобы его найти, надо заглянуть в базу данных и найти таблицу content_types. В ней ищем тип контента Article, который связан с com_content.article. Его ID равно единице.

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

<?php $result = Factory::getDbo()
	->setQuery(TagsHelper::getTagItemsQuery($tag->tag_id, 1))
	->loadObjectList();

if (!empty($result)) : ?>
	(<?php echo count($result); ?>)
<?php endif; ?>

Кроме изменений, описанных выше, было внесено подключение пространства имен для классов Factory и TagsHelper:

use Joomla\CMS\Factory;
use Joomla\CMS\Helper\TagsHelper;

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

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


© 2020 Joomla для профессионалов. Все права защищены.