Добавить название компании в сетку заказов на продажу


Мне нужно показать название компании в сетке заказов на продажу. Вот файлы, которые я создал:

Config.xml

<adminhtml>
    <events>
      <adminhtml_block_html_before>
            <observers>
                <addCompanyNameToSalesOrderGrid>
                    <class>Cpu_CustomGrid_Model_Observer</class>
                    <method>addCompanyNameToSalesOrderGrid</method>
                </addCompanyNameToSalesOrderGrid>
            </observers>
        </adminhtml_block_html_before>
    </events>
</adminhtml>

Observer.php

<?php
class Cpu_CustomGrid_Model_Observer extends Varien_Event_Observer
{
    public function addCompanyNameToSalesOrderGrid(Varien_Event_Observer $observer)
    {
        $event = $observer->getEvent();
        $this->_grid = $event->getBlock();
        if ($this->_grid instanceof Mage_Adminhtml_Block_Sales_Order_Grid) {
            $this->_collection = $this->_grid->getCollection();
            $this->_collection->joinAttribute('company', 'customer_address/company', 'default_billing', null, 'left');
            $this->_collection->addAttributeToSelect('company');
            $columnData = array(
                'header' => 'Company Name',
                'index'  => 'company',
                'type' => 'text',
            );

            $this->_grid->addColumnAfter('company', $columnData, 'name');
            $this->_grid->sortColumnsByOrder();
            // rebuild the filters
            $filter = $this->_grid->getParam($this->_grid->getVarNameFilter(), null);
            if (is_null($filter)) {
                $this->_collection->load();
            }
            $this->_collection->clear();
            if (is_string($filter)) {
                $data = $this->_grid->helper('adminhtml')->prepareFilterString($filter);
                $this->_setFilterValues($data);
            } else {
                if ($filter && is_array($filter)) {
                    $this->_setFilterValues($filter);
                }
            }
            // force a reload of the collection
            $this->_collection->load();
        }
    }

    protected function _setFilterValues($data)
    {
        foreach ($this->_grid->getColumns() as $columnId => $column) {
            if (isset($data[$columnId]) && (!empty($data[$columnId]) || strlen($data[$columnId]) > 0)
                && $column->getFilter()
            ) {
                $column->getFilter()->setValue($data[$columnId]);
                $this->_addColumnFilterToCollection($column);
            }
        }

        return $this;
    }

    protected function _addColumnFilterToCollection($column)
    {
        if ($this->_collection) {
            $field = ($column->getFilterIndex()) ? $column->getFilterIndex() : $column->getIndex();
            if ($column->getFilterConditionCallback()) {
                call_user_func($column->getFilterConditionCallback(), $this->getCollection(), $column);
            } else {
                $cond = $column->getFilter()->getCondition();
                if ($field && isset($cond)) {
                    $this->_collection->addFieldToFilter($field, $cond);
                }
            }
        }

        return $this;
    }
}

К сожалению, я не могу заставить его работать. В чем может быть проблема?

Author: Antony, 2017-04-09

1 answers

Попробуйте использовать приведенный ниже код в своей функции наблюдателя.

public function addCompanyNameToSalesOrderGrid(Varien_Event_Observer $observer)
{
    $event = $observer->getEvent();
    $this->_grid = $event->getBlock();
    if ($this->_grid instanceof Mage_Adminhtml_Block_Sales_Order_Grid) {
        $this->_collection = $this->_grid->getCollection();
        $this->_collection->getSelect()->join(Mage::getSingleton('core/resource')->getTableName('sales/order_address'), "main_table.entity_id = ".Mage::getSingleton('core/resource')->getTableName('sales/order_address').".parent_id",array('company') )->where(Mage::getSingleton('core/resource')->getTableName('sales/order_address').".address_type =  'billing'");

        $columnData = array(
            'header' => 'Company Name',
            'index'  => 'company',
            'type' => 'text',
        );

        $this->_grid->addColumnAfter('company', $columnData, 'shipping_name');
        $this->_grid->sortColumnsByOrder();
        // rebuild the filters
        $filter = $this->_grid->getParam($this->_grid->getVarNameFilter(), null);
        if (is_null($filter)) {
            $this->_collection->load();
        }
        $this->_collection->clear();
        if (is_string($filter)) {
            $data = $this->_grid->helper('adminhtml')->prepareFilterString($filter);
            $this->_setFilterValues($data);
        } else {
            if ($filter && is_array($filter)) {
                $this->_setFilterValues($filter);
            }
        }
        // force a reload of the collection
        $this->_collection->load();
    }
}
 4
Author: Jaimin Sutariya, 2017-04-10 10:12:39