Составные свойства

С помощью представленной документации, можно самостоятельно разработывать необходимый функционал на базе хранилищ

Составные свойства

Составные свойства – это специальный механизм модуля simai.storage, позволяющие объединять значения обычных свойств в составные значения.

В административной панели составное свойство создается так же, как и обычное, при редактировании хранилища, для чего при его создании нужно выбрать тип «Составное свойство».

После того, как свойство будет создано (нажатием кнопки «Применить» внизу страницы), в его настройках можно выбрать для него подсвойства из числа существующих обычных свойств хранилища (не составных и не системных).

Выбранные подсвойства пропадают из формы редактирования элементов хранилища – теперь они будут отображаться только как часть значений составного свойства.

Если исключить подсвойство из состава составного свойства, то оно снова становится обычным свойством.

Важно знать следующее:

1. Составное свойство может быть применимо к записям и разделам, но не к самому хранилищу.

2. Составное свойство НЕ может быть системным и НЕ может содержать системных подсвойств.

3. Составное свойство НЕ может быть мультиязычным, но может содержать мультиязычные подсвойства.

4. Одно и то же подсвойство НЕ может одновременно принадлежать к разным составным свойствам.

5. Для подсвойств перестает иметь значение их применимость к типу элемента – если составное значение применимо к записям или разделам, а его подсвойство – нет, то это подсвойство все равно будет отображаться внутри составного свойства.

6. Внутри одиночного составного свойства могут быть множественные подсвойства. Внутри множественного составного свойства могут быть одиночные подсвойства.

Значения составных свойств в форме редактирования элементов представлены в виде раскрывающихся белых плашек с полем подписи. Шелкнув на такую плашку, можно раскрыть для редактирования значения подсвойств.

Составные значения можно удалять с помощью кнопки крестика. До нажатия кнопки «Сохранить» или «Применить» внизу страницы удаление составного значения может быть отменено.

У множественных составных свойств значения можно перетаскивать мышью вверх-вниз относительно друг друга, меняя их порядок.

Составные свойства можно выбрать для отображения в компонентах simai:storage.item.detail и simai:storage.item.list .

В компонентах simai:storage.item.filter и simai:storage.item.grid составные свойства недоступны для выбора к отображению.

Примеры работы с составными свойствами через API

Пусть у нас есть хранилище с кодом test_storage , в котором есть:

1) мультиязычное одиночное строковое свойство с кодом LANG_STRING ,

2) множественное целочисленное свойство с кодом 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] => Третье

)

)