我想在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”计算的逻辑放在哪里并使其成为“真正的”索引?
答案 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我希望你觉得这很有用:)。