Работа с пользовательскими полями

Реализовано единое хранилище пользовательских полей с разделением хранения значений в нескольких таблицах. Все поля хранятся в таблице fields, разделы пользовательских полей в таблице field_dirs.

Значения пользовательских полей хранятся в 6 разных таблицах в зависимости от типа свойства: field_value_datetimes, field_value_files, field_value_floats, field_value_ints, field_value_strings, field_value_texts.

Пользовательские поля зависят от сайта, в связи с чем работа осуществляется только при наличии инициализированной константы CURRENT_SITE

Получение списка пользовательских полей для модели advertisement

// Массив пользовательских полей
$aFields = Field_Controller::getFields('advertisement');

Получение объекта пользовательского поля

Получение объекта пользовательского поля по его идентификатору (см. ORM)

$oField = Core_Entity::factory('Field', 123);

Получение значений пользовательских полей

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

// Объект пользовательского поля с идентификатором 123
$oField = Core_Entity::factory('Field', 123);
// Массив значений поля 123 для элемента с кодом 2
$aField_Values = $oField->getValues(2);

Получение массива значений пользовательских полей по значению поля.

// Объект пользовательского поля с идентификатором 123
$oField = Core_Entity::factory('Field', 123);
$aField_Values = $oField->getValuesByValue('Значение поля');

В зависимости от типа пользовательского поля объект значения может иметь атрибуты:

для полей типа файл:

Получение всех значений полей объекта через getFields()

Дополнительно все модели имеют метод getFields(), возвращающий все значения пользовательских полей этого объекта.

$oStructure = Core_Entity::factory('Structure', 777);
$aField_Values = $oStructure->getFields();
foreach ($aField_Values as $oField_Value)
{
	echo 'Field ', htmlspecialchars($oField_Value->Field->name), ', value = ', htmlspecialchars($oField_Value->Field->type == 2
		? $oField_Value->file
		: $oField_Value->value);
}

Создание значения пользовательского поля

С использованием метода createNewValue() получим объект нового значения пользовательского поля, который зависит от типа поля. Аргументом передается идентификатор объекта, для которого создается значение.

// Объект пользовательского поля с идентификатором 123 для модели информационных элементов
$oField = Core_Entity::factory('Field', 123);
// Объект нового значение поля 123 для элемента с идентификатором $informationsystem_item_id
$oField_Value = $oField->createNewValue($informationsystem_item_id);
// Задаем значение
$oField_Value->value = 1;
// Сохраняем
$oField_Value->save();

Изменение или установка значения пользовательского поля, если значения не было

// Объект пользовательского поля с идентификатором 123
$oField = Core_Entity::factory('Field', 123);
// Получаем массив всех значений поля 123 для информационного элемента $informationsystem_item_id
$aField_Values = $oField->getValues($informationsystem_item_id);
// Если нет ни одного значение, то добавляем в массив новое значение
!isset($aField_Values[0]) && $aField_Values[0] = $oField->createNewValue($informationsystem_item_id);
// Устанавливаем значение
$aField_Values[0]->value = 'Значение';
// Сохраняем
$aField_Values[0]->save();

Перенос значений полей из одной таблицы в другую при смене типа поля

Значения полей хранятся в таблицах, зависящих от вида поля. В случае изменения типа пользовательского поля может потребоваться перенести значения из одной таблицы в другую. Рассмотрим пример смены типа поля со строки (field_value_strings) на большое текстовое поле (field_value_texts) для свойства номер 17. Изменив тип поля перенесем значения свойства из таблицы строк в таблицу текстов:

INSERT INTO `field_value_texts` (`field_id`, `entity_id`, `value`) SELECT `field_id`, `entity_id`, `value` FROM `field_value_strings` WHERE `field_id` = 17;

Проверяем наличие значений с новым типом, если все нормально перенеслось, то удаляем значения в таблице предыдущего типа:

DELETE FROM `field_value_strings` WHERE `field_id` = 17;

Не нашли ответ на свой вопрос в документации? Направьте обращение в службу поддержки или онлайн чат.