可能有人知道如何通过渲染器返回的值来过滤产品网格。
在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? 谢谢你的回答。
答案 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()
。您必须决定要使用哪一个。您始终可以将其分成不同的列。
我希望这会有所帮助。