简体   繁体   English

如何在Magento的销售/订单网格中添加自定义列?

[英]How to add Custom Column in sales/order grid in Magento?

I am trying to add custom columns to my sales/order grid. 我试图将自定义列添加到我的销售/订单网格中。 My columns will be the tracking number and the tile. 我的专栏将是跟踪号和磁贴。 The title is basically the courier code which shows you through which courier you have send you product. 标题基本上是快递代码,向您显示通过哪个快递发送产品。 So i have done some following things for this. 所以我为此做了一些下面的事情。

  1. I have copied the file from magento/app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php to 我已将文件从magento/app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php

magento/app/code/local/Mage/Adminhtml/Block/Sales/Order/Grid.php Magento的/应用/代码/本地/法师/ Adminhtml /座/销售/订单/ Grid.php

so that i can add columns and customize my sales/order grid. 这样我就可以添加列并自定义我的销售/订单网格。

  1. In the file Grid.php, There is _prepareCollections() functions. 在文件Grid.php中,有_prepareCollections()函数。

Here the code goes into it. 代码在这里。

protected function _prepareCollection()
    {
        $collection = Mage::getResourceModel($this->_getCollectionClass());
        $this->setCollection($collection);
        $collection->getSelect();
        $collection->getSelect()->join('sales_flat_shipment_track', 'main_table.entity_id =sales_flat_shipment_track.order_id',array('track_number'=> new Zend_Db_Expr('group_concat(sales_flat_shipment_track.track_number SEPARATOR ",")'),'title' => new Zend_Db_Expr('group_concat(sales_flat_shipment_track.title SEPARATOR ",")')));
        return parent::_prepareCollection();    
    }

And Now i will add my columns here in my _prepareColumns() function. 现在,我将在_prepareColumns()函数中添加我的列。 Code for that is 的代码是

