如何按渲染器函数magento中计算的值进行过滤

时间:2014-11-24 23:35:30

标签: magento

可能有人知道如何通过渲染器返回的值来过滤产品网格。

在Grid.php中我有:

 protected function _prepareCollection() {
    $collection->joinField( 'qty', 'cataloginventory/stock_item', 'qty', 'product_id=entity_id', '{{table}}.stock_id=1', 'left' );


$collection->joinTable( 'cataloginventory/stock_item','product_id=entity_id', array("stock_status" => "is_in_stock", "plan") )
 ->addAttributeToSelect('stock_status')
 ->addAttributeToSelect('plan');

protected function _prepareColumns() {
$this->addColumn( 'qty', 
            array(
                'header' => Mage::helper( 'catalog' )->__( 'Qty' ), 
                'width' => '30px', 
                'type' => 'number', 
                'index' => 'qty',
                'renderer'      =>      new TBT_Enhancedgrid_Block_Catalog_Product_Grid_Plan(),
            ) );

}

在Plan.php中

 public function render(Varien_Object $row) {
    $value = $row->getData('qty');
     if (is_numeric($value))
            {
                $value = round($value, 2);
            }
    $value1 = $row->getData('plan');
     if (is_numeric($value1))
            {
                $value1 = round($value1, 2);
            }
    $value3 = $value/$value1;
    $valuepr = number_format( $value3 * 100, 2 ) . '%';
    return '<strong>К: </strong>'.$value. '<br/>'.'<strong>P: </strong>'.$value1.'<br/>'.'<strong>Z: </strong>'.$value2.'<br/>'.'<strong>Pr: </strong>'.$valuepr;    
        }
}

它工作正常并显示我需要的结果,但我如何按值过滤网格,这已经获得$ valuepr? 谢谢你的回答。

1 个答案:

答案 0 :(得分:0)

如果您想按$valuepr过滤收集,那么它必须在集合本身。目前,您使用render()方法在集合之外计算它。

为此,您需要在_prepareCollection()方法中修改集合。这可能类似于以下代码(请注意,我无法对此进行测试,因此它更像是一个提示,而不是现成的解决方案):

protected function _prepareCollection()
{
    // current collection settings goes here

$collection->getSelect()
    ->columns(
        array(
            'value_pr' => new Zend_Db_Expr(
                'ROUND(ROUND(table_prefix_1.qty, 2) / ROUND(table_prefix_2.plan, 2), 2)'
            )
        )
    );

}

其中$collection->getSelect() ->columns( array( 'value_pr' => new Zend_Db_Expr( 'ROUND(ROUND(table_prefix_1.qty, 2) / ROUND(table_prefix_2.plan, 2), 2)' ) ) ); 是第一个table_prefix_1表的前缀,cataloginventory/stock_item是第二个stock_item表的前缀。如果您想知道这些表有哪些前缀,您可以记录SQL查询,例如:

table_prefix_2

第一个将SQL查询记录到sql.log文件中。您将在Magento实例的Mage::log($collection->getSelect()->assemble(), null, 'sql.log'); // or $collection->load(false, true); 文件夹中找到它。然而,这对于诸如产品,类别或客户的EAV集合将无法正常工作。这就是我提供第二种检查SQL的方法的原因。您可以在集合var/log方法中提供2个参数。第一个是一个标志,告诉我是否在针对数据库运行查询之前显示查询,第二个是一个标志,告诉是否将查询记录到system.log中。

请注意,您只能使用一个值过滤网格列。您无法同时按数量和value_pr过滤列load()。您必须决定要使用哪一个。您始终可以将其分成不同的列。

我希望这会有所帮助。