Исправленный ответ (из-за двух проблемных ошибок)
Я переписываю этот ответ более дружелюбным, пошаговым способом, чтобы надеяться помочь кому-то еще.
Примечание: Это для локального изменения в app/code/local/Mage/Adminhtml/Block/Sales/Order/Grid.php
A. Чтобы все работало корректно, сначала нужно изменить _getCollectionClass()
с этого:
protected function _getCollectionClass()
{
return 'sales/order_grid_collection';
}
к этому:
protected function _getCollectionClass()
{
//return 'sales/order_grid_collection';
return 'sales/order_collection';
}
При выполнении этого я столкнулся с сильной головной болью:
SQLSTATE [23000]: Нарушение ограничения целостности: 1052 Столбец «made_at» в где условие неоднозначно
Это происходит при попытке фильтрации / поиска в сетке по столбцу Покупка по .
Чтобы избежать / исправить эту ошибку, вам нужно изменить коллекцию И и добавить следующее к _prepareCollection()
И добавить filter_index
к каждому из добавленных столбцов к сетке.
Вы также столкнетесь с другой головной болью
SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец «имя_биллинга» в «предложении где»
ЕСЛИ в _prepareCollection()
вы пытаетесь динамически создать столбцы Имя биллинга или Имя доставки , которое выглядит следующим образом:
$collection->getSelect()->columns(new Zend_Db_Expr("CONCAT(s2.firstname, ' ',s2.lastname) AS billing_name"));
$collection->getSelect()->columns(new Zend_Db_Expr("CONCAT(s1.firstname, ' ',s1.lastname) AS shipping_name"));
Когда это будет сделано, не будет по-настоящему простого способа (который я нашел, чтобы это исправить), если это все.
Чтобы избежать этих головных болей ( после , изменив _getCollectionClass()
на вышеуказанное), сделайте следующее:
B. Измените _prepareCollection()
на это:
protected function _prepareCollection()
{
$collection = Mage::getResourceModel($this->_getCollectionClass());
$collection->getSelect()->joinLeft(array('sfog' => 'sales_flat_order_grid'),'main_table.entity_id = sfog.entity_id',array('sfog.shipping_name','sfog.billing_name'));
$collection->getSelect()->joinLeft(array('sfo'=>'sales_flat_order'),'sfo.entity_id=main_table.entity_id',array('sfo.customer_email','sfo.weight','sfo.discount_description','sfo.increment_id','sfo.store_id','sfo.created_at','sfo.status','sfo.base_grand_total','sfo.grand_total'));
$collection->getSelect()->joinLeft(array('sfoa'=>'sales_flat_order_address'),'main_table.entity_id = sfoa.parent_id AND sfoa.address_type="shipping"',array('sfoa.street','sfoa.city','sfoa.region','sfoa.postcode','sfoa.telephone'));
$this->setCollection($collection);
return parent::_prepareCollection();
}
C. Затем для существующих столбцов в _prepareColumns()
добавьте filer_index
к каждому:
Пример:
$this->addColumn('billing_name', array(
'header' => Mage::helper('sales')->__('Bill to Name'),
'index' => 'billing_name',
'filter_index' => 'sfog.billing_name',
));
D. Затем добавьте столбцы, которые вы хотите добавить, вот так:
Пример:
$this->addColumn('customer_email', array(
'header' => Mage::helper('sales')->__('Customer Email'),
'index' => 'customer_email',
'filter_index' => 'sfo.customer_email',
'width' => '50px',
));