Работа с дополнительными полями (вместо API)
Для Joomla 5 способ:
use Joomla\Component\Fields\Administrator\Helper\FieldsHelper; $app = \Joomla\CMS\Factory::getApplication(); $model = $app->bootComponent('com_fields')->getMVCFactory()->createModel('Field', 'Administrator', ['ignore_request' => true]); try{ $model->setFieldValue($field_id, $item_id, $value); }catch(\Exception $e){ }
Для Joomla 4 способ такой:
use Joomla\Component\Fields\Administrator\Helper\FieldsHelper; ... $fields = FieldsHelper::getFields('com_content.article', $article, true); * @param string $context The context of the content passed to the helper * @param null $item The item being edited in the form * @param int|bool $prepareValue (if int is display event): 1 - AfterTitle, 2 - BeforeDisplay, 3 - AfterDisplay, 0 - OFF * @param array|null $valuesToOverride The values to override * @param bool $includeSubformFields Should I include fields marked as Only Use In Subform? * * @return array
Нормального АПИ не нашел. Поэтому работа через модель поля (взято из их же плагина).
// Возможно, сперва придется подключить в верхней части скрипта: 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(); }