Magento observer (sales_order_grid_collection_load_before), сбор фильтров по атрибуту продукта

Таким образом, я работаю с sales_order_grid_collection_load_before событием наблюдателя на данный момент, где я могу получить коллекцию, используемую через $collection = $observer->getEvent()->getOrderGridCollection(); , Мне просто интересно, если можно отфильтровать эту коллекцию с помощью продукта из атрибута order. Я имею в виду, что в коллекции сетки заказов есть подпрограммы, связанные с этим заказом. Мне нужно показывать только заказы, если хотя бы один из продуктов соответствует определенным критериям (в моем случае я дал продуктам атрибут admin_id, который установлен администратору, который добавил продукт).

Благодарю!

2 ответа

Я сделал очень похожее дело, выполнив следующее:

  1. Переопределите блок сетки заказа клиента. Для этого вам нужно будет настроить собственное расширение (похоже, что вы уже можете это делать, но на всякий случай в Magento wiki) есть удобная doco)

    <config>
     <modules>
     <company_module>
     <version>0.1.0</version>
     </company_module>
     </modules>
     <global>
     <blocks>
     <company_module>
     <class>Company_Module_Block</class>
     </company_module>
     <adminhtml>
     <rewrite>
     <sales_order_grid>Company_Module_Block_Sales_Order_Grid</sales_order_grid>
     </rewrite>
     </adminhtml>
     </blocks>
     </global>
    </config>
  2. Затем я скопировал файл /app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php в мою папку расширений в /app/code/local/Company/Module/Block/Sales/Order

  3. В скопированном файле я изменил имя class Company_Module_Block_Sales_Order_Grid extends Mage_Adminhtml_Block_Widget_Grid на class Company_Module_Block_Sales_Order_Grid extends Mage_Adminhtml_Block_Widget_Grid

  4. Затем я изменил функцию _prepareCollection. В этом случае мне было интересно захватить customer_group_id и customer_email из таблицы sales_flat_order

    protected function _prepareCollection() {
     $collection = Mage::getResourceModel($this->_getCollectionClass());
     // left join onto the sales_flat_order table, retrieving the customer_group_id and customer_email columns -< this can be expanded
     $collection->getSelect()->join('sales_flat_order', 'main_table.entity_id=sales_flat_order.entity_id', array('customer_group_id'=>'customer_group_id', 'customer_email'=>'customer_email'), null, 'left');
    
     // grab the current user and get their associated customer groups (additional coding required to associate the customer groups to an admin user
     $user = Mage::getSingleton('admin/session')->getUser();
     $roleId = implode('', $user->getRoles());
     $customerGroupIds = Mage::getModel('admin/roles')->load($roleId)->getCustomerGroupIds();
     $orders = Mage::getResourceModel('sales/order_collection');
    
     // if the admin user has associated customer group ids then find the orders associated with those
     // this would be where you would do your filtering of the products
     if (count($customerGroupIds)) {
     $orders->addAttributeToFilter('customer_group_id', array('in' => $customerGroupIds));
     }
     $orderIds = $orders->getAllIds();
     $collection->addAttributeToFilter('entity_id', array('in' => $orderIds));
    
     $this->setCollection($collection);
    
     return parent::_prepareCollection();
    }

Вам может не понадобиться присоединение к таблице sales_flat_order... вы могли бы это сделать, просто выполнив фильтрацию во второй части функции _prepareCollection, показанной выше. В моем случае я отображал client_group_id и customer_email в сетке, чтобы пользователь мог вручную фильтровать, если это необходимо.


Я не уверен, что вы можете напрямую получить доступ к продукту из order_grid_collection (я так не думаю), но вы можете присоединиться к этой коллекции с помощью sales_flat_order_item а затем фильтровать по sales_flat_order_item усмотрению. НТН

licensed under cc by-sa 3.0 with attribution.