2016-02-02 2 views
0

Я работаю с настраиваемым модулем для бэкэнда magento, в этом фильтре не работает при использовании фильтра calback! Благодаря!Фильтр столбчатой ​​решетки не работает с рендерером в настраиваемом модуле 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

Можете ли вы предоставить заброшенную ошибку, применяя фильтры? –

+0

Несомненно. Ниже приведена ошибка: SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец «packet_associate» в разделе «having», запрос: SELECT COUNT (DISTINCT e.entity_id) FROM 'catalog_product_entity' AS' e' HAVING (packet_associate = ' 1 ') – bindal09

+0

Собственно, запрос с ошибкой и запрос, напечатанные в функции обратного вызова, различны. – bindal09

ответ

0

Комментарии ограничены, поэтому я помещаю это в поле «Ответ».

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

Вместо:

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

Я пробовал, но не работал. Спасибо за ответ. – bindal09

+0

У вас такая же ошибка? –

+0

Да, я получаю ту же ошибку. – bindal09

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.