2

我添加了一个功能类似于相关产品的选项卡,我添加了一个带有如下下拉列表的列:

$this->addColumn('mycolumn', array(
        'name' => 'mycolumn',
        'header' => Mage::helper('catalog')->__('Display on current child page'),
        'index' => 'mycolumn',
        'type' => 'select',
        'width' => '1',
        'align' => 'center',
        'options' => array(
        1 => Mage::helper('catalog')->__('Yes'),
        0 => Mage::helper('catalog')->__('No'),
    ),
        'editable' => true
    ));

每次我更改选择时,我的产品都会被取消选中并且该行被禁用。

我发现这一行在 magento 中有注释:

     bindFieldsChange : function(){
        if (!$(this.containerId)) {
            return;
        }
 --->  //     var dataElements = $(this.containerId+this.tableSufix).down('.data tbody').select('input', 'select');
        var dataElements = $(this.containerId+this.tableSufix).down('tbody').select('input', 'select');
        for(var i=0; i<dataElements.length;i++){
            Event.observe(dataElements[i], 'change', dataElements[i].setHasChanges.bind(dataElements[i]));
        }
    }

我在 js/mage/adminhtml/grid.js 中找到了这段代码。当我取消注释这条线时,我的下拉菜单就像一个魅力......

我有两个关于这个问题的问题,第一个问题是取消注释是否安全(Magento 一定有理由改变这个)。

我的第二个问题是如何在不调整 grid.js 文件的情况下避免这种行为。我不喜欢以任何方式编辑核心文件,但无法弄清楚如何重写此功能或如何以行为不适用的方式添加我的列。

4

1 回答 1

2

行点击事件使用一个名为“openGridRow”的函数

在您的网格中包含一些 javascript,并使用一些自定义代码添加此函数以在满足某些条件时取消事件。然后将复选框设置回选中状态。

示例将是

function openGridRow(grid, event){
                var element = Event.findElement(event, 'tr');
                //alert(Event.element(event).tagName.toLowerCase());
                if(Event.element(event).type != 'checkbox'){
                  if(['img', 'a', 'input', 'select', 'option', 'img'].indexOf(Event.element(event).tagName.toLowerCase())!=-1) {
                      // re-enable the checkbox
                      var checkbox = Element.select(element, 'input');
                      if(checkbox[0] && !checkbox[0].disabled){
                          grid.setCheckboxChecked(checkbox[0], true);
                      }
                      return;
                  }
                }
                if(element.title){
                    setLocation(element.title);
                }
    }    

上面的例子什么都不做,如果点击的元素类型是 a、input、select 或 option 其他任何东西都会照常继续。

于 2013-03-16T15:32:48.777 回答