Наблюдатель Magento (sales_order_grid_collection_load_before), коллекция фильтров по атрибуту продукта

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

Спасибо!


person Hosh Sadiq    schedule 22.12.2011    source источник


Ответы (2)


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

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

    <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

  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, показанной выше. В моем случае я отображал customer_group_id и customer_email в сетке, чтобы пользователь мог вручную фильтровать, если это необходимо.

person CCBlackburn    schedule 30.12.2011
comment
А разве customer_group_id нет в таблице sales_flat_order? В моем случае продуктов нет в sales_flat_order, поэтому мне это сложно. Если у меня есть заказ, есть несколько связанных продуктов, все они имеют разные атрибуты «admin_id», и мне нужно показать только те заказы, которые имеют хотя бы один продукт, где «admin_id» соответствует вошедшему в систему администратору. - person Hosh Sadiq; 31.12.2011
comment
Вы абсолютно правы, если вы посмотрите на приведенный выше код, я выполняю левое соединение с таблицей sales_flat_order, чтобы получить ее $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');. Вы могли бы сделать то же самое - person CCBlackburn; 02.01.2012
comment
Отлично, мне пришлось переопределить класс, как вы сказали, но я не мог отфильтровать элементы, как вы сказали, в итоге мне пришлось просмотреть их все и удалить все, если их там не должно быть. Спасибо, в любом случае. - person Hosh Sadiq; 03.01.2012
comment
@CCBlackburn Как добавить фильтр категорий в obsever, я пробовал это -> $category_products = Mage::getModel('каталог/категория') ->addAttributeToFilter('category_id', array('in' => array('680', '894','895'))) -›setWebsiteId(2); - person Gem; 05.08.2019

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

person OSdave    schedule 22.12.2011
comment
Как я могу добавить список идентификаторов в sales_flat_order_item, и не будут ли они очищены при очистке кеша? - person Hosh Sadiq; 23.12.2011