Magento - AdminHtml产品网格中的自定义列,其中包含自定义输出/逻辑?

时间:2013-12-10 03:32:35

标签: php sql magento

我想在Magento管理区域的“目录产品”网格中添加一个新列。

新列将被称为目前已打折?销售商品?,当产品price超过其{{}时,将显示“是” 1}}(即产品在销售中)。

到目前为止,我已经能够通过以下代码将special_price列添加到网格中:

special_price

$collection->joinAttribute('special_price', 'catalog_product/special_price', 'entity_id', null, 'left', $store->getId());

但我真正需要的是另一个专栏,它实际上执行某种逻辑来比较special_price并打印“是”如果它打折,那么“否”如果不打折。

我已经添加了该列,但是现在,显然它是空的,因为它的$this->addColumn('special_price', array( 'header'=> Mage::helper('catalog')->__('Special Price'), 'type' => 'price', 'currency_code' => $store->getBaseCurrency()->getCode(), 'index' => 'special_price', )); 与任何真实的数据源都不对应:

index

我将如何实现这一目标?我将把“is_sale_item”计算的逻辑放在哪里并使其成为“真正的”索引?

2 个答案:

答案 0 :(得分:2)

我设法实现了这一点,但是以一种轻微的hacky方式。如果有人知道更好的方式,请发表评论。

<强> 1。使用自定义渲染器和过滤器回调

将自定义列添加到列列表中
$this->addColumn('is_sale_item',
            array(
                'header'=> Mage::helper('catalog')->__('Sale Item?'),
                'type'  => 'options',
                'index' => 'is_sale_item',
                'options' => array( "no" => 'No', "yes" => 'Yes'),
                'renderer'  => 'Mage_Adminhtml_Catalog_Product_Renderer_Sale',
                'filter_condition_callback' => array($this, '_filterIsSaleItem'),
        ));

<强> 2。为新的自定义属性

创建自定义渲染器

我使用自定义渲染器来执行逻辑来测试项目是否已减少。同样,可能不是正确的方法。在包含Grid.php的文件夹中,创建Renderer/Sale.php

<?php
class Mage_Adminhtml_Catalog_Product_Renderer_Sale extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract
{
    public function render(Varien_Object $row)
    {
        $_price        = $row->getData("price");
        $_specialPrice = $row->getData("special_price");
        if ($_specialPrice && $_price > $_specialPrice) {
            return "Yes";
        } else {
            return "No";
        }
    }
}
?>

第3。添加过滤器回调,该回调将在使用过滤器时应用逻辑

回到Grid.php

protected function _filterIsSaleItem($collection, $column)
    {   
        $value = $column->getFilter()->getValue();

        if (!$value) {
            return $this;
        }

        $store = $this->_getStore();
        $this->getCollection()->joinAttribute('price', 'catalog_product/price', 'entity_id', null, 'left', $store->getId());
        $this->getCollection()->joinAttribute('special_price', 'catalog_product/special_price', 'entity_id', null, 'left', $store->getId());

        if ($value == "yes") {
            $this->getCollection()->getSelect()->where("_table_price.value >  _table_special_price.value");
        } else {
            $this->getCollection()->getSelect()->where("_table_price.value <= _table_special_price.value OR _table_special_price.value IS NULL");
        }

        return $this;

    }

答案 1 :(得分:2)

这应该有所帮助:

$this->addColumn('special_price', array(
    'header'    => Mage::helper('catalog')->__('Special Price'),
    'type'      => 'options',
    'index'     => 'special_price',
    'options' => Mage::getSingleton('eav/entity_attribute_source_boolean')->getOptionArray(),
));

@WackGet我希望你觉得这很有用:)。