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

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

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

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

Изменить статью