Bitrix Framework - это не самый дружелюбный и понятный для разработки функционала инструмент нашей «любимой» CMS. Столкнувшись с задачей написания скрипта оформления заказа через API, у меня появилось несколько удобных сниппетов для работы со свойствами, о которых мы и поговорим.
Суть проблемы, с которой я столкнулся, заключалась в том, что в заказе есть набор свойств, которые заполняются после нажатия «Оформить»:
Есть определённый набор (телефон, почта и т.д.), которые необходимо обозначить в настройках как:
Тогда их можно будет добавлять и изменять через методы, которые нам предоставляет API, но если мы добавим свои свойства или не поставим соответствующую галочку, то столкнемся с проблемой, что, чёт как-то, API не сильно нам помогает в этом случае.
Первый сниппет будет полезен, если нужно вывести список свойств уже созданного заказа:
function getOrderProperties($params = [])
{
if ($params && !empty($params['order'])) {
$order = $params['order'];
if (CModule::IncludeModule('sale')) {
$props = Bitrix\Sale\Internals\OrderPropsValueTable::getList([
'filter' => [
'ORDER_ID' => $order
]
])->fetchAll();
if (!empty($props)) {
return $props;
}
}
}
return false;
}
По сути это обертка, которую при необходимости в проекте можно будет расширить, и для работы с ней нам потребуется передать id заказа:
$props = getOrderProperties([
'order' => 5
]);
В результате мы получим массив, в противном случае – false.
Для того, чтобы добавить (прикрепить) в заказ свойство предлагаю воспользоваться следующим кодом:
function addOrderProperty($params = [])
{
if ($params && !empty($params['order']) && !empty($params['code'])) {
$order = $params['order'];
$code = $params['code'];
$value = !empty($params['value']) ? $params['value'] : '';
if (CModule::IncludeModule('sale')) {
if ($prop = CSaleOrderProps::GetList([], ['CODE' => $code])->Fetch()) {
return CSaleOrderPropsValue::Add([
'NAME' => $prop['NAME'],
'CODE' => $prop['CODE'],
'ORDER_PROPS_ID' => $prop['ID'],
'ORDER_ID' => $order,
'VALUE' => $value
]);
}
}
}
return false;
}
Для работы этого сниппета нам потребуется передать два обязательных параметра: id заказа и code свойства, значение по умолчанию пустая строка. В этой функции можно увидеть, что мы динамически проверяем существование свойства по code и при наличии формируем массив с параметрами для метода add() класса CSaleOrderPropsValue. Тут важно понимать как будет происходить добавление свойства: во-первых метод add() отработает (вернет id свойства), если у заказа нет добавляемого свойства в заказе и во-вторых, если свойство существует в противном случаи мы получим – false. Поэтому метод add() логичнее было назвать attach(), но, увы. Вызовем его:
$id = addOrderProperty([
'order' => 5,
'code' => 'ADDRESS',
'value' => 'ул. Могилевская'
]);
В результате в разделе «Данные для доставки» мы увидим:
Если мы смогли добавить (прикрепить), то хотелось бы и обновить при необходимости:
function updateOrderProperty($params = [])
{
if ($params && !empty($params['order']) && !empty($params['code'])) {
$order = $params['order'];
$code = $params['code'];
$value = !empty($params['value']) ? $params['value'] : '';
if (CModule::IncludeModule('sale')) {
$prop = Bitrix\Sale\Internals\OrderPropsValueTable::getList([
'filter' => [
'ORDER_ID' => $order,
'CODE' => $code
]
])->Fetch();
if ($prop) {
return CSaleOrderPropsValue::Update($prop['ID'], [
'VALUE' => $value
]);
}
}
}
return false;
}
Тут у нас чуть проще схема, а именно: получить данные по конкретному свойству из заказа, и затем обновить значение:
$id = updateOrderProperty([
'order' => 5,
'code' => 'ADDRESS',
'value' => 'ул. Новая'
]);
Принимаемые параметры по аналогии, как и при работе addOrderProperty(), в результате:
Вот так просто можно добавлять и изменять свойства в заказе используя эти сниппеты. Их так же можно найти и на моем аккаунте github (в будущем буду потихоньку наполнять его полезными функциями, которые начали накапливаться в связи с работой).