2015-07-07 3 views
2

Я работаю с настраиваемым модулем для бэкэнда magento, в этом фильтре не работает при использовании фильтра calback! Может ли кто-нибудь мне предложить? Спасибо!Фильтр сетчатой ​​колонки не работает с двумя моделями в настраиваемом модуле magento

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

Grid.php

protected function _prepareCollection() 
    { 
    $collection = Mage::getModel('listings/listings')->getCollection(); 
    $this->setCollection($collection); 
     return parent::_prepareCollection(); 
    } 
protected function _prepareColumns() 
    {  
     $this->addColumn("item_id", array(
      "header" => Mage::helper("linkmanagement")->__("ID"), 
      "align" => "center", 
      "type" => "number", 
      "index" => "item_id", 

     )); 

     $this->addColumn("title", array(
      "header" => Mage::helper("linkmanagement")->__("Title"), 
      "index" => "title" 
     )); 

     $this->addColumn("cat_ids", array(
      "header" => Mage::helper("linkmanagement")->__("Cat ID"), 
      "align" => "center", 
      "index" => "cat_ids", 
      "renderer" => 'Sathish_Linkmanagement_Block_Adminhtml_Linkmanagement_Renderer_Categories', 
      'filter_condition_callback' => array($this, '_categoriesFilter') 
     )); 

     $this->addColumn("url_key", array(
      "header" => Mage::helper("linkmanagement")->__("URL"), 
      "index" => "url_key", 
      "width" => "200px", 
     )); 

     $this->addColumn('status', 
      array(
       'header' => Mage::helper('linkmanagement')->__('Status'), 
       'index' => 'status', 
       'type' => 'options', 
       'options' => array('1' => Mage::helper('linkmanagement')->__('Active'), 
        '0' => Mage::helper('linkmanagement')->__('Inactive')), 
      ) 
     ); 

     return parent::_prepareColumns(); 
    } 

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

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

     $this->getCollection()->getSelect()->where(
      "cat_ids ?" 
      , "%$value%"); 
     return $this; 
    } 

categories.php

class Sathish_Linkmanagement_Block_Adminhtml_Linkmanagement_Renderer_Categories extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract 
{ 

    public function render(Varien_Object $row) 
    { 
     $value = $row->getData($this->getColumn()->getIndex()); 
     // $value = 38,92 
     $value = explode(',',$value); 
     $collection = Mage::getModel("categories/categories")->getCollection()->addFieldToFilter('category_id',$value)->getData(); 
     foreach($collection as $col){ 
      $result[] = $col['title']; 
     } 
     $result = implode(',', $result);// $result = schools,colleges 
     return $result; 
    } 
} 

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

+0

Определение не работает. Является ли callback когда-либо вызываемым? Не влияет ли код обратного вызова на результаты? –

+0

«не работает», когда когда-либо я пытался отфильтровать этот столбец, он не возвращает строки фильтра – Sathish

+0

Что такое SQL, сгенерированный при использовании вашего обратного вызова? Если при применении фильтра обратного вызова вы не получаете результатов, то, возможно, ваш запрос неверен. Учитывая информацию, которую вы опубликовали, отчасти трудно дать ответ. –

ответ

3

Я проверил ваш пример с помощью собственного средства визуализации и попытался проверить ваш обратный вызов.

Заменить в методе обратного вызова

$this->getCollection()->getSelect() 

с

$collection 

Вот мои советы:


Magento фильтр предполагает не 100% сходства. Я имею в виду, что если вы хотите применить фильтр, который вы должны использовать конструкцию:

where("cat_ids LIKE ?", "%$value%"); 

Я до сих пор не понимаю, ответ на вопрос ниже:

Define not working. Is the callback ever being called? Is the callback code having no affect on the results? – Lee Saferite 1 hour ago

Put Mage::log('blabla', false, 'grid.log', true); в начале обратного вызова метод. Затем проверьте этот файл журнала. Если он не пуст, ваш метод успешно выполняется.


Если метод вызывает - попробуйте

Mage::log($collection->getSelectSQL(1), false, 'grid.log', true); 

до и после фильтра применения. И попробуйте запустить эти запросы в phpmyadmin. Проверьте результат


Попробуйте применить эти изменения внутри Mage_Adminhtml_Block_Sales_Order_Grid класса

Вот что я сделал:

$this->addColumn("cat_ids", array(
     "header" => Mage::helper('sales')->__('Ship to Name'), 
     "align" => "center", 
     "index" => "grand_total", 
     "renderer" => "My_Class_.....", 
     "filter_condition_callback" => array($this, '_categoriesFilter') 
    )); 

....

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

    $collection->getSelect()->where(
     "status LIKE ?", "%$value%" 
    ); 

    return $this; 
} 

...

public function render(Varien_Object $row) 
{ 
    $value = $row->getData('increment_id') . $row->getData('status'); 
    return $value; 
} 
+0

, если я использую '$ collection' вместо' $ this-> getCollection() -> getSelect() 'показывает' Fatal error: Call to undefined method Sathish_Listings_Model_Mysql4_Listings_Collection :: where() ' – Sathish

+0

Я использую две модели" списки/списки "и" Категории/категории " – Sathish

+0

Если вы меняете мой и ваш код - вы увидите, что вы отправляете $ collection в свою функцию и никогда не используете ее. Вы применяете фильтр к другой коллекции, которая не используется. Я не уверен, но я думаю, что ваша ошибка появляется из-за того, что вы не наследовали наследование. И ваша коллекция не имеет методов Zend. И ваша проблема не относится к функции обратного вызова. Вы должны расширить Mage_Core_Model_Mysql4_Collection_Abstract. Может быть, попытайтесь следовать моему последнему совету. Когда ваш обратный вызов начнет работать, вы можете перенести его часть по частям в свой модуль. Вариант, который я отправляю, на 100% работоспособен. – zhartaunik