Column Types
Take a look at Mage_Adminhtml_Block_Widget_Grid_Column::_getRendererByType()
to dive into the different column types:
app\code\core\Mage\Adminhtml\Block\Widget\Grid\Column\Renderer\Abstract.php
- date
- datetime
- number
- currency
- price
- country
- concat
- action
- options
- checkbox
- massaction
- radio
- input
- select
- text
- store
- wrapline
- theme
Code Snippets
Checkbox
See app\code\core\Mage\Adminhtml\Block\Widget\Grid\Column\Renderer\Checkbox.php
.
protected function _prepareColumns()
{
$this->addColumn('apply_to_product', [
'header_css_class' => 'a-center',
'type' => 'checkbox',
'name' => 'apply_to_product',
'field_name' => 'selected_products[]',
'values' => $this->_getSelectedProducts(),
'align' => 'center',
'index' => 'product_id'
]);
}
protected function _getSelectedProducts()
{
return $this->getRequest()->getPost('selected_products', []);
}
/**
* Retrieve AJAX URL for grid when filtering or resetting
*
* @return string
*/
public function getGridUrl()
{
return $this->getUrl('*/*/product', ['_current'=>true]);
}
Currency
// Specify the currency code.
$this->addColumn('unit_price', [
'header' => $helper->__('Unit Price'),
'index' => 'unit_price',
'width' => '80px',
'sortable' => false,
'filter' => false,
'type' => 'currency',
'currency_code' => 'MYR',
]);
// Currency code is specified in another column.
$this->addColumn('billing_amount', [
'header' => $helper->__('Billing Amount'),
'index' => 'billing_amount',
'type' => 'currency',
'currency' => 'billing_currency_code',
]);
Date Time
$this->addColumn('created_at', [
'header' => $helper->__('Requested At'),
'index' => 'created_at',
'type' => 'datetime',
'width' => '100px',
'align' => 'center',
'filter_index' => 'main_table.created_at',
'gmtoffset' => true
]);
$this->addColumn('pickup_at', [
'header' => $helper)->__('Pickup At'),
'width' => '80px',
'index' => 'pickup_at',
'start_time'=> 'o_created_at', //order creaton time
'cond' => 'order_lot_id', //condition: if !order_lot_id then return ''
'format' => 'h:m:s a',
'renderer' => 'patron/adminhtml_order_grid_renderer_duration',
'filter' => false,
'sort' => false
]);
$this->addColumn('to_deliver_at', [
'header' => $helper->__('To Deliver At'),
'width' => '80px',
'index' => 'to_deliver_at',
'start_time'=> 'o_created_at', //order creaton time
'cond' => 'order_id', //condition: if !order_id then return ''
'format' => 'h:m:s a',
'renderer' => 'patron/adminhtml_order_grid_renderer_duration',
'filter' => false,
'sort' => false
]);
Action Column
$this->addColumn('action', [
'header' => $helper->__('Action'),
'width' => '50px',
'type' => 'action',
'getter' => 'getCompanyId', // Only one possible getter for row.
'actions' => [ // Can fit multiple actions.
[
'caption' => $helper->__('Utilization'),
'popup' => true, // Popup new browser window.
'url' => [
'base' => '*/*/utilization',
'params' => [
'member_id' => $this->getMemberId(),
//'plan_id => $row->getPlanId(), // No can do!
]
],
'field' => 'company_id' // Merge to params: 'company_id' => $row->getCompanyId() ]
],
'filter' => false,
'sortable' => false,
]);
Use callback to construct the URL:
$this->addColumn('action', [
'header' => $helper->__('Action'),
'width' => '50px',
'type' => 'action',
'getter' => [$this, 'getFilterParams'],
'actions' => [
[
'caption' => $helper->__('Utilization'),
'popup' => true,
'url' => ['base' => '*/utilization'],
'field' => 'filter'
]
],
'filter' => false,
'sortable' => false,
]);
return parent::_prepareColumns();
}
/**
*
* @param Varien_Object $row
* @return string
*/
public function getFilterParams(Varien_Object $row)
{
$params = "company={$row->getCompanyId()}&member_id={$this->getMemberId()}&plan={$row->getPlanId()}";
return Mage::helper('core/string')->urlEncode($params);
}
Misc
$this->addColumn('entity_id', array(
'header' => Mage::helper('moe')->__('Med#'),
'width' => '30px',
'index' => 'entity_id',
'filter_index'=>'main_table.entity_id'
));
$this->addColumn('amount', [
'header'=> $helper->__('Amount'),
'width' => '80px',
'index' => 'amount',
'type' => 'number'
]);
$this->addColumn('response_body', array(
'header' => Mage::helper('moe')->__('Response Body'),
'index' => 'response_body',
'sortable' => false,
'filter' => false,
'type' => 'text', // uses 'adminhtml/widget_grid_column_renderer_longtext'
'truncate' => 420,
'frame_callback' => array($this, 'extractData'),
'noescape' => false
));
$this->addColumn('enabled', array(
'header' => Mage::helper('moe')->__('Enabled'),
'align' => 'left',
'width' => '60px',
'index' => 'enabled',
'type' => 'options',
'options' => array(
1 => Mage::helper('moe')->__('Yes'),
0 => Mage::helper('moe')->__('No')
),
$this->addColumn('amount', array(
'header' => Mage::helper('accountpayment')->__('Amount'),
'type' => 'currency',
'currency' => 'currency_code',
'width' => 80,
'index' => 'amount'
));
$options = Mage::getSingleton('sales/order_config')->getStatuses();
$options['require_correction_follow_up'] = $this->__('Follow up for required correction');
$this->addColumn('status', array(
'header' => Mage::helper('sales')->__('Status'),
'index' => 'status',
'type' => 'options',
'width' => '200px',
'filter'=> 'adminhtml/widget_grid_column_filter_text',
'options' => $options,
'filter_condition_callback' => array($this, '_statusFilter')
));
// ref: Mage_Adminhtml_Block_Catalog_Category_Tab_Product
$this->addColumn('crosslink', array(
'header_css_class' => 'a-center',
'type' => 'checkbox',
'name' => 'crosslink',
'values' => $this->_crosslinkStundetIds,
'align' => 'center',
'index' => 'entity_id'
));
$this->addColumn('country_id', array(
'header' => Mage::helper('swms')->__('Country'),
'index' => 'country_id',
'width' => '100',
'type' => 'country',
));
Custom Renderers
There are 2 ways to custom render the grid's cell, using a class and using a callback.
// Define param 'renderer' => 'patron/adminhtml_order_grid_renderer_duration in addColumn()
class Sxxxxx_Patron_Block_Adminhtml_Order_Grid_Renderer_Duration extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Datetime
{
public function render(Varien_Object $row)
{
$col = $this->getColumn();
//if no order lot, can't pickup
if (!$row->getData($col->getCond())) {
return '';
}
$time2 = $row->getData($col->getIndex()); //UTC
$time1 = strtotime($row->getData($col->getStartTime()));
if ($time2) {
$strRender = parent::render($row);
$minutes = round((strtotime($time2) - $time1)/60, 0);
$strRender .= " <$minutes>";
} else {
$minutes = round((time() - $time1)/60, 0);
$strRender = "<$minutes>";
}
return $strRender;
}
}
Callback within the grid class:
// ...
$this->addColumn('admin_updated_at', array(
'header' => Mage::helper('module')->__('Updated At'),
'index' => 'admin_created_at',
'type' => 'datetime',
'frame_callback' => [$this, 'decorateUserUpdatedAt'],
));
//...
/**
* @param string $value
* @param Varien_Object $row
* @param Mage_Adminhtml_Block_Widget_Grid_Column $column
* @param bool $isExport
* @return string
*/
public function decorateUserUpdatedAt($value, $row, $column, $isExport)
{
if (!$isExport && $value > $row->getAdminUpdatedAt()) {
$cell = '<strong><span class="not-available">' . $value . '</span></strong>';
} else {
$cell = $value;
}
return $cell;
}
Column attribute escape
, set to false
to not escape HTML.
class Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Longtext
extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract
{
/**
* Render contents as a long text
*
* Text will be truncated as specified in string_limit, truncate or 250 by default
* Also it can be html-escaped and nl2br()
*
* @param Varien_Object $row
* @return string
*/
public function render(Varien_Object $row)
{
$truncateLength = 250;
// stringLength() is for legacy purposes
if ($this->getColumn()->getStringLimit()) {
$truncateLength = $this->getColumn()->getStringLimit();
}
if ($this->getColumn()->getTruncate()) {
$truncateLength = $this->getColumn()->getTruncate();
}
$text = Mage::helper('core/string')->truncate(parent::_getValue($row), $truncateLength);
if ($this->getColumn()->getEscape() !== FALSE) {
$text = $this->escapeHtml($text);
}
if ($this->getColumn()->getNl2br()) {
$text = nl2br($text);
}
return $text;
}
}
Add additional js
/**
* Convert the status dropdown for filtering to autocompleter
*/
public function getAdditionalJavaScript()
{
return $this->getLayout()
->createBlock('****/adminhtml_widget_grid_column_filter_autocompleter')
->setColumn($this->getColumn('status'))
->toHtml();
}
filter_condition_callback
$this->addColumn('apply_to', array(
'header' => Mage::helper('benefit')->__('Apply To'),
'align' => 'left',
'index' => 'apply_to',
'renderer' => 'benefit/adminhtml_attribute_grid_renderer_applyTo',
'type' => 'options',
'options' => Mage::helper('benefit')->getCustomerGroupOptionHash(),
'filter_condition_callback' => [$this, '_findInSet'],
'filter_title' => 'set the HTML element title attribute',
));
return $this;
}
protected function _findInSet($collection, $column)
{
if ($value = $column->getFilter()->getValue()) {
$collection->addFieldToFilter('apply_to', ['finset' => $value]);
}
}
/**
* Allow wildcard % in column search
*
* @param Mage_Core_Model_Resource_Db_Collection_Abstract $collection
* @param Mage_Adminhtml_Block_Widget_Grid_Column $column
*/
protected function _allowWildcardInFilter($collection, $column)
{
if ($value = $column->getFilter()->getValue()) {
if ($field = $column->getFilterIndex() ?: $column->getIndex()) {
/** @var Mage_Core_Model_Resource_Helper_Mysql4 $helper */
$helper = Mage::getResourceHelper('core');
$likeExpression = $helper->addLikeEscape($value, [
'position' => 'any',
'allow_string_mask' => true
]);
$collection->addFieldToFilter($field, ['like' => $likeExpression]);
}
}
}
Posted by kiatng to OpenMage (2015-08-05 08:27)