Фильтр списка заказов в админке через 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 дней гарантии