Май 30, 2018
Теги: Магазин, Как это сделать?
Иногда нужно добавить свой фильтр по заказам в админке (например, для того, чтобы сделать раздельный доступ к заказам для разных пользователей в зависимости от каких-то условий).
Для модификации фильтра по заказам в списке заказов в админке мы можем воспользоваться событием "OnSaleAdminOrderList".
Пример вызова события:
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; // показываем только заказы с ID больше 300
$result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $getListParams);
return $result;
}
Изначально в переменной $getListParams содержится примерно следующее:
Array
(
[filter] => Array
(
[>=DATE_UPDATE] => 30.04.2018
)
[group] => Array
(
)
[select] => Array
(
[0] => ID
[1] => LID
[2] => LOCK_STATUS
[3] => LOCK_USER_NAME
[4] => DATE_INSERT
[5] => USER_ID
[6] => STATUS_ID
[7] => DATE_STATUS
[8] => EMP_STATUS_ID
[9] => PAYED
[10] => DATE_PAYED
[11] => EMP_PAYED_ID
[12] => PRICE
[13] => CURRENCY
[14] => RESPONSIBLE_ID
)
[runtime] => Array
(
)
[order] => Array
(
[ID] => desc
)
[limit] => 20
[offset] => 0
)
Чтобы добавить фильтр по свойству заказа, помимо модификации самого массива фильтра, придется также добавить runtime-поле. В данном примере производится фильтрация по значению свойства заказа с символьным кодом "SHOP_ID":
namespace Partner\AdminOrderList;
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'sale',
'OnSaleAdminOrderList',
'\Partner\AdminOrderList\OnSaleAdminOrderList'
);
function OnSaleAdminOrderList(\Bitrix\Main\Event $event)
{
$getListParams = $event->getParameters();
$getListParams['runtime']['PROP_FILTER'] = array(
'data_type' => 'Bitrix\Sale\Internals\OrderPropsValueTable',
'reference' => array(
'ref.ORDER_ID' => 'this.ID',
),
'join_type' => 'inner'
);
$getListParams['filter']['=PROP_FILTER.CODE'] = 'SHOP_ID'; // символьный код свойства заказа
$getListParams['filter']['=PROP_FILTER.VALUE'] = '000000002'; // значение свойства заказа
$result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $getListParams);
return $result;
}
Пример фильтрации по складам самовывоза:
namespace Partner\AdminOrderList;
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'sale',
'OnSaleAdminOrderList',
'\Partner\AdminOrderList\OnSaleAdminOrderList'
);
function OnSaleAdminOrderList(\Bitrix\Main\Event $event)
{
$getListParams = $event->getParameters();
$getListParams['runtime']['SHIPMENT_ES_FILTER'] = array(
'data_type' => 'Bitrix\Sale\Internals\ShipmentExtraServiceTable',
'reference' => array(
'ref.SHIPMENT_ID' => 'this.SHIPMENT.ID',
),
'join_type' => 'inner'
);
$getListParams['filter']['=SHIPMENT_ES_FILTER.VALUE'] = 17 // ID склада самовывоза
$getListParams['filter']['=SHIPMENT_ES_FILTER.EXTRA_SERVICE_ID'] = 3; // ID дополнительного сервиса, можно посмотреть в таблице b_sale_order_delivery_es
$result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $getListParams);
return $result;
}
Пример с проверкой на принадлежность пользователя группе (фильтр будет добавляться только для группы пользователей с ID = 5):
namespace Partner\AdminOrderList;
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'sale',
'OnSaleAdminOrderList',
'\Partner\AdminOrderList\OnSaleAdminOrderList'
);
function OnSaleAdminOrderList(\Bitrix\Main\Event $event)
{
$getListParams = $event->getParameters();
$userToGroupResult = \Bitrix\Main\UserGroupTable::getList(array(
'filter' => array('USER_ID'=>$GLOBALS["USER"]->GetID(),'GROUP_ID'=>5),
));
if($userToGroup = $userToGroupResult->fetch())
{
$getListParams['STATUS_ID'] = array('N','P'); // должны быть видны только заказы в статусах 'N','P'
}
$result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $getListParams);
return $result;
}