これは実際にはそれほど難しいことではありません!
これを行ったとき、last_loginをカスタマーグリッドに追加していました。
すでに実行した最初のステップですが、完全を期すためにここに含めますが、最初のselectステートメントに列を追加することです。
/**
* set collection object
*
* @param Mage_Customer_Model_Resource_Customer_Collection $collection
*/
public function setCollection($collection)
{
//Group by email since multiple customer_ids can exist in the log/customer.
$collection->groupByEmail();
//join the last_login field here.
$collection->getSelect()->joinLeft(array('c_log' => $collection->getTable('log/customer')), 'c_log.customer_id=e.entity_id', array('last_login' => 'login_at'));
parent::setCollection($collection);
}
次に、列をグリッドに追加します。2つのコールバックを定義していることに注意してください。'filter_condition_callback'はストックMagentoです。奇妙なことに、これをソートするためのコールバックインデックスはありません(私が知る限り)。並べ替えコールバックを追加する必要があります。そうしないと、新しい列を並べ替えることができません。
$this->addColumnAfter('last_login', array(
'header' => Mage::helper('customer')->__('Last Login'),
'type' => 'datetime',
'align' => 'center',
'index' => 'last_login',
'filter_index' => '`c_log`.`login_at`',
'gmtoffset' => true,
//Stock Magento Callback - Notice the callback key has been assigned.
'filter_condition_callback' => 'filter_last_login',
//Custom Callback Index
'order_callback' => 'sort_last_login'
), 'customer_since');
次に、フィルタリングと並べ替えを処理するコールバック関数を追加します。
if (!function_exists('filter_last_login')) {
/**
* @param Mage_Customer_Model_Resource_Customer_Collection $collection
* @param Mage_Adminhtml_Block_Widget_Grid_Column $column
*/
function filter_last_login($collection, $column)
{
if (!$column->getFilter()->getCondition()) {
return;
}
$condition = $collection->getConnection()
->prepareSqlCondition('c_log.login_at', $column->getFilter()->getCondition());
$collection->getSelect()->where($condition);
}
}
if (!function_exists('sort_last_login')) {
/**
* @param Mage_Customer_Model_Resource_Customer_Collection $collection
* @param Mage_Adminhtml_Block_Widget_Grid_Column $column
*/
function sort_last_login($collection, $column)
{
$collection->getSelect()->order($column->getIndex() . ' ' . strtoupper($column->getDir()));
}
}
最後に、order_callbackは実際のインデックスではないため、デフォルトの並べ替えメカニズムの代わりに定義されている場合は、このコールバックを呼び出す必要があります。これは私がそれを達成した方法です:
/**
* Sets sorting order by some column
*
* @param Mage_Adminhtml_Block_Widget_Grid_Column $column
*
* @return Mage_Adminhtml_Block_Widget_Grid
*/
protected function _setCollectionOrder($column)
{
if ($column->getOrderCallback()) {
call_user_func($column->getOrderCallback(), $this->getCollection(), $column);
return $this;
}
return parent::_setCollectionOrder($column);
}
これが誰かを助けることを願っています。