2

任何人都知道一种在后端使用 javascript 监听 magento 选项卡点击的方法,比如每次有人单击编辑客户页面上的选项卡时,您都想做一些事情。adminhtml/tabs.js 有这个:

    tabMouseClick : function(event) {
    var tab = Event.findElement(event, 'a');

    // go directly to specified url or switch tab
    if ((tab.href.indexOf('#') != tab.href.length-1)
        && !(Element.hasClassName(tab, 'ajax'))
    ) {
        location.href = tab.href;
    }
    else {
        this.showTabContent(tab);
    }
    Event.stop(event);
},  

但是没有用,有人知道吗?我还尝试使用标准原型 js 观察者:

Event.observe("product_info_tabs", "click", function () 
{ alert(1); 
});  

也没有做任何事情。该解决方案不应修改核心,因为这会增加许多升级问题,可能还会增加未来的 magento 版本。

4

2 回答 2

2

要在后端监听对 Magento 选项卡 ( varienTabs) 的点击,您只需将自定义观察者添加到现有观察者。使用您的示例(后端中的“编辑客户页面”),这将是:

var myTabs = $$("#customer_info_tabs li a.tab-item-link");
for (var i = 0; i < myTabs.length; i++) {
    Event.observe(myTabs[i], "click", function (event) {
        var tab = Event.findElement(event, "a");
        // insert your custom code here
        alert(tab.id);
        Event.stop(event);
    });
}

要在不更改核心文件(破坏可升级性)的情况下实现自定义观察者,您可以覆盖适当的管理控制器操作。

例如,覆盖Mage_Adminhtml_CustomerController::editAction()

<!-- app/code/local/My/Adminhtml/etc/config.xml -->
<config>
    <modules>
        <My_Adminhtml>
            <version>0.1.0</version>
        </My_Adminhtml>
    </modules>
    <admin>
        <routers>
            <adminhtml>
                <args>
                    <modules>
                        <My_Adminhtml before="Mage_Adminhtml">My_Adminhtml</My_Adminhtml>
                    </modules>
                </args>
            </adminhtml>
        </routers>
    </admin>
</config>

接下来,定义您的自定义管理控制器:

// app/code/local/My/Adminhtml/controllers/CustomerController.php
require 'Mage/Adminhtml/controllers/CustomerController.php';
class My_Adminhtml_CustomerController extends Mage_Adminhtml_CustomerController
{
    public editAction()
    {
        // copy of Mage_Adminhtml_CustomerController::editAction() code here
    } 
}

最后,在被覆盖的操作中,创建一个包含自定义观察者脚本的附加文本块,并将该块附加到布局中。例如在editAction插入的末尾是这样的:

    :
    $this->loadLayout();
    $oBlock = $this->getLayout()->createBlock('core/text')->setText('
         <script type="text/javascript">
            var myTabs = $$("#customer_info_tabs li a.tab-item-link");
            for (var i = 0; i < myTabs.length; i++) {
                Event.observe(myTabs[i], "click", function (event) {
                    var tab = Event.findElement(event, "a");
                    alert(tab.id);
                    Event.stop(event);
                });
            }
         </script>
    ');
    $this->getLayout()->getBlock('left')->append($oBlock);
    $this->renderLayout();
    :
于 2012-05-30T12:02:07.267 回答
0

旧答案,但因为我在这里:Magento internals 在显示选项卡时触发一个事件。您可以简单地挂钩该事件。

varienGlobalEvents.attachEventHandler('showTab', function(arg){
            console.log(arg.tab);
        });    

也不需要通过覆盖控制器注入。只需添加 yoru 自己的自定义布局指令,并相应地加载 js。

于 2017-06-05T09:18:56.913 回答