protected function _prepareColumns()
    {
        $this->addColumn('track_number', array(
            'header'=> Mage::helper('sales')->__(' Track Number'),
            'width' => '80px',
            'type'  => 'text',
            'index' => 'track_number',
            ));
        $this->addColumn('title', array(

            'header'=> Mage::helper('sales')->__('Title'),
            'width' => '80px',
            'index' => 'title',
            ));

The file Grid.php is here. 文件Grid.php在这里。

<?php
/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Open Software License (OSL 3.0)
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/osl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    Mage
 * @package     Mage_Adminhtml
 * @copyright   Copyright (c) 2014 Magento Inc. (http://www.magentocommerce.com)
 * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 */

/**
 * Adminhtml sales orders grid
 *
 * @category   Mage
 * @package    Mage_Adminhtml
 * @author      Magento Core Team <core@magentocommerce.com>
 */
class Mage_Adminhtml_Block_Sales_Order_Grid extends Mage_Adminhtml_Block_Widget_Grid
{

    public function __construct()
    {
        parent::__construct();
        $this->setId('sales_order_grid');
        $this->setUseAjax(true);
        $this->setDefaultSort('created_at');
        $this->setDefaultDir('DESC');
        $this->setSaveParametersInSession(true);
    }

    /**
     * Retrieve collection class
     *
     * @return string
     */
    protected function _getCollectionClass()
    {
        return 'sales/order_grid_collection';
    }

    protected function _prepareCollection()
    {
        $collection = Mage::getResourceModel($this->_getCollectionClass());
        $this->setCollection($collection);
        $collection->getSelect();
        $collection->getSelect()->join('sales_flat_shipment_track', 'main_table.entity_id =sales_flat_shipment_track.order_id',array('track_number'=> new Zend_Db_Expr('group_concat(sales_flat_shipment_track.track_number SEPARATOR ",")'),'title' => new Zend_Db_Expr('group_concat(sales_flat_shipment_track.title SEPARATOR ",")')));
        return parent::_prepareCollection();    
    }

    protected function _prepareColumns()
    {
        $this->addColumn('track_number', array(
            'header'=> Mage::helper('sales')->__(' Track Number'),
            'width' => '80px',
            'type'  => 'text',
            'index' => 'track_number',
            ));
        $this->addColumn('title', array(

            'header'=> Mage::helper('sales')->__('Title'),
            'width' => '80px',
            'index' => 'title',
            ));

        $this->addColumn('real_order_id', array(
            'header'=> Mage::helper('sales')->__('Order #'),
            'width' => '80px',
            'type'  => 'text',
            'index' => '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,
            ));
        }

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

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

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

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

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

        $this->addColumn('status', array(
            'header' => Mage::helper('sales')->__('Status'),
            'index' => 'status',
            'type'  => 'options',
            'width' => '70px',
            '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',
                            'data-column' => 'action',
                        )
                    ),
                    '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 parent::_prepareColumns();
    }

    protected function _prepareMassaction()
    {
        $this->setMassactionIdField('entity_id');
        $this->getMassactionBlock()->setFormFieldName('order_ids');
        $this->getMassactionBlock()->setUseSelectAll(false);

        if (Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/cancel')) {
            $this->getMassactionBlock()->addItem('cancel_order', array(
                 'label'=> Mage::helper('sales')->__('Cancel'),
                 'url'  => $this->getUrl('*/sales_order/massCancel'),
            ));
        }

        if (Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/hold')) {
            $this->getMassactionBlock()->addItem('hold_order', array(
                 'label'=> Mage::helper('sales')->__('Hold'),
                 'url'  => $this->getUrl('*/sales_order/massHold'),
            ));
        }

        if (Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/unhold')) {
            $this->getMassactionBlock()->addItem('unhold_order', array(
                 'label'=> Mage::helper('sales')->__('Unhold'),
                 'url'  => $this->getUrl('*/sales_order/massUnhold'),
            ));
        }

        $this->getMassactionBlock()->addItem('pdfinvoices_order', array(
             'label'=> Mage::helper('sales')->__('Print Invoices'),
             'url'  => $this->getUrl('*/sales_order/pdfinvoices'),
        ));

        $this->getMassactionBlock()->addItem('pdfshipments_order', array(
             'label'=> Mage::helper('sales')->__('Print Packingslips'),
             'url'  => $this->getUrl('*/sales_order/pdfshipments'),
        ));

        $this->getMassactionBlock()->addItem('pdfcreditmemos_order', array(
             'label'=> Mage::helper('sales')->__('Print Credit Memos'),
             'url'  => $this->getUrl('*/sales_order/pdfcreditmemos'),
        ));

        $this->getMassactionBlock()->addItem('pdfdocs_order', array(
             'label'=> Mage::helper('sales')->__('Print All'),
             'url'  => $this->getUrl('*/sales_order/pdfdocs'),
        ));

        $this->getMassactionBlock()->addItem('print_shipping_label', array(
             'label'=> Mage::helper('sales')->__('Print Shipping Labels'),
             'url'  => $this->getUrl('*/sales_order_shipment/massPrintShippingLabel'),
        ));

        return $this;
    }

    public function getRowUrl($row)
    {
        if (Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/view')) {
            return $this->getUrl('*/sales_order/view', array('order_id' => $row->getId()));
        }
        return false;
    }

    public function getGridUrl()
    {
        return $this->getUrl('*/*/grid', array('_current'=>true));
    }

}

Now I am getting the columns Tracking Number and Title on my Grid. 现在,我在网格上获得了“跟踪编号”和“标题”列。 But in my tracking number ,its showing me the duplicate entries. 但是在我的跟踪编号中,它显示了重复的条目。 For example, If my tracking number is 12345678, It shows me two values which are same, Like this. 例如,如果我的跟踪号是12345678,它会向我显示两个相同的值,就像这样。 12345678,12345678. 12345678,12345678。

Also in my title, It shows Federal Express,Federal express for two times. 同样在我的标题中,它两次显示联邦快递,联邦快递。

What i want is two things, 我想要的是两件事,

a. 一种。 First There can be 2 tracking nos, or more than that. 首先,可以有2个跟踪编号,或更多。 But it should be shown like this. 但是应该这样显示。 ex. 恩。 12345678,12345678900. 12345678,12345678900。 It should be distinct. 它应该与众不同。

For some of my order no it shows distinct. 对于我的某些订单,不显示它与众不同。 But most of them have duplicate entries. 但是它们大多数都有重复的条目。

b. Secondly if the courier is send by federal express and then if the product returns and we send by bluedart then it should show federal express, bluedart . 其次,如果快递是通过联邦快递寄出的,然后如果产品退货而我们是通过bluedart发送的,则它应该显示联邦快递bluedart。 But what i am getting is federal express,federal express, blue dart,blue dart. 但是我得到的是联邦快递,联邦快递,蓝色飞镖,蓝色飞镖。

It is showing me 4 times. 它显示了4次。

I don't know what exactly problem i am facing. 我不知道我到底要面对什么问题。 Is der any database problem or the query i have written. 是任何数据库问题或我编写的查询。

Please let me know whether 请让我知道是否

protected function _prepareCollection()
        {
            $collection = Mage::getResourceModel($this->_getCollectionClass());
            $this->setCollection($collection);
            $collection->getSelect();
            $collection->getSelect()->join('sales_flat_shipment_track', 'main_table.entity_id =sales_flat_shipment_track.order_id',array('track_number'=> new Zend_Db_Expr('group_concat(sales_flat_shipment_track.track_number SEPARATOR ",")'),'title' => new Zend_Db_Expr('group_concat(sales_flat_shipment_track.title SEPARATOR ",")')));
            return parent::_prepareCollection();    
        }

This function is correct and also the query written in it. 此函数是正确的,并且其中写入了查询。

Edited PArt 编辑部分

I also want to filter the track_number and title in my grid.php. 我也想在我的grid.php中过滤track_number和标题。 I have tried some of the things. 我已经尝试了一些东西。

This code goes in grid.php, 这段代码放在grid.php中,

protected function spaceSeparatedFilter($collection, $column)
{
    $value = $column->getFilter()->getValue();
    if (!$value) {

        return $this;
    }
    //if there was a space input
        else if(preg_match('/s+/', $value))
    {
        //explode by space, getting array of IDs
        $val = explode(" ", $value);
        //filter the collection, where collection index (order_id) is present in $val array
        $this->getCollection()->addAttributeToFilter($column->getData('index'), array('in'=>$val));
    }
    else
    {
    //else use default grid filter functionality (like $value input)
    $this->getCollection()->addAttributeToFilter($column->getData('index'), array('like' => '%'.$value.'%'));
    }
    return $this;
}

Now i have added filter condition to my addcolumn, 现在,我已将过滤条件添加到我的addcolumn中,

$this->addColumn('track_number', array(
            'header'=> Mage::helper('sales')->__(' Track Number'),
            'width' => '80px',
            'type'  => 'text',
            'index' => 'track_number',
            'filter_condition_callback' => array($this, 'spaceSeparatedFilter'),
            ));

        $this->addColumn('title', array(
            'header'=> Mage::helper('sales')->__('Title'),
            'width' => '80px',
            'index' => 'title',
            'filter_condition_callback' => array($this, 'spaceSeparatedFilter'),
            ));

But i am not able to filter in my sales/order grid. 但是我无法在销售/订单网格中进行过滤。 Please let me know the solution for this. 请让我知道解决方案。

Thanks and Regards. 谢谢并恭祝安康。

If in your _prepareCollection method I print the query via: 如果在您的_prepareCollection方法中,我通过以下方式打印查询:

echo $collection->getSelect()->assemble();

I get this: 我得到这个:

SELECT 
    `main_table`.*, 
    group_concat(sales_flat_shipment_track.track_number SEPARATOR ",") AS `track_number`, 
    group_concat(sales_flat_shipment_track.title SEPARATOR ",") AS `title` 

FROM `sales_flat_order_grid` AS `main_table` 

INNER JOIN `sales_flat_shipment_track` 
    ON main_table.entity_id = sales_flat_shipment_track.order_id

By this query I will always get a result, even an "empty" row when there are no orders on the table. 通过此查询,我将始终获得结果,即使表上没有订单,即使是“空”行也是如此。 Rather, I think what you are trying to achieve can be done using subqueries: 相反,我认为您可以尝试使用子查询来实现:

SELECT 
    `main_table`.*, 
    (
        SELECT 
            group_concat(`t`.`track_number` SEPARATOR ",") AS `track_number`

        FROM `sales_flat_shipment_track` AS `t`

        WHERE `main_table`.`entity_id` = `t`.`order_id`
    ),
    (
        SELECT 
            group_concat(`t`.`title` SEPARATOR ",") AS `title`

        FROM `sales_flat_shipment_track` as `t`

        WHERE `main_table`.`entity_id` = `t`.`order_id`
    )

FROM `sales_flat_order_grid` AS `main_table`;

So to translate that for Magento, it would look something like this: 因此,对于Magento来说,它看起来像这样:

protected function _prepareCollection()
{
    $collection = Mage::getResourceModel('sales/order_grid_collection');

    $collection->getSelect()
        ->from(
            array(),
            array(
                'track_number' => new Zend_Db_Expr('(
                    SELECT GROUP_CONCAT(`t`.`track_number` SEPARATOR ",")
                    FROM `sales_flat_shipment_track` as `t`
                    WHERE `main_table`.`entity_id` = `t`.`order_id`
                )'),
                'title' => new Zend_Db_Expr('(
                    SELECT GROUP_CONCAT(`t`.`title` SEPARATOR ",")
                    FROM `sales_flat_shipment_track` as `t`
                    WHERE `main_table`.`entity_id` = `t`.`order_id`
                )'),
            )
        );

    $this->setCollection($this);

    return parent::_prepareCollection();
}

To your point about the duplicate carrier titles, that is to be expected in a case like this. 就重复的承运人标题而言,在这种情况下是可以预期的。 The only way around it is to add a DISTINCT word in the sub-query for the title, like this: 唯一的解决方法是在标题的子查询中添加DISTINCT单词,如下所示:

SELECT GROUP_CONCAT(DISTINCT `t`.`title` SEPARATOR ",")

But I'm not sure what you plan to do with this data in the grid. 但是我不确定您打算如何处理网格中的这些数据。 Hope that helps. 希望能有所帮助。

First you're not using the good way to rewrite a Magento file. 首先,您没有使用重写Magento文件的好方法。 Take a look a this : 看看这个:

http://inchoo.net/magento/how-to-extend-magento-order-grid/ http://inchoo.net/magento/how-to-extend-magento-order-grid/

Once you did it, in Grid.php do 完成后,在Grid.php中

protected function _prepareCollection() {
    $collection = Mage::getResourceModel ( $this->_getCollectionClass () );
    $collection->join(array('so'=>'sales/order'), 'main_table.entity_id=so.entity_id', array('your_coustom_field'=>'your_coustom_field', 'customer_email'=>'customer_email' ), null,'left');
    $this->setCollection ( $collection );
    return parent::_prepareCollection();
}

Then in _prepareColumn method add 然后在_prepareColumn方法中添加

$this->addColumn ( 'customer_email', array (
    'header' => Mage::helper ( 'sales' )->__ ( 'customer email' ),
    'index' => 'customer_email'
) );

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM