To add a column to the customer grid, you need to override 2 things in the block Mage_Adminhtml_Block_Customer_Grid
.
_prepareCollection
- to add your attribute in the collection
_prepareColumns
- to add the column in your grid.
For this you should create a new extension. Let's call it Easylife_Customer
. For this you will need the following files:
app/etc/module/Easylife_Customer.xml
- the declaration file
<?xml version="1.0"?>
<config>
<modules>
<Easylife_Customer>
<active>true</active>
<codePool>local</codePool>
<depends>
<Mage_Customer /><!-- your module should depend on Mage_Customer -->
<Mage_Adminhtml /><!-- your module should depend on Mage_Adminhtml also -->
</depends>
</Easylife_Customer>
</modules>
</config>
app/code/local/Easylife/Customer/etc/config.xml
- the configuration file
<?xml version="1.0"?>
<config>
<modules>
<Easylife_Customer>
<version>0.0.1</version>
</Easylife_Customer>
</modules>
<global>
<blocks>
<adminhtml>
<rewrite>
<customer_grid>Easylife_Customer_Block_Adminhtml_Customer_Grid</customer_grid><!-- rewrite the customer grid -->
</rewrite>
</adminhtml>
</blocks>
</global>
</config>
app/code/local/Easylife/Customer/Block/Adminhtml/Customer/Grid.php
- your own version of the customer grid. Read my comments in the code:
<?php
class Easylife_Customer_Block_Adminhtml_Customer_Grid extends Mage_Adminhtml_Block_Customer_Grid{
/**
* override the _prepareCollection to add an other attribute to the grid
* @return $this
*/
protected function _prepareCollection(){
$collection = Mage::getResourceModel('customer/customer_collection')
->addNameToSelect()
->addAttributeToSelect('email')
->addAttributeToSelect('created_at')
->addAttributeToSelect('group_id')
//if the attribute belongs to the customer, use the line below
->addAttributeToSelect('mobile')
//if the attribute belongs to the customer address, comment the line above and use the one below
//->joinAttribute('mobile', 'customer_address/mobile', 'default_billing', null, 'left')
->joinAttribute('billing_postcode', 'customer_address/postcode', 'default_billing', null, 'left')
->joinAttribute('billing_city', 'customer_address/city', 'default_billing', null, 'left')
->joinAttribute('billing_telephone', 'customer_address/telephone', 'default_billing', null, 'left')
->joinAttribute('billing_region', 'customer_address/region', 'default_billing', null, 'left')
->joinAttribute('billing_country_id', 'customer_address/country_id', 'default_billing', null, 'left');
$this->setCollection($collection);
//code from Mage_Adminhtml_Block_Widget_Grid::_prepareCollection()
//since calling parent::_prepareCollection will render the code above useless
//and you cannot call in php parent::parent::_prepareCollection()
if ($this->getCollection()) {
$this->_preparePage();
$columnId = $this->getParam($this->getVarNameSort(), $this->_defaultSort);
$dir = $this->getParam($this->getVarNameDir(), $this->_defaultDir);
$filter = $this->getParam($this->getVarNameFilter(), null);
if (is_null($filter)) {
$filter = $this->_defaultFilter;
}
if (is_string($filter)) {
$data = $this->helper('adminhtml')->prepareFilterString($filter);
$this->_setFilterValues($data);
}
else if ($filter && is_array($filter)) {
$this->_setFilterValues($filter);
}
else if(0 !== sizeof($this->_defaultFilter)) {
$this->_setFilterValues($this->_defaultFilter);
}
if (isset($this->_columns[$columnId]) && $this->_columns[$columnId]->getIndex()) {
$dir = (strtolower($dir)=='desc') ? 'desc' : 'asc';
$this->_columns[$columnId]->setDir($dir);
$this->_setCollectionOrder($this->_columns[$columnId]);
}
if (!$this->_isExport) {
$this->getCollection()->load();
$this->_afterLoadCollection();
}
}
return $this;
}
/**
* override the _prepareColumns method to add a new column after the 'email' column
* if you want the new column on a different position just change the 3rd parameter
* of the addColumnAfter method to the id of your desired column
*/
protected function _prepareColumns(){
$this->addColumnAfter('mobile', array(
'header' => Mage::helper('customer')->__('Mobile'),
'index' => 'mobile'
),'email');
return parent::_prepareColumns();
}
}
Clear the cache and you should be ready.
Best Answer
You cannot use
Zend_Db_Expr
as third param of joinTable, because it should be the array which contains the list of field names from joined table. Try to get select from collection and to use join function for your purpose.Hope that will help you.