Если вам приходилось сталкиваться с Bitrix D7, то скорее всего вы уже заметили существенные изменения в работе с API. Поменялась концепция, и основные идеи в новом ядре. Операции работы с базой данных, выборка и сохранения стали однотипными, и одинаковыми параметрами, и фильтрами. Основная концепция ядра, которой придерживались при разработке, это ORM. Технология в программировании, которая ориентирована на связь базы данных с объектами, создавая тем самым некоторые сущности, с которыми работает разработчик.
Данная концепция затронула практически все важные функциональные части системы в том числе и работу с заказами в системе. В данном посту мы поговорим о методах работы со свойствами заказа. В новом ядре появилось такое понятие как коллекция – говоря простым языком это умный массив, который позволяет оптимизировать групповые операции с объектами одного типа.
Так для свойств заказа существуют объекты Bitrix\Sale\PropertyValue, которые были собраны в коллекции propertyCollection.
Давайте рассмотрим пример работы со свойствами заказа, и первым делом нам требуется получить сам объект заказа. Получить объект заказа мы может одним из этих способов:
// используем пространство имён интернет-магазина use Bitrix\Sale; // int $orderId ID заказа $order = Sale\Order::load($orderId); // mixed $orderNumber номер заказа $order = Sale\Order::loadByAccountNumber($orderNumber);
Далее получаем коллекцию свойств заказа:
$propertyCollection = $order->getPropertyCollection();
Переменная $propertyCollection содержит объект коллекции свойств, чтобы получить значение свойств и групп свойств в виде массива, обращается к следующим методам:
$arr = $propertyCollection->getArray(); // массив ['properties' => [..], 'groups' => [..] ]; $arr = $propertyCollection->getGroups(); // массив групп $arr = $propertyCollection->getGroupProperties($groupId); // массив свойств, относящихся к группе
В системе Bitrix для заказов в системе существует целый набор стандартных свойств, значение которых можно получить следующими методами:
$emailPropValue = $propertyCollection->getUserEmail(); $namePropValue = $propertyCollection->getPayerName(); $locPropValue = $propertyCollection->getDeliveryLocation(); $taxLocPropValue = $propertyCollection->getTaxLocation(); $profNamePropVal = $propertyCollection->getProfileName(); $zipPropValue = $propertyCollection->getDeliveryLocationZip(); $phonePropValue = $propertyCollection->getPhone(); $addrPropValue = $propertyCollection->getAddress();
Назначение этих свойств думаю понятно из названия переменных и методов коллекции. Так же мы можем получить параметры свойства зная его ID, для этого есть специальный метод:
$somePropValue = $propertyCollection->getItemByOrderPropertyId($orderPropertyId);
В переменной $somePropValue будет находится объект-экземпляр класса Bitrix\Sale\PropertyValue, к которому можно обращаться для получения значений параметров свойства:
$somePropValue->getValue(); // значение свойства $somePropValue->getViewHtml(); // форматированное значение (в читаемом виде)
Кроме самого значения свойства можно получать и другие параметры:
$arProp = $somePropValue->getProperty(); // массив данных с параметрами свойства $propId = $somePropValue->getPropertyId(); // ID свойства $propName = $somePropValue->getName(); // Название свойства $isRequired = $somePropValue->isRequired(); // Обязательное ли свойство (true/false) $propPerson = $somePropValue->getPersonTypeId(); // ID типа плательщика $propGroup = $somePropValue->getGroupId(); // ID группы
Методов для получения параметров свойств вполне достаточно. Используя объект свойства, вы можете так же вносить изменение в значение свойства для заказа. Для этих целей существует метод setValue(), к которому вы обращаетесь посредством объекта из переменной $somePropValue:
$somePropValue->setValue("value"); $order->save(); // $somePropValue->save() сохранит без пересчёта заказа
Как и любые изменения в заказе требуют его сохранения, для этих целей доступны два метода, первый метод save() доступный в объекте самого заказа, другой аналогичный метод доступный в объекте свойства заказа. Разница использования этих двух методов в том, что при сохранении всего заказа происходит перерасчёт заказа, а во втором случает сохраняется только свойство заказа, без пересчёта.