2012-03-02 2 views
2

말 그리드에서 하나의 열이 계산 한 값을 텍스트 유형 열 필터링 :젠토 관리자 그리드에서 MySQL의 계산 된 값

setCollection() :

'refunded' => new Zend_Db_Expr("IF(qty_refunded > 0, 'Yes', 'No')"), 

_prepareColumns()를 :

$this->addColumnAfter('refunded', array(
    'header' => Mage::helper('helper')->__('Refunded'), 
    'index' => 'refunded', 
    'type' => 'text', 
), 'qty'); 

"예"값을 가진 열을 가지려면 어떻게 변경해야합니까? "예"라고 입력 한 다음 필터합니까?

+0

예/아니요 열에'options' 유형을 사용하지 않는 이유가 있습니까? –

+0

@ Jürgen Thelen - 네, Magento 초보자입니다. 그러나 나는 너의 제안을 시도 할 것이다. – nevvermind

+0

아무런 의미가 없습니다. 너를 웬일인지 피하는 줄 알았다. –

답변

4

Adminhtml 격자 열은 블록 클래스를 지정하는 필터 속성을 가지고 있습니다. 부울 예/아니요 필드의 경우 일반적으로 adminhtml/widget_grid_column_filter_select이됩니다.
필드 유형이 '옵션'일 경우 자동으로 사용됩니다.

'refunded' => new Zend_Db_Expr("IF(qty_refunded > 0, 1, 0)"), 

을 그리고 _prepareColumns() 사용 :

_prepareCollection()이 시도

$this->addColumnAfter('refunded', array(
    'header' => Mage::helper('helper')->__('Refunded'), 
    'index' => 'refunded', 
    'type' => 'options', 
    'options' => array(0 => $this->__('No'), 1 => $this->__('Yes')) 
), 'qty'); 

이 여전히 "예"로 값을 렌더링해야하며, "아니오"열에서, 그리고 필터 드롭 다운으로 적절한 옵션을 선택하면됩니다.

계산 된 값이있는 열을 MySQL의 WHERE 절에서 직접 참조 할 수 없으므로이 값만으로는 충분하지 않습니다. Magento는이를 해결하기위한 두 가지 옵션을 제공합니다.

열 필터 블록은 컬렉션을 필터링하는 데 사용할 조건을 반환하는 getCondition() 메서드를 가지고 있습니다. 예를 들어 Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Abstract::getCondition()을 참조하십시오.
필터를 실행하는 데 사용되는 SQL을 사용자 정의해야하는 경우 Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Select까지 확장 된 고유 한 열 필터 블록을 만들고 필요에 따라 반환 된 조건을 조정하십시오. 즉, 일치하는 계산 된 값을 사용하십시오. 당신이 젠토의 ORM 필터 구문의 한계 밖에서 일을 prefere 경우

'type' => 'options', 
    'options' => array(0 => $this->__('No'), 1 => $this->__('Yes')), 
    'filter' => 'your_module/adminhtml_widget_grid_column_filter_custom', 

것은, 당신이 컬렉션을 사용하여 직접 선택 수정할 수 있습니다
은 귀하의 사용자 정의 필터는 addColumn() 정의에서이 같은 열을 지정할 수 있습니다 필터 콜백 :

'type' => 'options', 
    'options' => array(0 => $this->__('No'), 1 => $this->__('Yes')), 
    'filter_condition_callback' => array($this, '_applyMyFilter'), 

콜백 수집 및 인수로 열을 수신한다. 여기서 그 방법에 대한 간단한 예이고, (계산 된 값에 대해 필터링) 두 가지 방식이 MySQL은 매우 비효율적이라고 말할

protected function _applyMyFilter(Varien_Data_Collection_Db $collection, Mage_Adminhtml_Block_Widget_Grid_Column $column) 
{ 
    $select = $collection->getSelect(); 
    $field = $column->getIndex(); 
    $value = $column->getFilter()->getValue(); 
    $select->having("$field=?, $value); 
} 


. 하지만이 경우에는 문제가되지 않을 수도 있습니다.

0

나는 예제를 게시 할 것이지만, Vinai의 대답은 매우 자세하게 선택하겠습니다.

그리드에서.ph :

protected function _addColumnFilterToCollection($column) 
{ 
    if ($column->getId() == 'refunded' && $column->getFilter()->getValue()) { 
     $val  = $column->getFilter()->getValue(); 
     $comparison = ($val === "No") ? 'lteq' : 'gt'; // lteg: <=; gt: > 

     $this->getCollection()->addFieldToFilter('ois.qty_refunded', array($comparison => 0)); 
    } else { 
     parent::_addColumnFilterToCollection($column); 
    } 

    return $this; 
}