Обозреватель Magento (sales_order_grid_collection_load_before), сбор фильтра по атрибуту продукта - PullRequest
0 голосов
/ 22 декабря 2011

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 31 декабря 2011

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

  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 / Заказ

  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 в сетке, чтобы пользователь мог вручную фильтровать, если требуется.

0 голосов
/ 22 декабря 2011

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

...