Количество заказов, размещенных клиентом в таблице заказов и клиентов
Я хочу отобразить общее количество заказов, размещенных клиентом, в таблице заказов и клиентов. Это поможет мне определить тип клиента.
Grid.php
protected function _prepareCollection()
{
$collection = Mage::getResourceModel($this->_getCollectionClass());
$sql ='SELECT COUNT(*)'
. ' FROM ' . Mage::getSingleton('core/resource')->getTableName('sales/order') . ' AS o, customer_entity AS e'
. ' WHERE o.customer_id=e.entity_id' ;
$expr = new Zend_Db_Expr('(' . $sql . ')');
$collection->getSelect()->from(null, array('orders_count'=>$expr));
$this->setCollection($collection);
return parent::_prepareCollection();
}
protected function _prepareColumns()
{
$this->addColumn('orders_count', array(
'header' => Mage::helper('customer')->__('Total No. of Orders'),
'align' => 'left',
'width' => '40px',
'index' => 'orders_count',
'type' => 'number',
'sortable' => true,
));
}
Это показывает мне общее количество размещенных заказов, а не клиентов.
Как я могу показать "нет". заказов с точки зрения клиента в заказе, а также в сетке клиентов?
1 answers
Попробуйте использовать код ниже.
Grid.php
protected function _prepareCollection()
{
$collection = Mage::getResourceModel($this->_getCollectionClass());
$readAdapter = Mage::getSingleton('core/resource')->getConnection('core_read');
$select = $readAdapter->select()
->from('sales_flat_order_grid')
->columns(array('orders_count' => new Zend_Db_Expr('COUNT(*)'))
)->group('customer_id');
$collection->getSelect()->joinLeft(
array('orders_count' => new Zend_Db_Expr('('.$select.')')),
'main_table.customer_id = orders_count.customer_id',
array('orders_count.orders_count')
);
$collection->addFilterToMap('orders_count', 'orders_count.orders_count');
$this->setCollection($collection);
return parent::_prepareCollection();
}
protected function _prepareColumns()
{
$this->addColumn('orders_count', array(
'header' => Mage::helper('customer')->__('Total No. of Orders'),
'align' => 'left',
'width' => '40px',
'index' => 'orders_count',
'type' => 'number',
'sortable' => true,
));
}
Чтобы добавить количество заказов в сетку клиентов ,
добавьте код ниже в свою функцию _prepareCollection()
, прежде чем устанавливать сбор в строке $this->setCollection($collection);
$readAdapter = Mage::getSingleton('core/resource')->getConnection('core_read');
$select = $readAdapter->select()
->from('sales_flat_order_grid')
->columns(array('orders_count' => new Zend_Db_Expr('COUNT(*)'))
)->group('customer_id');
$collection->getSelect()->joinLeft(
array('orders_count' => new Zend_Db_Expr('('.$select.')')),
'e.entity_id = orders_count.customer_id',
array('orders_count.orders_count')
);
$collection->addFilterToMap('orders_count', 'orders_count.orders_count');
И добавьте свою колонку точно так же с filter_condition_callback
,
$this->addColumn('orders_count', array(
'header' => Mage::helper('customer')->__('Total No. of Orders'),
'align' => 'left',
'width' => '40px',
'index' => 'orders_count',
'type' => 'number',
'filter_condition_callback' => array($this, '_ordersCountFilterCallBack'),
'sortable' => false,
));
И создайте функцию в том же файле,
protected function _ordersCountFilterCallBack($collection, $column)
{
if (!$value = $column->getFilter()->getValue()) {return $this;}
$from = ($value['from']) ? $value['from']: 0;
$to = ($value['to']) ? $value['to'] : 999999;
$collection->getSelect()->where("orders_count.orders_count >= $from AND orders_count.orders_count <= $to");
return $this;
}
ПРИМЕЧАНИЕ: Я отключил сортировку для этого поля, потому что у меня не было на это времени. Вы можете попробовать это самостоятельно, или я сделаю это обновите, как только у меня будет для этого время.