Magento - Как добавить информацию о корабле в сетку заказов в Magento 1.5.1.0 - PullRequest
3 голосов
/ 26 января 2012

Я нашел отличный способ поместить адрес электронной почты клиента в сетку заказов на продажу Magento Admin с помощью этих вопросов и ответов (http://stackoverflow.com/questions/6416864/how-to-add-customer-email-to-order-grid-in-magento-1-4/6906254#6906254) от Ben Incani , и он отлично работает.

Мой вопрос: используя этот метод, как я могу добавить Корабль к информации ( имя , адрес , город , state , zip )?

Я пытался сделать две версии (такого рода работы), но не работает полностью, поэтому я немного застрял ...

Это код, который работает для электронных писем клиентов:

$collection->getSelect()->joinLeft(array('sfo'=>'sales_flat_order'),'sfo.entity_id=main_table.entity_id',array('sfo.customer_email', 'sfo.shipping_description'));

Теперь, когда я пытался зайти в таблицу базы данных с информацией Ship to , я попытался это сделать:

$collection->getSelect()->joinLeft(array('sfoa'=>'sales_flat_order_address'),'sfoa.parent_id=sfo.entity_id',array('sfoa.postcode'));

Возвращает журнал ошибок с сообщением:

a: 5: {i: 0; s: 68: «Элемент (Mage_Sales_Model_Order) с таким же идентификатором« 10860 »уже существует»; i: 1; s: 5104: «# 0

Попробуем этот код (который наиболее точно соответствует исходному коду электронной почты клиента):

$collection->getSelect()->joinLeft(array('sfoa'=>'sales_flat_order_address'),'sfoa.entity_id=main_table.entity_id',array('sfoa.postcode'));

возвращает сетку, которую я могу просмотреть с помощью заполненного столбца. Однако значения в столбце НЕ правильные Почтовые коды - я даже не могу понять, какие значения он вытягивает ???

Полагаю, одна из моих проблем заключается в том, что я точно не знаю, на что ссылается main_table.entity_id (хотя у меня есть предположение).

В любом случае, я чувствую, что я рядом, и если кто-то может ответить, как я успешно получил информацию этим методом, я был бы вечно благодарен! Может кто-нибудь

Ответы [ 3 ]

10 голосов
/ 26 января 2012

Исправленный ответ (из-за двух проблемных ошибок)

Я переписываю этот ответ более дружелюбным, пошаговым способом, чтобы надеяться помочь кому-то еще.

Примечание: Это для локального изменения в app/code/local/Mage/Adminhtml/Block/Sales/Order/Grid.php

A. Чтобы все работало корректно, сначала нужно изменить _getCollectionClass() с этого:

protected function _getCollectionClass()
{
    return 'sales/order_grid_collection';
}

к этому:

protected function _getCollectionClass()
{
    //return 'sales/order_grid_collection';
    return 'sales/order_collection';
}

При выполнении этого я столкнулся с сильной головной болью:

SQLSTATE [23000]: Нарушение ограничения целостности: 1052 Столбец «made_at» в где условие неоднозначно

Это происходит при попытке фильтрации / поиска в сетке по столбцу Покупка по .

Чтобы избежать / исправить эту ошибку, вам нужно изменить коллекцию И и добавить следующее к _prepareCollection() И добавить filter_index к каждому из добавленных столбцов к сетке.

Вы также столкнетесь с другой головной болью

SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец «имя_биллинга» в «предложении где»

ЕСЛИ в _prepareCollection() вы пытаетесь динамически создать столбцы Имя биллинга или Имя доставки , которое выглядит следующим образом:

$collection->getSelect()->columns(new Zend_Db_Expr("CONCAT(s2.firstname, ' ',s2.lastname) AS billing_name"));
    $collection->getSelect()->columns(new Zend_Db_Expr("CONCAT(s1.firstname, ' ',s1.lastname) AS shipping_name"));

Когда это будет сделано, не будет по-настоящему простого способа (который я нашел, чтобы это исправить), если это все.

Чтобы избежать этих головных болей ( после , изменив _getCollectionClass() на вышеуказанное), сделайте следующее:

B. Измените _prepareCollection() на это:

 protected function _prepareCollection()
{
    $collection = Mage::getResourceModel($this->_getCollectionClass());

    $collection->getSelect()->joinLeft(array('sfog' => 'sales_flat_order_grid'),'main_table.entity_id = sfog.entity_id',array('sfog.shipping_name','sfog.billing_name'));
$collection->getSelect()->joinLeft(array('sfo'=>'sales_flat_order'),'sfo.entity_id=main_table.entity_id',array('sfo.customer_email','sfo.weight','sfo.discount_description','sfo.increment_id','sfo.store_id','sfo.created_at','sfo.status','sfo.base_grand_total','sfo.grand_total'));
    $collection->getSelect()->joinLeft(array('sfoa'=>'sales_flat_order_address'),'main_table.entity_id = sfoa.parent_id AND sfoa.address_type="shipping"',array('sfoa.street','sfoa.city','sfoa.region','sfoa.postcode','sfoa.telephone'));


    $this->setCollection($collection);

    return parent::_prepareCollection();
}

C. Затем для существующих столбцов в _prepareColumns() добавьте filer_index к каждому:

Пример:

$this->addColumn('billing_name', array(
        'header' => Mage::helper('sales')->__('Bill to Name'),
        'index' => 'billing_name',
        'filter_index' => 'sfog.billing_name',
    ));

D. Затем добавьте столбцы, которые вы хотите добавить, вот так:

Пример:

$this->addColumn('customer_email', array(
            'header' => Mage::helper('sales')->__('Customer Email'),
            'index' => 'customer_email',
            'filter_index' => 'sfo.customer_email',
            'width' => '50px',
    ));
0 голосов
/ 19 мая 2016

Причина этой ошибки "Mage_Sales_Model_Order) с таким же идентификатором" 10860 "уже существует", потому что sales_flat_order_address создает две записи для каждого заказа, одну для адреса доставки и другую для адреса выставления счета, если вы добавите этот фильтр в _prepareCollection () вы можете заставить его работать

$collection->getSelect()->where("address_type='shipping'");
0 голосов
/ 10 мая 2016

Некоторое время назад у меня было похожее требование, когда мне нужно добавить адрес электронной почты клиента и регион доставки в таблицу заказов на продажу.
Для достижения этого требования я переписал класс Mage_Adminhtml_Block_Sales_Order_Grid, как показано ниже в моем пользовательском модуле.

class Custom_OrderGrid_Block_Adminhtml_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid {

    protected function _getCollectionClass() {
        return 'sales/order_collection';
    }

    protected function _prepareCollection() {
        $collection = Mage::getResourceModel($this->_getCollectionClass());

        $collection->getSelect()->joinLeft(array('sfog' => 'sales_flat_order_grid'), 'main_table.entity_id = sfog.entity_id', array('sfog.shipping_name', 'sfog.billing_name'));

        $collection->getSelect()->joinLeft(array('sfo' => 'sales_flat_order'), 'sfo.entity_id=main_table.entity_id', array('sfo.customer_email', 'sfo.increment_id', 'sfo.store_id', 'sfo.created_at', 'sfo.status', 'sfo.base_grand_total', 'sfo.grand_total'));

        $collection->getSelect()->joinLeft(array('sfoa' => 'sales_flat_order_address'), 'main_table.entity_id = sfoa.parent_id AND sfoa.address_type="shipping"', array('sfoa.region'));

        $this->setCollection($collection);

        return Mage_Adminhtml_Block_Widget_Grid::_prepareCollection();
    }

    protected function _prepareColumns() {

        $this->addColumn('real_order_id', array(
            'header' => Mage::helper('sales')->__('Order #'),
            'width' => '80px',
            'type' => 'text',
            'index' => 'increment_id',
            'filter_index' => 'sfo.increment_id'
        ));

        if (!Mage::app()->isSingleStoreMode()) {
            $this->addColumn('store_id', array(
                'header' => Mage::helper('sales')->__('Purchased From (Store)'),
                'index' => 'store_id',
                'type' => 'store',
                'store_view' => true,
                'display_deleted' => true,
                'filter_index' => 'sfo.store_id'
            ));
        }

        $this->addColumn('created_at', array(
            'header' => Mage::helper('sales')->__('Purchased On'),
            'index' => 'created_at',
            'type' => 'datetime',
            'width' => '100px',
            'filter_index' => 'sfo.created_at'
        ));

        $this->addColumn('billing_name', array(
            'header' => Mage::helper('sales')->__('Bill to Name'),
            'index' => 'billing_name',
            'filter_index' => 'sfog.billing_name'
        ));

        $this->addColumn('shipping_name', array(
            'header' => Mage::helper('sales')->__('Ship to Name'),
            'index' => 'shipping_name',
            'filter_index' => 'sfog.shipping_name'
        ));

        $this->addColumn('customer_email', array(
            'header' => Mage::helper('sales')->__('Customer Email'),
            'index' => 'customer_email',
            'filter_index' => 'sfo.customer_email',
            'width' => '50px',
        ));

        $this->addColumn('region', array(
            'header' => Mage::helper('sales')->__('Shipping State'),
            'index' => 'region',
            'filter_index' => 'sfoa.region',
            'width' => '50px',
        ));

        $this->addColumn('base_grand_total', array(
            'header' => Mage::helper('sales')->__('G.T. (Base)'),
            'index' => 'base_grand_total',
            'type' => 'currency',
            'currency' => 'base_currency_code',
            'filter_index' => 'sfo.base_grand_total'
        ));

        $this->addColumn('grand_total', array(
            'header' => Mage::helper('sales')->__('G.T. (Purchased)'),
            'index' => 'grand_total',
            'type' => 'currency',
            'currency' => 'order_currency_code',
            'filter_index' => 'sfo.grand_total'
        ));

        $this->addColumn('status', array(
            'header' => Mage::helper('sales')->__('Status'),
            'index' => 'status',
            'type' => 'options',
            'width' => '70px',
            'filter_index' => 'sfo.status',
            'options' => Mage::getSingleton('sales/order_config')->getStatuses(),
        ));

        if (Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/view')) {
            $this->addColumn('action', array(
                'header' => Mage::helper('sales')->__('Action'),
                'width' => '50px',
                'type' => 'action',
                'getter' => 'getId',
                'actions' => array(
                    array(
                        'caption' => Mage::helper('sales')->__('View'),
                        'url' => array('base' => '*/sales_order/view'),
                        'field' => 'order_id'
                    )
                ),
                'filter' => false,
                'sortable' => false,
                'index' => 'stores',
                'is_system' => true,
            ));
        }
        $this->addRssList('rss/order/new', Mage::helper('sales')->__('New Order RSS'));

        $this->addExportType('*/*/exportCsv', Mage::helper('sales')->__('CSV'));
        $this->addExportType('*/*/exportExcel', Mage::helper('sales')->__('Excel XML'));

        return Mage_Adminhtml_Block_Widget_Grid::_prepareColumns();
    }

}

Надеюсь, это поможет другим.

...