我已经解决了问题,终于!
基本上我得到 WHERE 部分,$where = $select->getPart('where')
然后我遍历每个条件并搜索created_at
,如果我找到匹配然后我替换created_at
为main_table.created_at
。
我已经对此进行了测试,一切正常,如果有什么可能是“错误”的,请告诉我。
谢谢大家!!
public function salesOrderGridCollectionLoadBefore($observer)
{
$collection = $observer->getOrderGridCollection();
$select = $collection->getSelect();
$select->joinLeft(array('custab' => 'my_custom_table'), 'main_table.entity_id = custab.order_id',array('custab.field_to_show_in_grid'));
if ($where = $select->getPart('where')) {
foreach ($where as $key=> $condition) {
if (strpos($condition, 'created_at')) {
$new_condition = str_replace("created_at", "main_table.created_at", $condition);
$where[$key] = $new_condition;
}
}
$select->setPart('where', $where);
}
}
我正在尝试使用观察者在自定义表中的销售订单网格中添加新列。一切正常,直到我尝试使用 column 过滤网格created_at
。
问题是因为我created_at
在自定义表和sales_flat_order_grid
表中具有相同的列名 ()。
我收到此错误
SQLSTATE [23000]:违反完整性约束:1052 where 子句中的列“created_at”不明确
如果我将此行编辑'index' => 'created_at'
为
'index' => '**main_table**.created_at'
app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php
$this->addColumn('created_at', array(
'header' => Mage::helper('sales')->__('Purchased On'),
'index' => 'main_table.created_at',
'type' => 'datetime',
'width' => '100px',
));
一切正常,但我不想更改核心文件或将它们复制到本地文件夹并编辑,我认为有一些简单的解决方案需要添加到我的观察者中。
这是我的 Observer.php
class Testinggrid_ExtendOrderGrid_Model_Observer{
public function salesOrderGridCollectionLoadBefore($observer)
{
$collection = $observer->getOrderGridCollection();
$select = $collection->getSelect();
$select->joinLeft(array('custab' => 'my_custom_table'), 'main_table.entity_id = custab.order_id',array('custab.field_to_show_in_grid'));
}
}
这是我的模块布局
<layout>
<sales_order_grid_update_handle>
<reference name="sales_order.grid">
<action method="addColumnAfter">
<columnId>field_to_show_in_grid</columnId>
<arguments>
<header>Column header</header>
<index>field_to_show_in_grid</index>
<filter_index>field_to_show_in_grid</filter_index>
<type>text</type>
</arguments>
<after>shipping_name</after>
</action>
</reference>
</sales_order_grid_update_handle>
<adminhtml_sales_order_grid>
<!-- apply layout handle defined above -->
<update handle="sales_order_grid_update_handle" />
</adminhtml_sales_order_grid>
<adminhtml_sales_order_index>
<!-- apply layout handle defined above -->
<update handle="sales_order_grid_update_handle" />
</adminhtml_sales_order_index>
</layout>