Magento: отображать ссылки на различные действия в столбце в сетке внутренних данных - PullRequest
2 голосов
/ 13 июля 2011

Я сейчас работаю над пользовательским списком продуктов в бэкэнде 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',
));

, который уже работает как предпочтительный.

Но теперь я хочу отобразить другую ссылку действия, когда виджет уже создан (обновить виджет) вместо ссылки создания. Чтобы узнать, что виджет уже создан, я присоединил к коллекции атрибут, который равен нулю, когда он не существует, или является строкой, когда он существует.

Я уже пытался использовать пользовательский файл шаблона сетки, поместил переменную {actionAssign} в URL и назначил ее в шаблоне, но проверка URL magento опровергла это.

Есть ли способ сделать это без огромного обходного пути?

Если нет, можно ли создавать отключенные ссылки в зависимости от атрибута в моей коллекции продуктов?

Спасибо всем! MRU

Ответы [ 4 ]

4 голосов
/ 09 сентября 2014

Следующий код работает для меня. $this->addColumn('action', array( 'header' => Mage::helper('orderreminder')-><strong>('Action'), 'width' => '100', 'type' => 'action', 'getter' => 'getOrderId', 'actions' => array( array( 'caption' => Mage::helper('orderreminder')-></strong>('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, )); </p> <p>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; } }

4 голосов
/ 14 июля 2011

Для этого вам нужно создать пользовательский рендерер столбцов сетки:

  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',
    // ... 
    
2 голосов
/ 29 января 2016

Есть более простой метод:

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;
}
2 голосов
/ 11 февраля 2013

Для тех из вас, кто попробовал ответ Зявы, но он не сработал, вам может потребоваться сделать это вместо этого:

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

Я не знаю, где ошибка, так как в этом не должно быть необходимости, но ... это было для меня.

...