2012-01-06 18 views
5

Pracuję z wersją 1.4 Magento i dodałem dodatkowe kolumny siatki (nazwy i skróty) do siatki zamówień sprzedaży, zwrócone dane są poprawne, ale ja ' m problemy z paginacji i całkowitej liczby rekordów, mój kod następująco:Siatka zamówień sprzedaży Magento pokazuje niepoprawną liczbę rekordów dodanych do nazw i kolumn Skusa

Pierwszy edytowany 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(); 
} 

Potem zastąpić tę metodę, aby powrócić poprawne wyniki, gdy filtr o nazwach lub SKU

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); 
} 

Potem edytowany tej metody getSelectCountSql() w klasie Mage_Sales_Model_Mysql4_Order_Collection

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

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

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

jakiś pomysł jak mogę obliczyć liczbę wierszy? Z góry dziękuję.

Odpowiedz

0

miałem ten problem i mam to działa poprzez wdrożenie niestandardowych funkcji getSize() w kolekcji używam

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; 
} 

i osiągnąć Siatka przechowywania mam przesłanianie

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; 
    } 

i Ustaw filtr_index kolumn TO

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

i możesz użyć funkcji oddzwaniania na f ilters dla kolumn

+0

Jamesa rozwiązanie jest zdecydowanie lepsze, przeróbka getSize przez Meabed może spowodować utratę wiązania. Zaimplementowałem złożoną kolekcję z klauzulą ​​"grupa po" i spotkałem się z błędem "count = 1". Dodanie '$ countSelect-> reset (Zend_Db_Select :: GROUP);' to getSelectCountSql wykonało sztuczkę w czysty sposób. – SMASHED

4

Może jest trochę za późno, ale w kodzie spróbować wykorzystać GROUP insted mający:

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

Ponieważ używasz tego wyciąg z konta bankowego:

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

Ale oczekuje zmiany w Mage_Sales_Model_Resource_Order_Collection zamiast Mage_Sales_Model_Mysql4_Order_Collection, aby zmiana została wyświetlona. Czy możesz mi to wyjaśnić? – 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' 
     ));