Как добавить свой фильтр в списке заказов в админке

Май 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;
}

← Переход к списку