Я пытаюсь добавить два поля ( 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' ));