Trying to add a column with a custom attribute to the admin customer grid in Magento v1.11
I’ve got this module set up like so:
config.xml
<?xml version="1.0"?>
<config>
<modules>
<WACI_AdminHtmlExt>
<version>0.1.0</version>
</WACI_AdminHtmlExt>
</modules>
<global>
<blocks>
<adminhtml>
<rewrite>
<customer_grid>WACI_AdminHtmlExt_Block_Customer_Grid</customer_grid>
</rewrite>
</adminhtml>
</blocks>
</global>
</config>
WACI/AdminHtmlExt/Block/Customer/Grid.php
<?php
/**
* Adminhtml customer grid block
*
* @category WACI
* @package WACI_AdminhtmlExt
* @author
*/
class WACI_AdminHtmlExt_Block_Customer_Grid extends Mage_Adminhtml_Block_Customer_Grid
{
protected function _prepareCollection()
{
$collection = Mage::getResourceModel('customer/customer_collection')
->addNameToSelect()
->addAttributeToSelect('email')
->addAttributeToSelect('created_at')
->addAttributeToSelect('group_id')
->addAttributeToSelect('customer_id')
->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);
return parent::_prepareCollection();
}
protected function _prepareColumns()
{
$this->addColumn('entity_id', array(
'header' => Mage::helper('customer')->__('ID'),
'width' => '50px',
'index' => 'entity_id',
'type' => 'number',
));
$this->addColumn('customer_id', array(
'header' => Mage::helper('customer')->__('Dynamics ID'),
'width' => '75px',
'index' => 'customer_id',
));
//... rest of the function, removing a couple columns...
return parent::_prepareColumns();
}
}
Customer_Id, in this case is a custom attribute (tracking an internal customer id)… Not sure if I need to add logic to render this correctly? But its showing up in the admin just fine, otherwise.
I’ve read a couple articles that mention adding a renderer for new fields in grids like this – but just as many don’t mention it at all.
Not quite sure where to go from here –
Cheers
update
Just to clarify for those needing this solution:
class WACI_AdminHtmlExt_Block_Customer_Grid extends Mage_Adminhtml_Block_Customer_Grid
{
/*protected function _prepareCollection()
{
$collection = Mage::getResourceModel('customer/customer_collection')
->addNameToSelect()
->addAttributeToSelect('email')
->addAttributeToSelect('created_at')
->addAttributeToSelect('group_id')
->addAttributeToSelect('customer_id')
->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);
return parent::_prepareCollection();
}*/
public function setCollection($collection)
{
$collection->addAttributeToSelect('customer_id');
parent::setCollection($collection);
}
protected function _prepareColumns()
{
$this->addColumn('customer_id', array(
'header' => Mage::helper('customer')->__('Dynamics ID'),
'width' => '75px',
'index' => 'customer_id',
));
$this->addColumnsOrder('customer_id','entity_id');
parent::_prepareColumns();
$this->removeColumn('billing_country_id');
return $this;
}
}
Is a what I finally landed up. Skipped the _prepareCollenctions() call.
Cheers
The problem is your return statement calling parent::_prepareCollection() combined with the fact you are extending the original class. By calling the parent class after your class you are replacing the collection object you created with the original. What you actually need to call is the parent of the class your overloading, which you can do like so…