Страница результатов Умного Поиска позволяет нам отображать некоторые поля (изображение, категорию, дату и т. д.), но не пользовательские поля. Поскольку поля Joomla предоставляют очень гибкий способ добавления дополнительных свойств к нашему контенту, их отображение в результатах поиска может сделать результаты более значимыми.

Пояснение по терминам от переводчика
  • Умный Поиск - встроенный компонент для поиска, который идёт как коробочное решение Joomla 4 и выше вместо поиска в версиях Joomla 1.0-3.x, удалённого из дистрибутива как устаревшее решение.

  • JFilters - расширение для фильтрации контента.

  • Настраиваемые поля - встроенный функционал Joomla, позволяющий использовать новую сущность полей в разных компонентах.

Тот же макет, который используется в Умном Поиске Joomla, также используется JFilters. Таким образом, наша настройка повлияет как на результаты выдачи Умного Поиска, так и на компонент JFilters.

В другом уроке по настройке макета результатов поиска уже упоминалось, что мы можем создавать субмакеты для каждого конкретного типа контента результатов. Например, мы можем создавать разные вложенные макеты для наших статей и контактов. Мы можем создать эти субмакеты, используя переопределения шаблона Joomla в Cassiopeia.

В этом уроке мы создадим субмакет для поисковой выдачи статей и соответствующим образом изменить его для отображения настраиваемых полей.

Результат до
Результат до
Результат после
Результат после

Создание субмакета для статей

Перейдите в «Система» > «Шаблоны» > «Шаблоны сайтов», а затем выберите «Сведения и файлы Cassiopeia».
Оттуда нажмите кнопку «Управление папками».

Управление папками (Manage Folders)
Управление папками (Manage Folders)

Затем перейдите в папку html и создайте новую папку com_finder.

Создаём папку com_finder в подпапке Cassiopeia
Создаём папку com_finder в подпапке Cassiopeia

А теперь внутри созданной на предыдущем шаге папки com_finder создайте ещё одну папку под названием search.

Создаём папку search в папке  com_finder
Создаём папку search в папке com_finder

Теперь давайте создадим новый файл внутри папки com_finder/search.

Создаём новый файл внутри папки com_finder/search
Создаём новый файл внутри папки com_finder/search

Файл будет называться default_article и нужно выбрать php как тип файла.

Создаём файл default_article.php
Создаём файл default_article.php

Итого, мы получаем следующий путь к файлу переопределения макета: /templates/cassiopeia/html/com_filder/search/default_article.php

Путь к переопределению макета выдачи поискового результата
Путь к переопределению макета выдачи поискового результата

Добавляем код в наш субмакет

В качестве основы мы будем использовать код из файла components/com_finder/tmpl/search/default_result.php. В этом файле формируется содержимое, которое выводится в элементе результата (search item). Возьмём содержимое из этого файла и скопируем его в наш новый файл (templates/cassiopeia/html/com_filder/search/default_article.php).

Таким образом, мы переопределяем результат поисковой выдачи через переопределение шаблона и далее сможем внести свои правки, которые не затрутся при очередном обновлении Joomla.

PHP-код можно отредактировать в default_article.php, либо из редактора шаблона (загружается после выбора файла в шаблоне), либо из выбранной вами IDE.

Добавление пользовательских полей

В начале файла после 20 строки добавьте:

// Создаём массив со всеми настраиваемыми полями текущей статьи. Параметр true позволяет нам получить визуализированное значение вместе с необработанным значением (rawvalue).
$articleCustomFields = Joomla\Component\Fields\Administrator\Helper\FieldsHelper::getFields('com_content.article', $this->result, true);

// Создаём ассоциативный массив, используя идентификатор настраиваемого поля в качестве ключа.
$articleCustomFields = \Joomla\Utilities\ArrayHelper::pivot($articleCustomFields, 'id');

Затем отследите идентификаторы настраиваемых полей, которые вы хотите отобразить.
Перейдите в «Материалы» > «Поля» и найдите идентификаторы полей, которые вы хотите отобразить.

ID пользовательских полей
ID пользовательских полей

Теперь мы можем добавить html код для отображения настраиваемых полей.
Перед элементом </li> в конце файла добавьте:

<ul class="fields-container">
        <?php
        // Мы используем настраиваемые поля с идентификаторами 10 и 3.
        if (!empty($articleCustomFields[10]->value)) : ?>
            <li class="field-entry">
                <span class="field-label"><?= $articleCustomFields[10]->label ?>:</span>
                <span class="field-value"><?= $articleCustomFields[10]->value; ?></span>
            </li>
        <?php
        endif; ?>

        <?php
        if (!empty($articleCustomFields[3]->value)) : ?>
            <li class="field-entry">
                <span class="field-label"><?= $articleCustomFields[3]->label ?>:</span>
                <span class="field-value"><?= $articleCustomFields[3]->value; ?></span>
            </li>
        <?php
        endif; ?>
    </ul>

Теперь, если на фронте сайта вы выполните поиск или фильтрацию, мы увидим результаты с настраиваемыми полями!

Использование альтернативных макетов для настраиваемых полей

Каждое настраиваемое поле может и��еть собственный альтернативный макет, который можно выбрать из его внутренних параметров. Если выбрана такая раскладка, использованный нами код работать не будет. В этом случае нам нужно визуализировать настраиваемое поле через его средство визуализации, указав макет.

Код должен быть таким:

<?php // мой альтернативный макет имеет такое же название, как и макет ?>
    <?= Joomla\Component\Fields\Administrator\Helper\FieldsHelper::render('com_content.article', 'field.myAltLayout', ['field' => $articleCustomFields[10]]); ?>

Код макета default_article.php целиком можно найти на Github

Автор статьи хотел бы поблагодарить Марка Дешевра @woluweb за первоначальное освещение этой темы и за код, часть которого была использована в данной статье.

Joomla в Telegram: