Работа с дополнительными полями (вместо API)

Нормального АПИ не нашел. Поэтому работа через модель поля (взято из их же плагина).

// Возможно, сперва придется подключить в верхней части скрипта:
defined('_JEXEC') or die;
use Joomla\Registry\Registry;
JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');

// Получение доп. полей объекта по контексту (без этого может не работать вызов модуля)
$fields = FieldsHelper::getFields('com_users.user', $user->id);

// Создаем объект модели поля
$model = JModelLegacy::getInstance('Field', 'FieldsModel', array('ignore_request' => true));

// Запись значения поля
$model->setFieldValue($field->id, $item->id, $value);

// Чтение значения поля
$value = $model->getFieldValue($field->id, $item->id);

// Очистка значений всех доп. полей для объекта заданного контекстом (напри., "com_users.user") и его ИДом. Может пригодиться при удалении объекта:
$model->cleanupValues($context, $item->id);

// Остальные методы модели можно посмотреть в самой модели:
/administrator/components/com_fields/models/field.php

 

 

После очередного обновления способ, описанный выше, дал сбой и новые значения доп. полей не захотели сохраняться в базе. А потому - менее кошерный, но более надежный способ работы с доп. полями (а точнее - их значениями):

    static function getFieldValue($fieldId, $itemId, $default = null){
        $db = JFactory::getDbo();
        $fieldIdQ = $db->quote($fieldId);
        $itemIdQ = $db->quote($itemId);
        $db->setQuery("SELECT `value` FROM `#__fields_values` WHERE `field_id` = {$fieldIdQ} AND `item_id` = {$itemIdQ}");
        $res = $db->loadAssoc();
        $value = empty($res) ? $default : $res['value'];
        return $value;
    }
    
    static function setFieldValue($fieldId, $itemId, $value = null){
        $db = JFactory::getDbo();
        $fieldIdQ = $db->quote($fieldId);
        $itemIdQ = $db->quote($itemId);
        $valueQ = $db->quote($value);
        
        if(is_null($value)){
            $db->setQuery("DELETE FROM `#__fields_values` WHERE `field_id` = {$fieldIdQ} AND `item_id` = {$itemIdQ};");
            $db->execute();
        }else{
            $old = self::getFieldValue($fieldId, $itemId);
            if(is_null($old)){
                $db->setQuery("INSERT INTO `#__fields_values` (`field_id`, `item_id`, `value`) VALUES ({$fieldIdQ}, {$itemIdQ}, {$valueQ});");
                $db->execute();
            }else{
                $db->setQuery("UPDATE `#__fields_values` SET `value` = {$valueQ} WHERE `field_id` = {$fieldIdQ} AND `item_id` = {$itemIdQ};");
                $db->execute();
            }
        }
        
        return $db->getAffectedRows();
    }