falbar Добавление и обновление свойств в заказе с использованием Битрикс API

Добавление и обновление свойств в заказе с использованием Битрикс API

14 марта 2018 Заметка 1023 0

Bitrix Framework - это не самый дружелюбный и понятный для разработки функционала инструмент нашей «любимой» CMS. Столкнувшись с задачей написания скрипта оформления заказа через API, у меня появилось несколько удобных сниппетов для работы со свойствами, о которых мы и поговорим.

Реклама

Суть проблемы, с которой я столкнулся, заключалась в том, что в заказе есть набор свойств, которые заполняются после нажатия «Оформить»:

v-zakaze-est-nabor-svojstv-bitriks

Есть определённый набор (телефон, почта и т.д.), которые необходимо обозначить в настройках как:

svojstva-kotorye-neobhodimo-oboznachit-v-nastrojkah-bitriks

Тогда их можно будет добавлять и изменять через методы, которые нам предоставляет 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' => 'ул. Могилевская'
]);

В результате в разделе «Данные для доставки» мы увидим:

bitriks-addorderproperty

Если мы смогли добавить (прикрепить), то хотелось бы и обновить при необходимости:

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(), в результате:

bitriks-updateorderproperty

Вот так просто можно добавлять и изменять свойства в заказе используя эти сниппеты. Их так же можно найти и на моем аккаунте github (в будущем буду потихоньку наполнять его полезными функциями, которые начали накапливаться в связи с работой).

Реклама
Комментариев еще не оставлено
no_avatar