Составные свойства
С помощью представленной документации, можно самостоятельно разработывать необходимый функционал на базе хранилищ
Составные свойства
Составные свойства – это специальный механизм модуля 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] => Третье ) ) |