Как сделать вывод количества материалов рядом с меткой
На странице материала выводится список меток. Задача - вывести рядом с каждой меткой счётчик количества материалов, в которых эта метка присутствует.
Оглавление
Поиск макета вывода
Сначала необходимо определить, какой макет отвечает за вывод меток на странице материала.
В 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;
Код создаёт запрос в базу данных для каждой метки. Используйте его, если не планируете большое количество меток в рамках одного материала.
На этом всё. Не забывайте делать переопределения макетов вывода и никогда не вносите изменения непосредственно в файлы ядра. Удачной разработки!
FileLayout TagsHelper переопределение layouts метки макеты вывода теги
- Последнее обновление: .