Составные свойства
С помощью представленной документации, можно самостоятельно разработывать необходимый функционал на базе хранилищ
Составные свойства
Составные свойства – это специальный механизм модуля simai.storage, позволяющие объединять значения обычных свойств в составные значения.
В административной панели составное свойство создается так же, как и обычное, при редактировании хранилища, для чего при его создании нужно выбрать тип «Составное свойство».
После того, как свойство будет создано (нажатием кнопки «Применить» внизу страницы), в его настройках можно выбрать для него подсвойства из числа существующих обычных свойств хранилища (не составных и не системных).
Выбранные подсвойства пропадают из формы редактирования элементов хранилища – теперь они будут отображаться только как часть значений составного свойства.
Если исключить подсвойство из состава составного свойства, то оно снова становится обычным свойством.
Важно знать следующее:
- Составное свойство может быть применимо к записям и разделам, но не к самому хранилищу.
- Составное свойство НЕ может быть системным и НЕ может содержать системных подсвойств.
- Составное свойство НЕ может быть мультиязычным, но может содержать мультиязычные подсвойства.
- Одно и то же подсвойство НЕ может одновременно принадлежать к разным составным свойствам.
- Для подсвойств перестает иметь значение их применимость к типу элемента – если составное значение применимо к записям или разделам, а его подсвойство – нет, то это подсвойство все равно будет отображаться внутри составного свойства.
- Внутри одиночного составного свойства могут быть множественные подсвойства. Внутри множественного составного свойства могут быть одиночные подсвойства.
Значения составных свойств в форме редактирования элементов представлены в виде раскрывающихся белых плашек с полем подписи. Шелкнув на такую плашку, можно раскрыть для редактирования значения подсвойств.
Составные значения можно удалять с помощью кнопки крестика. До нажатия кнопки «Сохранить» или «Применить» внизу страницы удаление составного значения может быть отменено.
У множественных составных свойств значения можно перетаскивать мышью вверх-вниз относительно друг друга, меняя их порядок.
Составные свойства можно выбрать для отображения в компонентах simai:storage.item.detail
и simai:storage.item.list
.
В компонентах simai:storage.item.filter
и simai:storage.item.grid
составные свойства недоступны для выбора к отображению.
Примеры работы с составными свойствами через API
Пусть у нас есть хранилище с кодом test_storage
, в котором есть:
- мультиязычное одиночное строковое свойство с кодом
LANG_STRING
, - множественное целочисленное свойство с кодом
MULT_NUMBER
.
Допустим, мы хотим объединить их в рамках множественного составного свойства с кодом COMPLEX1
.
Создадим такое составное свойство через API:
\\SIMAI\\Storage\\Property::add(
array(
"STORAGE_ID"=>"test_storage", // код хранилища
"CODE"=>"COMPLEX1", // код составного свойства
"TYPE"=>"complex", // тип свойства - составное
"SETTINGS"=>array(), // набор доп. параметров, для каждого типа свойств этот набор свой, в данном случае не заполняем его
"MULTIPLE"=>"Y", // множественное свойство
"MULTILANGUAGE"=>"N", // составное свойство не может быть мультиязычным
"SORT"=>"100", // показатель сортировки
"STORAGE_USE"=>"N", // составное свойство не может использоваться для самого хранилища
"SECTION_USE"=>"N", // не используется для разделов
"ITEM_USE"=>"Y", // используется для записей
"SYSTEM"=>"N", // составное свойство не может быть системным
"LANGUAGE"=>array("ru"=>"Множ.составное", "en"=>"Mult.complex"), // языковые заголовки свойства
)
);
//Все ошибки можно увидеть в массиве $GLOBALS["SF_STORAGE_ERRORS"]
Теперь нам нужно сделать так, чтобы свойства с кодами LANG_STRING
и MULT_NUMBER
стали его подсвойствами.
Для этого нам нужно сделать для них поле "COMPLEX"=" COMPLEX1
" и тем самым приписать их к составному свойству с кодом COMPLEX1
.
$res_prop = \\SIMAI\\Storage\\Property::getList(
array(
"filter" => array("STORAGE_ID" => "test_storage", "CODE" => array("LANG_STRING", "MULT_NUMBER")), // выбрать свойства хранилища test_storage с кодами LANG_STRING и MULT_NUMBER
)
);
while ($prop_data = $res_prop ->fetch())
{
$result = \\SIMAI\\Storage\\Property::update(
$prop_data["PROPERTY_ID"], // обновляем по PROPERTY_ID
array("COMPLEX" => "COMPLEX1") // устанавливаем поле COMPLEX
);
}
//Все ошибки можно увидеть в массиве $GLOBALS["SF_STORAGE_ERRORS"]
Итак, у нас есть множественное составное свойство с кодом COMPLEX1
, содержащее подсвойства с кодами LANG_STRING
и MULT_NUMBER
.
Если у нас есть запись хранилища с ELEMENT_ID=1, то мы можем задать для этой записи значения составного свойства.
Значения задаются в виде массива. Каждое значение составного свойства для элемента должно иметь собственный ключ, состоящий из строчных английских букв и цифр (допустим, znach1
и znach2
).
При этом каждое такое значение в свою очередь, должно быть массивом, в котором ключами являются символьные коды подсвойств, а значениями – собственно, значения этих подсвойств.
$res = \\SIMAI\\Storage\\Property::setPropComplexValue(
"test_storage", // код хранилища $storage_id
1, // ид элемента $element_id
"COMPLEX1", // код составного свойства $property_code
array( // массив значений множественнного составного свойства $value
"znach1" => array( // код значения составного свойства
"LANG_STRING" => array(
"ru" => "Тест", // значение для рус. языка у мультияз. подсвойства
"en" => "Test", // значение для англ. языка у мультияз. подсвойства
),
"MULT_NUMBER" => array(
55, // первое значение для множ. подсвойства
78, // второе значение для множ. подсвойства
),
),
"znach2" => array( // код значения составного свойства
"LANG_STRING" => array(
"ru" => "Тест2", // значение для рус. языка у мультияз. подсвойства
"en" => "Test2", // значение для англ. языка у мультияз. подсвойства
),
"MULT_NUMBER" => array(
46, // значение для множ. подсвойства
),
),
),
array( // массив доп. параметров значений составного свойства $additional
"sort" => array("znach1", "znach2"), // порядок значений сост. свойства
"titles" => array("znach1" => "Первое", "znach2" => "Второе"), // подписи значений сост. свойства
),
false, // игнорировать тип элемента – параметр $ignore_use_type
true // проверять уровень доступа – параметр $check_rights
);
//Все ошибки можно увидеть в массиве $GLOBALS["SF_STORAGE_ERRORS"]
Обратите внимание на следующий параметр после $value
– массив $additional
, который может состоять из подмассива порядка значений с ключом sort
, где ключи значений перечислены в порядке, нужном для выборки, а также из подмассива с ключом titles
, где для значений перечислены их подписи.
Этот параметр ($additional
) не является обязательным для указания, по умолчанию он представляет собой пустой массив.
Параметр $ignore_use_type
не обязателен и по умолчанию равен false (тип элемента проверяется на применимость свойства.
Параметр $check_rights
также не обязателен и по умолчанию равен false (уровень доступа не проверяется), но в нашем случае мы хотим проверить права пользователя на запись.
Теперь предположим, что мы хотим добавить еще одно значение к множественному составному свойству, не удаляя существующие. Для этого нам придется задействовать параметр $delete_other_values
.
$res = \\SIMAI\\Storage\\Property::setPropComplexValue(
"test_storage", // код хранилища $storage_id
1, // ид элемента $element_id
"COMPLEX1", // код составного свойства $property_code
array( // массив значений множественнного составного свойства $value
"znach3" => array( // код значения составного свойства
"LANG_STRING" => array(
"ru" => "Тест3", // значение для рус. языка у мультияз. подсвойства
"en" => "Tes3t", // значение для англ. языка у мультияз. подсвойства
),
"MULT_NUMBER" => array(
26, // первое значение для множ. подсвойства
),
),
),
array( // массив доп. параметров значений составного свойства $additional
"sort" => array("znach1", "znach2", "znach3"), // порядок значений сост. свойства
"titles" => array("znach1" => "Первое", "znach2" => "Второе", "znach3" => "Третье"), // подписи значений сост. свойства
),
false, // игнорировать тип элемента – параметр $ignore_use_type
true, // проверять уровень доступа – параметр $check_rights
false // не удалять остальные значения – параметр $delete_other_values
);
//Все ошибки можно увидеть в массиве $GLOBALS["SF_STORAGE_ERRORS"]
В этом случае мы получим еще одно значение с ключом znach3
, при этом значения с ключами znach1
и znach2
останутся. По умолчанию же параметр $delete_other_values
равен true.
Обратите внимание, что для параметра $additional
мы, тем не менее, указываем ВСЕ ключи и в сортировке, и в заголовках!
Если же мы имеем дело с одиночным составным свойством, то для него значения устанавливаются ровно так же. Единственное отличие – в количестве: должно быть только одно составное значение с ключом.
Например, если есть одиночное составное свойство с кодом COMPLEX2
, включающее одиночное файловое подсвойство с кодом FILE
и множественное строковое подсвойство MULT_STRING
, то выглядеть это может так:
$res = \\SIMAI\\Storage\\Property::setPropComplexValue(
"test_storage", // код хранилища $storage_id
1, // ид элемента $element_id
"COMPLEX2", // код составного свойства $property_code
array( // массив значений множественнного составного свойства $value
"znach1" => array( // код значения составного свойства
"FILE" => array_merge(CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/upload/abc.jpg"),array("module_id" => "simai.storage")) // значение - файловый массив
"MULT_STRING" => array(
"строка 1", // первое значение для множ. подсвойства
"строка 2", // второе значение для множ. подсвойства
),
),
),
array( // массив доп. параметров значений составного свойства $additional
"titles" => array("znach1" => "Первое"), // подписи значений сост. свойства
),
false, // игнорировать тип элемента – параметр $ignore_use_type
true // проверять уровень доступа – параметр $check_rights
);
//Все ошибки можно увидеть в массиве $GLOBALS["SF_STORAGE_ERRORS"]
Параметр $delete_other_values
для одиночного составного свойства не сработает.
Теперь определим значения нашего множественного составного свойства с кодом COMPLEX1
для записи с ELEMENT_ID=1:
$value = \\SIMAI\\Storage\\Property::GetPropComplexValue(
"test_storage", // код хранилища
1, // ид элемента
"COMPLEX1", // код составного свойства
"ru" // значения для русского языка либо неязыковые
);
//Выведем структуру возвращенных значений
echo "<pre>"; print_r($value); echo "</pre>";
//Все ошибки можно увидеть в массиве $GLOBALS["SF_STORAGE_ERRORS"]
В результате получим:
Array(
[znach1] => Array (
[LANG_STRING] => Array(
[0] => Тест
),
[MULT_NUMBER] => Array(
[0] => 55
[1] => 78
),
[title] => Первое
),
[znach2] => Array(
[LANG_STRING] => Array(
[0] => Тест2
),
[MULT_NUMBER] => Array(
[0] => 46
),
[title] => Второе
),
[znach3] => Array(
[LANG_STRING] => Array(
[0] => Тест3
),
[MULT_NUMBER] => Array(
[0] => 26
),
[title] => Третье
),
);