добавьте полный адрес в столбцы по умолчанию в сетке заказов
Я хочу добавить полный адрес в столбцы по умолчанию "Счет на имя" и "Доставка на имя" в сетке заказов в администраторе Magento. Я прилагаю снимок экрана для более подробного объяснения. Пожалуйста, подскажите мне, как я могу этого добиться?
3 answers
Вам необходимо расширить сетку заказов (при условии, что она вам уже знакома).
В расширенном php-файле app/code/local/Yournamespace/Yourmodule/Block/Adminhtml/.../Grid.php
class Yournamespace_Yourmodule_Block_..._Grid extends Mage_Adminhtml_Block_Sales_Order_Grid{
protected function _prepareCollection()
{
$collection = Mage::getResourceModel($this->_getCollectionClass())
->join(array('soa' => 'sales/order_address'), 'soa.parent_id=main_table.entity_id and soa.address_type = "billing"', array('full_address'=>'CONCAT(soa.firstname, " " , soa.lastname, ",<br/>", soa.street, ",<br/>", soa.city, ",<br/>", soa.region, ",<br/>", soa.postcode)' ), null,'left')
->join(array('soas' => 'sales/order_address'), 'soas.parent_id=main_table.entity_id and soas.address_type = "shipping"', array('full_address_ship'=>'CONCAT(soas.firstname, " " , soas.lastname, ",<br/>", soas.street, ",<br/>", soas.city, ",<br/>", soas.region, ",<br/>", soas.postcode)' ), null,'left');
$this->setCollection($collection);
return parent::_prepareCollection();
}
...
Затем внутри метода protected function _prepareColumns()
замените следующий код
$this->addColumn('billing_name', array(
'header' => Mage::helper('sales')->__('Bill to Name'),
'index' => 'billing_name',
));
$this->addColumn('shipping_name', array(
'header' => Mage::helper('sales')->__('Ship to Name'),
'index' => 'shipping_name',
));
С
$this->addColumn('full_address', array(
'header'=> Mage::helper('sales')->__('Billing Address'),
'width' => '80px',
'type' => 'text',
'index' => 'full_address',
));
$this->addColumn('full_address_ship', array(
'header'=> Mage::helper('sales')->__('Shipping Address'),
'width' => '80px',
'type' => 'text',
'index' => 'full_address_ship',
));
Ты закончил!
Другим простым и рекомендуемым способом было бы использование события и наблюдателя:
В вашем модуле config.xml
В разделе конфигурация тег...
<config>
...
<adminhtml>
...
<events>
<sales_order_grid_collection_load_before>
<observers>
<vendor>
<type>singleton</type>
<class>yourmodule/adminhtml_observer</class>
<method>filterOrderCollection</method>
</vendor>
</observers>
</sales_order_grid_collection_load_before>
<core_block_abstract_prepare_layout_after>
<observers>
<vendor>
<type>singleton</type>
<class>yourmodule/adminhtml_observer</class>
<method>saleOrderLayout</method>
</vendor>
</observers>
</core_block_abstract_prepare_layout_after>
В app/code/local/Yournamespace/Yourmodule/Model/Adminhtml/Observer.php
<?php
class Yournamespace_Yourmodule_Model_Adminhtml_Observer{
public function filterOrderCollection($observer){
$collection = $observer->getEvent()->getOrderGridCollection();
$collection->join(array('soa' => 'sales/order_address'), 'soa.parent_id=main_table.entity_id and soa.address_type = "billing"', array('full_address'=>'CONCAT(soa.firstname, " " , soa.lastname, ",<br/>", soa.street, ",<br/>", soa.city, ",<br/>", soa.region, ",<br/>", soa.postcode)' ), null,'left');
$collection->join(array('soas' => 'sales/order_address'), 'soas.parent_id=main_table.entity_id and soas.address_type = "shipping"', array('full_address_ship'=>'CONCAT(soas.firstname, " " , soas.lastname, ",<br/>", soas.street, ",<br/>", soas.city, ",<br/>", soas.region, ",<br/>", soas.postcode)' ), null,'left');
}
public function saleOrderLayout($evt){
$tabBlock = $evt->getBlock();
if($tabBlock instanceof Mage_Adminhtml_Block_Sales_Order_Grid){
$tabBlock->addColumnAfter('full_address', array(
'header'=> Mage::helper('sales')->__('Billing Address'),
'width' => '80px',
'type' => 'text',
'index' => 'full_address',
), 'created_at');
$tabBlock->addColumnAfter('full_address_ship', array(
'header'=> Mage::helper('sales')->__('Shipping Address'),
'width' => '80px',
'type' => 'text',
'index' => 'full_address_ship',
), 'full_address');
}
}
}
Лучший способ изменить столбцы, отображаемые в таблице заказов, - использовать наблюдателя, который обновляет таблицу sales_flat_order_grid. В предыдущем вопросе я выполнил полную настройку расширения сетки, см.: Добавление столбца в сетку (наблюдатель) - столбец "идентификатор хранилища" в предложении where является неоднозначной проблемой
В этом примере вам необходимо изменить идентификатор customer_group_id с используемыми адресами. Затем в наблюдателе вам нужно будет добавить коллекцию данных, чтобы она была сохранена каждый раз в таблицу сетки.
В качестве альтернативы вы можете использовать средство визуализации столбца для форматирования и отображения данных для адреса, но для этого требуется выполнить много дополнительных запросов при загрузке таблицы.
App/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php
$collection->getSelect()->joinLeft('sales_flat_order_address', 'main_table.entity_id = sales_flat_order_address.parent_id',array('telephone','city','postcode' ) )->where("sales_flat_order_address.address_type = 'billing'");
$this->addColumn('telephone', array(
'header' => Mage::helper('sales')->__('Mobile'),
'index' => 'telephone',
'filter_index' => 'sales_flat_order_address.telephone',
));
$this->addColumn('city', array(
'header' => Mage::helper('sales')->__('City'),
'index' => 'city',
'filter_index' => 'sales_flat_order_address.city',
));
$this->addColumn('postcode', array(
'header' => Mage::helper('sales')->__('Pincode'),
'index' => 'postcode',
'filter_index' => 'sales_flat_order_address.postcode',
));