Как добавить пользовательскую колонку в сетку продаж / заказа в Magento?

Я пытаюсь добавить собственные столбцы в свою сеть продаж / заказа. Мои столбцы будут номером отслеживания и плиткой. Название – это в основном код курьера, который показывает вам, через какой курьер вы отправили вам товар. Поэтому я сделал несколько вещей для этого.

  1. Я скопировал файл из magento/app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php в

Magento / приложение / код / ​​местные / Mage / Adminhtml / Block / Sales / Order / Grid.php

так что я могу добавить столбцы и настроить свою сеть продаж / заказов.

  1. В файле Grid.php есть функции _prepareCollections ().

Здесь код входит в него.

 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(); } 

И теперь я добавлю свои столбцы в мою функцию _prepareColumns (). Код для этого

 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', )); 

Файл 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')->__('GT (Base)'), 'index' => 'base_grand_total', 'type' => 'currency', 'currency' => 'base_currency_code', )); $this->addColumn('grand_total', array( 'header' => Mage::helper('sales')->__('GT (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)); } } 

Теперь я получаю колонки Tracking Number и Title на моей Grid. Но в моем номере отслеживания он показывает мне дубликаты записей. Например, если мой номер отслеживания 12345678, он показывает мне два значения, которые являются такими же, Как это. 12345678,12345678.

Также в моем названии он показывает Federal Express, Federal Express в течение двух раз.

Чего я хочу, это две вещи,

а. Сначала может быть 2 треканга или больше. Но это должно быть показано так. ех. 12345678,12345678900. Он должен быть отличным.

Для некоторых из моих заказов нет, это показывает отчетливое. Но у большинства из них есть повторяющиеся записи.

б. Во-вторых, если курьер отправляется федеральным экспресс, а затем, если продукт возвращается, и мы отправляем по bluedart, тогда он должен показать федеральный экспресс, bluedart. Но я получаю федеральный экспресс, федеральный экспресс, синий дарт, синий дротик.

Он показывает мне 4 раза.

Я не знаю, в чем именно проблема, с которой я столкнулся. Является ли любая проблема с базой данных или запросом, который я написал.

Пожалуйста, дайте мне знать,

 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(); } 

Эта функция верна, а также написанный в ней запрос.

Отредактировано PArt

Я также хочу, чтобы фильтр track_number и title в моей 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; } 

Теперь я добавил условие фильтра к моей добавочной колонке,

 $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'), )); 

Но я не могу фильтровать в своей сетке продаж / заказа. Пожалуйста, дайте мне знать решение для этого.

Спасибо и с уважением.

Если в вашем методе _prepareCollection я печатаю запрос через:

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

Я получаю это:

 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 

По этому запросу я всегда получаю результат, даже «пустую» строку, если на столе нет заказов. Скорее, я думаю, что то, что вы пытаетесь достичь, может быть выполнено с помощью подзапросов:

 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`; 

Поэтому, чтобы перевести это для 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(); } 

К вашему вопросу о дублированных названиях носителей, которые можно ожидать в таком случае. Единственный способ – добавить слово DISTINCT в подзапрос для названия, например:

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

Но я не уверен, что вы планируете делать с этими данными в сетке. Надеюсь, это поможет.

Сначала вы не используете хороший способ переписать файл Magento. Взгляните на это:

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

Как только вы это сделали, в Grid.php do

 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(); } 

Затем в методе _prepareColumn добавьте

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