You need to extend the order grid (assuming that it is already familiar to you).
in the extended php file app/code/local/Yournamespace/Yourmodule/Block/Adminhtml/.../Grid.php
class Yournamespace_Yourmodule_Block_..._Grid extends Mage_Adminhtml_Block_Sales_Order_Grid{
protected function _prepareCollection()
{
$collection = Mage::getResourceModel($this->_getCollectionClass())
->join(array('soa' => 'sales/order_address'), 'soa.parent_id=main_table.entity_id and soa.address_type = "billing"', array('full_address'=>'CONCAT(soa.firstname, " " , soa.lastname, ",<br/>", soa.street, ",<br/>", soa.city, ",<br/>", soa.region, ",<br/>", soa.postcode)' ), null,'left')
->join(array('soas' => 'sales/order_address'), 'soas.parent_id=main_table.entity_id and soas.address_type = "shipping"', array('full_address_ship'=>'CONCAT(soas.firstname, " " , soas.lastname, ",<br/>", soas.street, ",<br/>", soas.city, ",<br/>", soas.region, ",<br/>", soas.postcode)' ), null,'left');
$this->setCollection($collection);
return parent::_prepareCollection();
}
...
then inside protected function _prepareColumns()
method replace the following code
$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',
));
with
$this->addColumn('full_address', array(
'header'=> Mage::helper('sales')->__('Billing Address'),
'width' => '80px',
'type' => 'text',
'index' => 'full_address',
));
$this->addColumn('full_address_ship', array(
'header'=> Mage::helper('sales')->__('Shipping Address'),
'width' => '80px',
'type' => 'text',
'index' => 'full_address_ship',
));
You're done!
The other easy and recommended way would be using event and observer:
in your module config.xml
under config tag...
<config>
...
<adminhtml>
...
<events>
<sales_order_grid_collection_load_before>
<observers>
<vendor>
<type>singleton</type>
<class>yourmodule/adminhtml_observer</class>
<method>filterOrderCollection</method>
</vendor>
</observers>
</sales_order_grid_collection_load_before>
<core_block_abstract_prepare_layout_after>
<observers>
<vendor>
<type>singleton</type>
<class>yourmodule/adminhtml_observer</class>
<method>saleOrderLayout</method>
</vendor>
</observers>
</core_block_abstract_prepare_layout_after>
in app/code/local/Yournamespace/Yourmodule/Model/Adminhtml/Observer.php
<?php
class Yournamespace_Yourmodule_Model_Adminhtml_Observer{
public function filterOrderCollection($observer){
$collection = $observer->getEvent()->getOrderGridCollection();
$collection->join(array('soa' => 'sales/order_address'), 'soa.parent_id=main_table.entity_id and soa.address_type = "billing"', array('full_address'=>'CONCAT(soa.firstname, " " , soa.lastname, ",<br/>", soa.street, ",<br/>", soa.city, ",<br/>", soa.region, ",<br/>", soa.postcode)' ), null,'left');
$collection->join(array('soas' => 'sales/order_address'), 'soas.parent_id=main_table.entity_id and soas.address_type = "shipping"', array('full_address_ship'=>'CONCAT(soas.firstname, " " , soas.lastname, ",<br/>", soas.street, ",<br/>", soas.city, ",<br/>", soas.region, ",<br/>", soas.postcode)' ), null,'left');
}
public function saleOrderLayout($evt){
$tabBlock = $evt->getBlock();
if($tabBlock instanceof Mage_Adminhtml_Block_Sales_Order_Grid){
$tabBlock->addColumnAfter('full_address', array(
'header'=> Mage::helper('sales')->__('Billing Address'),
'width' => '80px',
'type' => 'text',
'index' => 'full_address',
), 'created_at');
$tabBlock->addColumnAfter('full_address_ship', array(
'header'=> Mage::helper('sales')->__('Shipping Address'),
'width' => '80px',
'type' => 'text',
'index' => 'full_address_ship',
), 'full_address');
}
}
}
The flat orders table contains the billing and shipping address id's so you should join against these instead of using entity_id
and filtering by shipping
or billing
. Also not all orders will have an associated shipping address (i.e downloadable products) so you should use a left join to ensure you don't remove these orders from the grid. Finally, it's best practice to use the proper getTableName()
method to pull the table names and also alias table names. Essentially you end up with:
$collection = Mage::getResourceModel($this->_getCollectionClass());
$select = $collection->getSelect();
$resource = Mage::getSingleton('core/resource');
$select->join(
array('order' => $resource->getTableName('sales/order')),
'main_table.entity_id = order.entity_id'
);
$select->join(
array('billing' => $resource->getTableName('sales/order_address')),
'order.billing_address_id = billing.entity_id',
array('billing_country' => 'country_id')
);
$select->joinLeft(
array('shipping' => $resource->getTableName('sales/order_address')),
'order.shipping_address_id = shipping.entity_id',
array('shipping_country' => 'country_id')
);
$this->setCollection($collection);
return parent::_prepareCollection();
You can then use billing_country
and shipping_country
to add the columns in your _prepareColumns()
method. Adding filter_index
ensures the correct table and column is referenced when sorting and searching:
$this->addColumn('billing_country', array(
'header' => Mage::helper('sales')->__('Billing Country'),
'index' => 'billing_country',
'filter_index' => 'billing.country_id'
));
$this->addColumn('shipping_country', array(
'header' => Mage::helper('sales')->__('Ship to Country'),
'index' => 'shipping_country',
'filter_index' => 'shipping.country_id'
));
Best Answer
You need to override
as you said. Put this code into your module, file view/adminhtml/ui_component/sales_order_grid.xml
But, this only work for newly created users. For existing users, you need to truncate table ui_bookmark as you can see on link
For a detailed explanation, you can check following
My suggestion is to put that in UpgradeData file, for example