2012-01-06 23 views
5

Tôi đang làm việc với Magento phiên bản 1.4 và tôi đã thêm cột lưới (tên và skus) vào Lưới đặt hàng, dữ liệu trả về là chính xác nhưng tôi ' m gặp vấn đề với pagination và tổng số lượng hồ sơ, mã của tôi như sau:Lưới bán hàng Magento hiển thị số lượng bản ghi không chính xác khi thêm cột Tên và Skus

Trước tiên tôi Edited Mage_Adminhtml_Block_Sales_Order_Grid

protected function _prepareCollection() 
{ 
    $collection = Mage::getResourceModel($this->_getCollectionClass()) 
    ->join(
     'sales/order_item', 
     '`sales/order_item`.order_id=`main_table`.entity_id', 
     array(
      'skus' => new Zend_Db_Expr('group_concat(`sales/order_item`.sku SEPARATOR ", ")'), 
      'names' => new Zend_Db_Expr('group_concat(`sales/order_item`.name SEPARATOR ", ")'), 
      ) 
     ); 
    $collection->getSelect()->group('entity_id'); 

    $this->setCollection($collection); 
    return parent::_prepareCollection(); 
} 

Sau đó, tôi ghi đè phương pháp này để đưa ra kết quả chính xác khi lọc theo tên hoặc dòng sản phẩm

protected function _addColumnFilterToCollection($column) 
{ 
    if($this->getCollection() && $column->getFilter()->getValue()) 
    { 
     if($column->getId() == 'skus'){ 
      $this->getCollection()->join(
       'sales/order_item', 
       '`sales/order_item`.order_id=`main_table`.entity_id', 
       array(
        'skus' => new Zend_Db_Expr('group_concat(`sales/order_item`.sku SEPARATOR ", ")'), 
       ) 
      )->getSelect() 
       ->having('find_in_set(?, skus)', $column->getFilter()->getValue()); 

      return $this; 
     } 

     if($column->getId() == 'names'){ 
      $this->getCollection()->join(
       'sales/order_item', 
       '`sales/order_item`.order_id=`main_table`.entity_id', 
       array(
        'names' => new Zend_Db_Expr('group_concat(`sales/order_item`.name SEPARATOR ", ")'), 
       ) 
      )->getSelect() 
       ->having('find_in_set(?, names)', $column->getFilter()->getValue()); 

      return $this; 
     } 
    } 
    return parent::_addColumnFilterToCollection($column); 
} 

Sau đó, tôi thay đổi nội dung phương pháp này getSelectCountSql() trong lớp Mage_Sales_Model_Mysql4_Order_Collection

public function getSelectCountSql() 
{ 
    $countSelect = parent::getSelectCountSql(); 

    //added 
    $countSelect->reset(Zend_Db_Select::HAVING); 
    //end 

    $countSelect->resetJoinLeft(); 
    return $countSelect; 
} 

Bất cứ ý tưởng làm thế nào tôi có thể tính toán số lượng hàng? Cảm ơn trước.

Trả lời

0

Tôi có vấn đề này và tôi đã nhận nó làm việc bằng cách thực hiện getSize() chức năng tùy chỉnh trong bộ sưu tập tôi đang sử dụng

public function getSize() 
{ 
    $select = clone $this->getSelect(); 
    $select->reset(); 
    $select = $this->getConnection()->fetchOne('SELECT COUNT(*) FROM Table GROUP BY FIELD'); // or you can use select count(distinct field) from table 
    return $select; 
} 

và để đạt được lưới lưu trữ tôi có ghi đè

protected function _setCollectionOrder($column) 
    { 
     $collection = $this->getCollection(); 
     if ($collection) { 
      $columnIndex = $column->getFilterIndex() ? 
       $column->getFilterIndex() : $column->getIndex(); 
      $collection->getSelect()->order(array($columnIndex.' '.$column->getDir())); 
     } 
     return $this; 
    } 

và Đặt filter_index của các cột TO

in _prepareColumns() function 
    'filter_index' => 'SUM(tablename.field)' 

và bạn có thể sử dụng chức năng gọi lại trên f ilters cho các cột

+0

James' giải pháp chắc chắn là tốt hơn, việc viết lại getSize của Meabed có thể kích hoạt sự mất liên kết. Tôi đã triển khai một bộ sưu tập phức tạp với mệnh đề "nhóm theo" và gặp lỗi "count = 1". Thêm '$ countSelect-> reset (Zend_Db_Select :: GROUP);' để getSelectCountSql thực hiện thủ thuật một cách rõ ràng. – SMASHED

4

Có lẽ nó một chút để muộn nhưng trong mã của bạn thử sử dụng GROUP insted của HAVING:

$countSelect->reset(Zend_Db_Select::GROUP); 

Bởi vì bạn đang sử dụng chính khách này:

$collection->getSelect()->group('entity_id'); 
+0

Nhưng dự kiến ​​thay đổi trong Mage_Sales_Model_Resource_Order_Collection hơn là Mage_Sales_Model_Mysql4_Order_Collection để thay đổi xuất hiện. Bạn có thể giải thích cho tôi điều đó không? – RIK

2
$collection->getSelect()->join(array(
      'item'=>$collection->getTable('sales/order_item')), 
      'item.order_id=`main_table`.entity_id AND item.product_type="simple"', 
      array(
       'skus' => new Zend_Db_Expr('group_concat(item.sku SEPARATOR ", ")'), 
       'name' => new Zend_Db_Expr('group_concat(item.name SEPARATOR ", ")') 
      )); 

$this->addColumn('skus', array(
      'header' => Mage::helper('sales')->__('SKU'), 
      'index' => 'skus', 
      'type' => 'text', 
     )); 

     $this->addColumn('name', array(
      'header' => Mage::helper('sales')->__('NAME'), 
      'index' => 'name', 
      'type' => 'text' 
     ));