บริบทเล็กน้อยสำหรับสิ่งนี้ ฉันต้องการขยายฟังก์ชั่นการส่งออกคำสั่งขาย (ผ่านทางกริด) เพื่อให้มีคอลัมน์มากขึ้น ฉันได้สร้างโมดูลซึ่งเพิ่มกริดใหม่สำหรับการส่งออกและยังเป็นโมเดลคอลเลกชันใหม่ซึ่งขยายไปถึงต้นฉบับ นี่ใช้ฟังก์ชัน _beforeLoad () เพื่อให้ฉันสามารถเข้าร่วมตารางที่ฉันต้องการ
ปัญหาที่ฉันมีอยู่คือเมื่อเพิ่มตัวกรองจากกริด (the increment_id, วันที่สั่งซื้อ ฯลฯ ), ส่วนคำสั่งที่เพิ่มนี้ไม่ได้ขึ้นหน้าตารางและฉันได้รับปัญหาเกี่ยวกับชื่อคอลัมน์ที่ไม่ชัดเจน ตัวอย่างเช่นวันที่ increment_id ฉันมีปัญหาในส่วนคำสั่ง where:
SELECT `main_table`.*, `sales`.`total_qty_ordered`, `sales`.`entity_id` AS `order_id`, `sagepay`.`vendor_tx_code` FROM `sales_flat_order_grid` AS `main_table`
LEFT JOIN `sales_flat_order` AS `sales` ON main_table.increment_id = sales.increment_id
LEFT JOIN `sagepaysuite_transaction` AS `sagepay` ON order_id = sagepay.order_id WHERE (increment_id LIKE '%100000261%') GROUP BY `main_table`.`entity_id`
ที่นี่มีการเพิ่มส่วนคำสั่งก่อนที่ฉันจะรวมเข้ากับตารางอื่น ๆ ในฟังก์ชัน _addColumnFilterToCollection ()
protected function _addColumnFilterToCollection($column)
{
if ($this->getCollection()) {
$field = ( $column->getFilterIndex() ) ? $column->getFilterIndex() : $column->getIndex();
if ($column->getFilterConditionCallback()) {
call_user_func($column->getFilterConditionCallback(), $this->getCollection(), $column);
} else {
$cond = $column->getFilter()->getCondition();
if ($field && isset($cond)) {
// Filter added at this point
$this->getCollection()->addFieldToFilter($field , $cond);
}
}
}
return $this;
}
เป็นการทดสอบสั้น ๆ ฉันเปลี่ยนบรรทัดเป็น
$this->getCollection()->addFieldToFilter('main_table.' . $field , $cond);
และมันใช้งานได้ แต่มันก็ไม่ได้เป็นวิธีที่ยอดเยี่ยมเลย
รหัสของฉันใน _beforeLoad () คือ
protected function _beforeLoad()
{
// Join the sales_flat_order table to get order_id and and total_qty_ordered
$this->getSelect()->joinLeft(array('sales' => $this->getTable('sales/order')),
'main_table.increment_id = sales.increment_id',
array('total_qty_ordered' => 'sales.total_qty_ordered',
'order_id' => 'sales.entity_id'));
// Join the SagePay transaction table to get vendor_tx_code
$this->getSelect()->joinLeft(array('sagepay' => $this->getTable('sagepaysuite2/sagepaysuite_transaction')),
'order_id = sagepay.order_id',
array('vendor_tx_code' => 'vendor_tx_code'));
$this->getSelect()->group('main_table.entity_id');
parent::_beforeLoad();
}
ฉันต้องใช้ increment_id เพื่อเข้าร่วมตารางตารางคำสั่งขายและตารางธุรกรรม SagePay เนื่องจากเป็นรหัสทั่วไปเดียวที่ฉันเห็น
โดยทั่วไปฉันสงสัยว่าวิธีที่ดีที่สุดคือแก้ไขปัญหานี้ ฉันอาจจะได้รับไปกับการเปลี่ยนแปลงที่ฉันกล่าวถึงข้างต้น แต่มันก็ไม่ถูกต้อง มีสิ่งใดบ้างที่ฉันสามารถเปลี่ยนแปลงได้ในใบแจ้งยอดการเข้าร่วมของฉัน
ขอบคุณ