Magento:在后端数据网格的一列中显示不同的操作链接


Magento: Show different action links in on column in the backend data grid

我目前正在Magento后端制作一个自定义产品列表。

下面是我目前用来添加一行的代码:

$this->addColumn('action_widget',
    array(
        'header'    => Mage::helper('catalog')->__('Action'),
        'width'     => '110px',
        'type'      => 'action',
        'getter'    => 'getId',
        'actions'   => array(
            array(
                'caption' => Mage::helper('catalog')->__('Create Widget'),
                'url'     => array(
                    'base'=>'*/*/create_widget',
                    'params'=>array('store'=>$this->getRequest()->getParam('store'))
                ),
                'field'   => 'id'
            )
        ),
        'filter'    => false,
        'sortable'  => false,
        'index'     => 'stores',
));

已经可以作为首选。

但是现在我想显示另一个动作链接时,小部件已经创建(更新小部件),而不是创建链接。要知道小部件已经创建,可以将一个属性加入到集合中,当它不存在时为null,当它存在时为字符串。

我已经尝试使用自定义网格模板文件,将{actionAssign} '变量'放入url并在模板中分配,但magento url验证拒绝了。

有没有办法做到这一点,没有一个巨大的解决方案?

如果没有,是否可以根据产品集合中的属性创建禁用链接?

谢谢大家!个系统

您需要为此创建自定义网格列渲染器:

  1. 创建类并覆盖_transformActionData()或render()方法,这取决于你到底需要什么:

    class Mycompany_Mymodule_Block_Adminhtml_Template_Grid_Renderer_Myrendered extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Action 
    {
      ... 
    }
    
  2. 告诉magento为这个列使用自定义渲染器:

    // ...
    'filter'    => false,
    'renderer'  => 'mycompany_mymodule/adminhtml_template_grid_renderer_myrenderer',
    'sortable'  => false,
    'index'     => 'stores',
    // ... 
    

下面的代码是为我工作。 $this->addColumn('action', array( 'header' => Mage::helper('orderreminder')->('Action'), 'width' => '100', 'type' => 'action', 'getter' => 'getOrderId', 'actions' => array( array( 'caption' => Mage::helper('orderreminder')->('View Order'), 'url' => array('base'=> 'adminhtml/sales_order/view'), 'field' => 'order_id' ) ), 'filter' => false, 'renderer' => 'Mycompany_Mymodule_Block_Adminhtml_Template_Grid_Renderer_Myrendered', 'sortable' => false, 'index' => 'stores', 'is_system' => true, ));

class Mycompany_Mymodule_Block_Adminhtml_Template_Grid_Renderer_Myrendered extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Action { public function render(Varien_Object $row) { $value = $row->getData('increment_id'); if($value = $row->getData('increment_id')) return 'getUrl('adminhtml/sales_order/view',array('order_id'=>$row->getData('order_id'))).'">View Order'; else return false; } }

对于那些尝试过Zyava的答案但它不起作用的人,您可能需要这样做:

'filter'    => false,
'renderer'  => Mage::getConfig()->getBlockClassName('mycompany_mymodule/adminhtml_template_grid_renderer_myrenderer'),
'sortable'  => false,
'index'     => 'stores',

我不知道bug在哪里,因为这应该是不必要的,但是…

有一个更简单的方法:

protected function _prepareColumns()
{
    $this->addColumn('action1',
        array(
            'type' => 'action',
            'getter' => 'getId',
            'frame_callback' => array($this, 'decorateRow'),
            'actions' => array( ... )
            'index' => 'stores',
            'is_system' => true,
        ));
    return parent::_prepareColumns();
}
public function decorateRow($sVal, Mage_Core_Model_Abstract $oRow){
    return $oRow->getData('something') ? '' : $sVal;
}