Я пытаюсь добавить два поля ( Shipping Postcode
и Shipping Postcode
) в сеть продаж Magento 1.7CE.
Я делаю это, переопределяя Mage_Adminhtml_Block_Sales_Order_Grid::setCollection(...)
чтобы присоединиться к таблице с sales/order_address
.
public function setCollection($collection){ parent::setCollection($collection); $collection->getSelect()->join( array('address_shipping' => $collection->getTable("sales/order_address")), 'main_table.entity_id = address_shipping.parent_id AND address_shipping.address_type = "shipping"', array('postcode') ); $collection->getSelect()->join( array('address_billing' => $collection->getTable("sales/order_address")), 'main_table.entity_id = address_billing.parent_id AND address_billing.address_type = "billing"', array('postcode') ); }
И Mage_Adminhtml_Block_Sales_Order_Grid::_prepareColumns(...)
чтобы добавить столбцы в Sales Grid.
protected function _prepareColumns(){ $this->addColumn('shipping_postcode', array( 'header' => Mage::helper('sales')->__('Shipping Postcode'), 'index' => 'postcode', )); $this->addColumn('billing_postcode', array( 'header' => Mage::helper('sales')->__('Billing Postcode'), 'index' => 'postcode', )); return parent::_prepareColumns(); }
Проблема в том, что оба раза мне нужно выбрать поле postcode
из таблицы sales/order_address
что приводит к ошибке SQL
SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'postcode' in order clause is ambiguous
Я попытался использовать псевдоним AS
MySQL, чтобы различать два почтовых индекса, изменяя setCollection(...)
для передачи array('shipping_postcode'=>'postcode')
и array('billing_postcode'=>'postcode')
а также изменение _prepareColumns(...)
чтобы сказать 'index' => 'shipping_postcode'
и 'index' => 'billing_postcode'
. Это привело к другой ошибке SQL
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'shipping_postcode' in 'where clause'
Как я могу добиться наличия двух столбцов в сетке продаж?
попробуйте этот первый код
public function setCollection($collection){ parent::setCollection($collection); $collection->getSelect()->join( array('address_shipping' => $collection->getTable("sales/order_address")), 'main_table.entity_id = address_shipping.parent_id AND address_shipping.address_type = "shipping"', array('address_shipping.postcode as shippingpostcode') ); $collection->getSelect()->join( array('address_billing' => $collection->getTable("sales/order_address")), 'main_table.entity_id = address_billing.parent_id AND address_billing.address_type = "billing"', array('address_billing.postcode as billingpostcode') ); }
Второй _prepareColumns()
здесь,
protected function _prepareColumns(){ $this->addColumn('shippingpostcode', array( 'header' => Mage::helper('sales')->__('Shipping Postcode'), 'index' => 'shippingpostcode', 'filter_index' => 'address_shipping.postcode' )); $this->addColumn('billingpostcode', array( 'header' => Mage::helper('sales')->__('Billing Postcode'), 'index' => 'billingpostcode', 'filter_index' => 'address_billing.postcode' )); return parent::_prepareColumns(); }
если вы хотите узнать больше об 'filter_index'
, 'filter_index'
комментарий в / из этого, а затем попробуйте отсортировать в своей таблице столбец столбца. Вы увидите другой результат. Если вы удалите filter_index
, ошибка в сортировке.
Перед return parent::_prepareCollection();
Вы должны создать соединение:
$collection->getSelect()->joinLeft(array('billing'=>'sales_flat_order_address'), 'main_table.entity_id = billing.parent_id AND billing.address_type="billing"',array('billing.postcode AS bp'));
И в методе _prepareColumns paste:
$this->addColumn('bp', array( 'header' => Mage::helper('sales')->__('Billing Postcode'), 'index' => 'bp', 'width' => '60px', 'filter_index' => 'billing.postcode' ));