Значения свойств заказа
Внимание! Необходимо выполнять сохранение через заказ: \Bitrix\Sale\Order::save()
. Помимо всего этого, в одной из ближайших версий вызов \Bitrix\Sale\PropertyValueCollection::save()
либо \Bitrix\Sale\PropertyValue::save()
будет генерировать ошибку уровня E_WARNING
.
Получение
- Работа с объектами
$collection = $order->getPropertyCollection(); foreach ($collection as $item) { // $item – объект класса \Bitrix\Sale\PropertyValue }
- Работа с массивами
Помимо объектов есть возможность напрямую обращаться к базе через метод
\Bitrix\Sale\PropertyValueCollection::getList($parameters)
, либо\Bitrix\Sale\PropertyValue::getList($parameters)
. Оба этих метода работают аналогично.Методы всегда возвращают объект
Bitrix\Main\DB\Result
, из которого можно получить данные с помощью методаfetch()
.Параметр Описание С версии $parameters Массив, структура которого полностью соответствует структуре ORM'ного getList. // получение списка свойств для заказа с ID 123 $dbRes = \Bitrix\Sale\PropertyValueCollection::getList([ 'select' => ['*'], 'filter' => [ '=ORDER_ID' => 123, ] ]); while ($item = $dbRes->fetch()) { var_dump($item); }
- Получение конкретного значения.
$propertyValue = $collection->getItemByOrderPropertyCode($code);
- Работа со свойствами, как с коллекцией.
$propertyCollection = $order->getPropertyCollection(); foreach($propertyCollection as $popertyObj) { if($popertyObj->getField('CODE') == "CODE1") $someValue1 = $popertyObj->getValue(); if($popertyObj->getField('CODE') == "CODE2") $popertyObj->setValue($someValue2); }
Обновление
$order = \Bitrix\Sale\Order::load(123); $collection = $order->getPropertyCollection(); $propertyValue = $collection->getItemById(123); $r = $propertyValue->setField('VALUE', 'Новое значение'); if (!$r->isSuccess()) { var_dump($r->getErrorMessages()); } $order->save();
Доступное для редактирования поле:
"VALUE", // значение свойства
Удаление
$order = \Bitrix\Sale\Order::load(123); $collection = $order->getPropertyCollection(); $propertyValue = $collection->getItemById(123); $propertyValue->delete(); $order->save();
Получение конкретного значения
$collection = $order->getPropertyCollection();
- по ID
$propertyValue = $collection->getItemById($id);
- по внутреннему индексу
$propertyValue = $collection->getItemByIndex($index);
- по ID самого свойства
$propertyValue = $collection->getItemByOrderPropertyId($propertyId);
- геттеры для значений ключевых свойств(телефон, email, имя, адрес и т.д.)
$propertyValue = $collection->getAddress(); $propertyValue = $collection->getPhone(); $propertyValue = $collection->getProfileName(); $propertyValue = $collection->getTaxLocation(); $propertyValue = $collection->getDeliveryLocationZip(); $propertyValue = $collection->getDeliveryLocation(); $propertyValue = $collection->getPayerName(); $propertyValue = $collection->getUserEmail();
Добавление свойства
- Вариант 1:
$propertyValue = $collection->createItem( [ 'ID' => 1, 'NAME' => 'Новое свойство', 'TYPE' => 'STRING', 'CODE' => 'NEW_PROP', ] ); $propertyValue->setField('VALUE', 'Y');
- Вариант 2:
$propertyValue = \Bitrix\Sale\PropertyValue::create( $collection, [ 'ID' => 1, 'NAME' => 'Новое свойство', 'TYPE' => 'STRING', 'CODE' => 'NEW_PROP', ] ); $propertyValue->setField('VALUE', 'Свойство_3'); $collection->addItem($propertyValue);
Получение информации о свойстве, значение которого хранится в заказе
- Работа с массивом
$propertyInfo = $propertyValue->getProperty();
Результатом является массив с ключами:
'ID', // ID свойства 'PERSON_TYPE_ID', // ID типа плательщика, к которому оно привязано 'NAME', // Название свойства 'TYPE', // Тип 'REQUIRED', // Флаг обязательности 'DEFAULT_VALUE', // Значение по умолчанию 'SORT', // Сортировка 'USER_PROPS', // Входит ли в профиль 'IS_LOCATION', // Является ли местоположением 'PROPS_GROUP_ID', // ID группы 'DESCRIPTION', // Описание 'IS_EMAIL', // Является ли почтой 'IS_PROFILE_NAME', // Является ли названием профиля пользователя 'IS_PAYER', // Используется ли как имя плательщика 'IS_LOCATION4TAX', // Используется ли как местоположение для налогов 'IS_FILTERED', // Доступно ли в фильтре по заказам 'CODE', // Код 'IS_ZIP', // Используется ли как почтовый индекс 'IS_PHONE', // Является ли телефоном 'IS_ADDRESS', // Является ли адресом 'ACTIVE', // Флаг активности 'UTIL', // Флаг служебности 'INPUT_FIELD_LOCATION', 'MULTIPLE',// Флаг множественности 'MINLENGTH', // Минимальная длина строки 'MAXLENGTH', // Максимальная длина строки 'PATTERN', // Регулярное выражение для проверки 'MULTILINE', // Много строк 'SIZE', // Количество видимых символов
- Работа с объектом
$property = $propertyValue->getPropertyObject();
Любое значение можно получить, используя метод:
$property->getField('SIZE');
Для некоторых наиболее популярных полей реализованы геттеры:
$property->getId(); // ID свойства $property->getPersonTypeId(); // ID типа плательщика, к которому оно привязано $property->isUtil(); // является ли служебным $property->isRequired(); // является ли обязательным $property->getType(); // тип $property->getDescription(); // описание $property->getRelations(); // связи $property->getName(); // название $property->getGroupId(); // ID группы
Сообщение не промодерировано, возможны ошибки и неточности.
|
Вот очень интересно какой рабочий пример задачи решали разработчики, когда в ядро положили поиск по ID свойства, но не стали добавлять поиск по CODE свойства заказа... и типа сами сможем перебор в каждом месте напилить...
|
Сообщение не промодерировано, возможны ошибки и неточности.
|
// Ошибка
$code1 = 'TEST_1'; // Это свойство пропадет =( $code2 = 'TEST_2'; // А это останется =) $orderId = 603945; $order = \Bitrix\Sale\Order::load($orderId); var_dump(is_null($order->getPropertyCollection()->getItemByOrderPropertyCode($code1))); var_dump(is_null($order->getPropertyCollection()->getItemByOrderPropertyCode($code2))); $collection = $order->getPropertyCollection(); $propertyValue = \Bitrix\Sale\PropertyValue::create( $collection, [ 'NAME' => $code1, 'TYPE' => 'STRING', 'CODE' => $code1, ] ); $propertyValue->setField('VALUE', 'Это свойство пропадет =('); $collection->addItem($propertyValue); $collection = $order->getPropertyCollection(); $propertyValue = \Bitrix\Sale\PropertyValue::create( $collection, [ 'NAME' => $code2, 'TYPE' => 'STRING', 'CODE' => $code2, ] ); $propertyValue->setField('VALUE', 'А это останется =)'); $collection->addItem($propertyValue); var_dump(is_null($order->getPropertyCollection()->getItemByOrderPropertyCode($code1))); var_dump(is_null($order->getPropertyCollection()->getItemByOrderPropertyCode($code2))); $order->save(); //usr/share/nginx/test.php:37:boolean true //usr/share/nginx/test.php:38:boolean false //usr/share/nginx/test.php:65:boolean false //usr/share/nginx/test.php:66:boolean false |
Сообщение не промодерировано, возможны ошибки и неточности.
|
Ошибка$code1 = 'TEST_1'; // Это свойство пропадет =(
$code2 = 'TEST_2'; // А это останется =) $orderId = 603945; $order = \Bitrix\Sale\Order::load($orderId); var_dump($order->getPropertyCollection()->getItemByOrderPropertyCode($code1)); var_dump($order->getPropertyCollection()->getItemByOrderPropertyCode($code2)); $collection = $order->getPropertyCollection(); $propertyValue = \Bitrix\Sale\PropertyValue::create( $collection, [ 'NAME' => $code1, 'TYPE' => 'STRING', 'CODE' => $code1, ] ); $propertyValue->setField('VALUE', 'Это свойство пропадет =('); $collection->addItem($propertyValue); $collection = $order->getPropertyCollection(); $propertyValue = \Bitrix\Sale\PropertyValue::create( $collection, [ 'NAME' => $code2, 'TYPE' => 'STRING', 'CODE' => $code2, ] ); $propertyValue->setField('VALUE', 'А это останется =)'); $collection->addItem($propertyValue); $order->save(); ///usr/share/nginx/test.php:14:null ///usr/share/nginx/test.php:15: //object(Bitrix\Sale\PropertyValue) Если указывать ID, то оно конфликтует со свойствами добавленными в b_sale_order_props. |
Пользовательские комментарии
Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.Для этого нужно всего лишь авторизоваться на сайте
Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.
Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.