Как создать filter_condition_callback для пользовательского рендерера в сетке администрирования Magento?

Я добавил пользовательский столбец в Customer Grid:

    $this->addColumn('shipping_name', array(
'header'    => Mage::helper('customer')->__('Shipping name'),
'index'     => 'entity_id',
'renderer'  => new My_Unique_Block_Customer_Renderer_Shippingname(),
'filter_condition_callback' => array($this, '_shippingNameFilter')
));

и средство визуализации Shippingname.php выглядит так:

class My_Unique_Block_Customer_Renderer_Shippingname extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract {

public function render(Varien_Object $row)
{

$id = $row->getData($this->getColumn()->getIndex());

$customer = Mage::getModel('customer/customer')->load($id); //customer id

$data = "";

if ( $customer->getDefaultShippingAddress() != null ) {
$shipping_address = $customer->getDefaultShippingAddress();

if ( $shipping_address->getFirstname() != null ) {
$data .= $shipping_address->getFirstname();
}

if ( $shipping_address->getLastname() != null ) {

if ( $shipping_address->getFirstname() != null ) {
$data .= " ";
}

$data .= $shipping_address->getLastname();
}

}

return $data;
}}

Что я должен заменить на функцию _shippingNameFilter () вместо «shipping_name like?» заставить фильтр в этом столбце работать?

    protected function _shippingNameFilter($collection, $column)
{
if (!$value = $column->getFilter()->getValue()) {
return $this;
}
$this->getCollection()->getSelect()->where("shipping_name like ?", "%$value%");

return $this;
}

Спасибо!

1

Решение

Если я правильно понял ваш вопрос, то для пользовательского фильтра необходимо выполнить следующие шаги.

Вот ваша таблица клиентов:

$this->addColumn('shipping_name', array(
'header'    => Mage::helper('customer')->__('Shipping name'),
'index'     => 'entity_id',
'renderer'  => new My_Unique_Block_Customer_Renderer_Shippingname(),
'filter_condition_callback' => array($this, '_customShippingFilterCallBack')
));

И добавьте такой метод,

protected function _customShippingFilterCallBack($collection, $column)
{
//Put your logic here..!!
if (!$value = $column->getFilter()->getValue())
{
return $this;
}
$this->getCollection()->getSelect()->where("shipping_name like ?", "%$value%");

return $this;
}

Примечание. Это базовая структура для создания пользовательского фильтра. Вы должны сделать некоторые изменения в соответствии с вашими потребностями.

5

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

Да. @ Vishwas Сони прав. Далее, если кто-то хочет присоединить таблицу eav_attribute_option_value к значению фильтрации, можно использовать приведенный ниже код.

$this->addColumn(
'product_manufacturer',
[
'header' => __('Manufacturer'),
'index' => 'manufacturer',
'filter_condition_callback' => [$this, 'filterCustomManufacturer'],
'header_css_class' => 'col-manufacturer',
'column_css_class' => 'col-manufacturer'
]
);

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

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

$collection->getSelect()->joinLeft(array('c_p_e_i'=>'catalog_product_entity_int'),
'e.row_id = c_p_e_i.row_id',array('value'));

$collection->getSelect()->joinLeft(array('attribute_option'=>'eav_attribute_option_value'),
'c_p_e_i.value = attribute_option.option_id and attribute_option.store_id = 0',
array('eaov_val'=>'value' , 'eaov_option'=>'option_id'));

$collection->getSelect()->where("`attribute_option`.`value` like ?", "%$value%");

return $this;
}
0

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