Пользовательские поля Joomla содержат самую разную дополнительную к основным сущностям информацию. И отображает её нужно бывает в самых разных местах. Легко работать с полями, когда они есть в объекте материала или контакта. Но когда их нет - их нужно получить. Для этого существует класс \Joomla\Component\Fields\Administrator\Helper\FieldsHelper
.
У этого класса среди прочих самым ходовым, наверное, является метод getFields()
. С его помощью мы получаем списки полей и, если нужно, их значений для конкретного контекста.
- Контекст в коде Joomla
- Контекст в коде Joomla - это отличительный признак вида
<com_component>.<entity>
. Например,com_content.articles
. По нему мы понимаем, что работаем с материалами Joomla и конкретно со статьями.
<?php
/**
* @param string $context Контекст для поиска полей
* @param object|array|null $item объект сущности, для которой ищем поля.
* @param int|bool $prepareValue (если int - определяем где показывать значения): 1 - после заголовка, 2 - до основного контента, 3 - после контента, 0 - OFF. Если НЕ false и НЕ 0 - ПОЛУЧАЕМ ПОЛЯ И ЗНАЧЕНИЯ ПОЛЕЙ
* @param ?array $valuesToOverride значения для переопределения
* @param bool $includeSubformFields Включать ли поля, помеченные, что они только для сабформы?
*
* @return array
*
* @throws \Exception
* @since 3.7.0
*/
public static function getFields()
Таким образом мы в коде нередко видим такие вещи:
<?php
use Joomla\Component\Fields\Administrator\Helper\FieldsHelper;
// Получили поля. Всё ок.
$article->jcfields = FieldsHelper::getFields('com_content.article', $article, true);
Но поводом для написания этого поста стало несколько другое. В последнем примере кода $article
- это объект материала, для получения которого мы создаём сначала модель, в модели создаётся объект базы данных... Итого это всё довольно тяжеловесно.
А если нам нужно просто получить поля со значениями, но как-то полегче? Для этого достаточно передать вместо $article
массив или stdClass
с ключом id
.
<?php
use Joomla\Component\Fields\Administrator\Helper\FieldsHelper;
// Получили поля. Всё ок.
$fields = FieldsHelper::getFields('com_content.article', [ 'id' => 159 ], true);
Итого мы получили все поля (с учётом прав доступа и т.д.) для материала с id
159, но при этом сэкономили ресурсы сервера.