Yandex Metrika
sanches.free

Фильтр списка заказов в админке через OnSaleAdminOrderList

Задача

В разделе Интернет-магазин → Заказы нужно скрыть или сузить набор строк: например, разграничить доступ менеджеров по свойствам заказа, статусам или точкам самовывоза без правки типового ядра.

Обработчик вешается на событие OnSaleAdminOrderList модуля sale. В параметрах приходит уже подготовленный массив для Order::getList.

Базовая регистрация и правка фильтра

namespace Partner\AdminOrderList;

\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleAdminOrderList',
    '\\Partner\\AdminOrderList\\onSaleAdminOrderList'
);

function onSaleAdminOrderList(\Bitrix\Main\Event $event)
{
    $getListParams = $event->getParameters();

    $getListParams['filter']['>ID'] = 300;

    return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $getListParams);
}

Структура параметров до модификации

На входе уже есть ключи вроде filter, select, order, runtime, предел постраничной выборки — их и дополняйте аккуратно, не уничтожая существующие условия.

Фильтр по свойству заказа

Для свойства с кодом например SHOP_ID добавляется runtime-связь на OrderPropsValueTable.

function onSaleAdminOrderList(\Bitrix\Main\Event $event)
{
    $getListParams = $event->getParameters();

    $getListParams['runtime']['PROP_FILTER'] = [
        'data_type' => \Bitrix\Sale\Internals\OrderPropsValueTable::class,
        'reference' => [
            'ref.ORDER_ID' => 'this.ID',
        ],
        'join_type' => 'inner',
    ];

    $getListParams['filter']['=PROP_FILTER.CODE'] = 'SHOP_ID';
    $getListParams['filter']['=PROP_FILTER.VALUE'] = '000000002';

    return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $getListParams);
}

Фильтр по складу самовывоза (extra service)

function onSaleAdminOrderList(\Bitrix\Main\Event $event)
{
    $getListParams = $event->getParameters();

    $getListParams['runtime']['SHIPMENT_ES_FILTER'] = [
        'data_type' => \Bitrix\Sale\Internals\ShipmentExtraServiceTable::class,
        'reference' => [
            'ref.SHIPMENT_ID' => 'this.SHIPMENT.ID',
        ],
        'join_type' => 'inner',
    ];

    $getListParams['filter']['=SHIPMENT_ES_FILTER.VALUE'] = 17;
    $getListParams['filter']['=SHIPMENT_ES_FILTER.EXTRA_SERVICE_ID'] = 3;

    return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $getListParams);
}

Идентификаторы сервиса и значения складов уточняйте по данным вашей установки (например, таблица b_sale_order_delivery_es).

Условие по группе пользователя

function onSaleAdminOrderList(\Bitrix\Main\Event $event)
{
    $getListParams = $event->getParameters();

    $userToGroupResult = \Bitrix\Main\UserGroupTable::getList([
        'filter' => [
            'USER_ID' => (int)$GLOBALS['USER']->GetID(),
            'GROUP_ID' => 5,
        ],
    ]);

    if ($userToGroupResult->fetch()) {
        $getListParams['filter']['=STATUS_ID'] = ['N', 'P'];
    }

    return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $getListParams);
}

При необходимости перенесите ограничения по статусам строго в ветку filter, как ожидает ORM, и проверяйте итоговый SQL для конкретной редакции интернет-магазина.

На что обратить внимание

  • Любой join через runtime удорожает выборку — ограничивайте связи тем, что действительно нужно в фильтрах.
  • Не сбрасывайте весь массив параметров: расширяйте уже подготовленный ядром.
  • После апдейтов модуля sale верифицируйте работу фильтров на staging и права операторов.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии