Сетка заказов на продажу Magento показывает неверное количество записей при добавлении столбцов Имена и Skus - PullRequest
5 голосов
/ 07 января 2012

Я работаю с версией 1.4 Magento, и я добавил дополнительные столбцы сетки (имена и skus) в таблицу заказов на продажу, возвращенные данные верны, но у меня проблемы с разбивкой на страницы и общим количеством записей, мой код выглядит следующим образом:

Сначала я редактировал 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();
}

Затем я переопределяю этот метод, чтобы возвращать правильные результаты при фильтрации по именам или skus

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

Затем я редактировал этот метод getSelectCountSql() в классе Mage_Sales_Model_Mysql4_Order_Collection

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

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

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

Есть идеи, как рассчитать количество строк?Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 02 апреля 2012

Может быть, немного поздно, но в вашем коде попробуйте использовать GROUP insted of HAVING:

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

Поскольку вы используете эти государственные деятели:

$collection->getSelect()->group('entity_id');
2 голосов
/ 27 января 2015
$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'
        ));
0 голосов
/ 15 марта 2012

У меня была эта проблема, и я заставил ее работать, реализовав пользовательскую функцию getSize () в коллекции, которую я использую

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

и для сохранения Grid у меня есть переопределение

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

и установить filter_index столбцов TO

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

и вы можете использовать функцию обратного вызова на фильтрах для столбцов

...