Фильтр столбца сетки не работает с рендерером в пользовательском модуле magento

Я работаю с пользовательским модулем для бэкэнда magento, этот фильтр не работает при использовании фильтра обратного вызова! Спасибо!

Я пробовал некоторые коды, как это,

Grid.php

protected function _prepareCollection()
{
$collection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('sku')
->addAttributeToSelect('name');

$this->setCollection($collection);

return parent::_prepareCollection();
}

protected function _prepareColumns() {
$this->addColumn('entity_id', array(
'header' => Mage::helper('catalog')->__('ID'),
'width' => '50px',
'type' => 'number',
'index' => 'entity_id',
));

$this->addColumn('name', array(
'header' => Mage::helper('catalog')->__('Name'),
'index' => 'name',
));

$this->addColumn('sku', array(
'header' => Mage::helper('catalog')->__('SKU'),
'width' => '120px',
'index' => 'sku',
));

$this->addColumn('packet_associate', array(
'header'    => Mage::helper('catalog')->__('Packets Associated'),
'width'     => '80px',
//'index'     => 'packet_associate',
'filter_index' => 'packet_associate',
'renderer'  => 'stockmanagement/adminhtml_productassociate_renderer_associatestatus',
'type'      => 'options',
'options'   => array('1' => 'Yes', '0' => 'No'),
'filter_condition_callback'
=> array($this, '_filterPacketAssociateCondition'),
));

$this->addColumn('action', array(
'header' => Mage::helper('catalog')->__('Action'),
'width' => '200px',
'type' => 'action',
'getter' => 'getId',
'actions' => array(
array(
'caption' => Mage::helper('catalog')->__('Associate / Edit Packets'),
'url' => array(
'base' => '*/*/new',
'params' => array('store' => $this->getRequest()->getParam('store'))
),
'field' => 'id'
)
),
'filter' => false,
'sortable' => false,
'index' => 'stores',
));

return parent::_prepareColumns();
}

функция обратного вызова

protected function _filterPacketAssociateCondition($collection, $column) {
if (!$value = $column->getFilter()->getValue()) {
return $this;
}

$collection->getSelect()->joinLeft('custom_table AS b', 'e.entity_id = b.product_id',
array('packet_associate' => 'COUNT(b.id)'));
$collection->getSelect()->group(entity_id);

$collection->getSelect()->having(
"packet_associate = ?", $value);

return $collection;
//var_dump($collection->getSelect()->__toString());die();

}

Associatestatus.php

class   Module_Block_Adminhtml_Productassociate_Renderer_Associatestatus     extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract
{
public function render(Varien_Object $row)
{
$collection = Mage::getModel("stockmanagement/productassociate")->load($row->getId(), 'product_id')->getData();
$resultCount = count($collection);
if($resultCount > 0){
echo 'Yes';
}else{
echo 'No';
}
}

}

При этом Renderer работает нормально., Только функция обратного вызова фильтра не работает !!!

Когда я печатаю запрос в функции обратного вызова, как показано ниже, он дает правильный результат.

SELECT `e`.*, COUNT(b.id) AS `packet_associate` FROM `catalog_product_entity` AS `e` LEFT JOIN `custom_table` AS `b` ON e.entity_id = b.product_id GROUP BY `entity_id` HAVING (packet_associate = '1')

Но после применения фильтра выдает ошибку. Пожалуйста, предложите мне что-нибудь. Спасибо!

0

Решение

Комментарии ограничены, поэтому я поставил это в поле для ответа.

Попробуйте установить

protected function _filterPacketAssociateCondition($collection, $column) {
if (!$value = $column->getFilter()->getValue()) {
return $this;
}

$this->getCollection()->getSelect()->joinLeft('custom_table AS b', 'e.entity_id = b.product_id',
array('packet_associate' => 'COUNT(b.id)'));
$this->getCollection()->getSelect()->group(entity_id);

$this->getCollection()->getSelect()->having(
"packet_associate = ?", $value);

return $this;
}

Вместо :

protected function _filterPacketAssociateCondition($collection, $column) {
if (!$value = $column->getFilter()->getValue()) {
return $this;
}

$collection->getSelect()->joinLeft('custom_table AS b', 'e.entity_id = b.product_id',
array('packet_associate' => 'COUNT(b.id)'));
$collection->getSelect()->group(entity_id);

$collection->getSelect()->having(
"packet_associate = ?", $value);

return $collection;
}
0

Другие решения

Если я правильно понимаю, вы хотите отфильтровать продукты, которые имеют / не соответствуют записи в custom_table,
В этом случае нет необходимости группировать ваши результаты — это довольно сложная операция, давайте попробуем ее избежать. Ваша функция обратного вызова должна выглядеть так:

protected function _filterPacketAssociateCondition($collection, $column)
{
$value = $column->getFilter()->getValue();

$collection->getSelect()->joinLeft(array('b' => 'custom_table'), 'e.entity_id = b.product_id',
array('product_id'));

if ($value > 0) {
$collection->getSelect()->where("b.product_id IS NOT NULL");
} else {
$collection->getSelect()->where("b.product_id IS NULL");
}

return $this;
}

Как видите, в левом соединении у вас будет целочисленное значение в случае, если объединенное product_id столбец, если текущий продукт имеет хотя бы одну соответствующую строку в custom_tableиначе у вас будет NULL в этом столбце.

0

По вопросам рекламы [email protected]