Реализовано единое хранилище пользовательских полей с разделением хранения значений в нескольких таблицах. Все поля хранятся в таблице 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');
Получение объекта пользовательского поля по его идентификатору (см.
$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(), возвращающий все значения пользовательских полей этого объекта.
$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;