我有2个自定义colletions。 平时收集与平面数据。 我需要加入他们的客户选择。 它的工作原理罚款innerJoin,但过滤和排序为连接字段不起作用。 我该如何解决这个问题?
_prepareCollection()的例子
$collection = Mage::getResourceModel('customer/customer_collection')
->addNameToSelect()
->addAttributeToSelect('email');
$collection
->getSelect()
->joinInner(array('my_table' => $collection->getTable('my/table')), 'e.entity_id = my_table.customer_id', array('custom_field' => my_table.custom_field))
->joinInner(array('my_table1' => $collection->getTable('my/table1')), 'my_table1.other_id = my_table.id', array('custom_field1' => my_table1.custom_field));
$this->setCollection($collection);
return parent::_prepareCollection();
因此,排序和过滤不会为custom_field和custom_field1工作
添加列呼叫:
$this->addColumn('custom_field',
array(
'header'=>$this->__('Shopping club name'),
'index'=>'custom_field',
'filter_index'=>'my_table.custom_field',
));
同时过滤我得到致命错误:
Call to a member function getBackend() on a non-object
排序不工作,显示没有错误
如果平加入到平表“filter_index”工作正常。 但这里扁平连接到EAV。
这是不是太硬都实际上!
当我这样做,我加入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);
}
接下来,我们将列添加到网格。 请注意,我们定义两个回调。 '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);
}
希望这可以帮助别人。
你能告诉)addColumn(的呼叫,增加了你的属性网格?
它应该是这样的:
$this->addColumn('custom_field', array(
...
'filter_index' => 'my_table.custom_field',
...
));
也许你的“filter_index”键设置别名值。
我写了一篇关于这个的文章。 看看这里: http://blog.fabian-blechschmidt.de/joining-a-flat-table-on-eav/希望它能帮助。
文章来源: Magento Grid - sortering and filtering works incorrectly after joining flat table to EAV