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の内部でイベントが発生します。そのイベントにフックするだけです。

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

また、オーバーライドコントローラーを介して注入する必要はありません。yoru独自のカスタムレイアウトディレクティブを追加し、それに応じてjsをロードするだけです。

于 2017-06-05T09:18:56.913 に答える