2012-05-28 3 views
2

Кто-нибудь знает способ прослушивания кликов на вкладках magento с javascript на сервере, скажем, вы хотите что-то делать каждый раз, когда кто-то нажимает вкладку на странице редактирования клиента. adminhtml/tabs.js имеет следующее:Magento: событие нажатия на вкладку

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 observer:

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

Ничего не делал. Решение не должно изменять основное ядро, так как это добавит много проблем с обновлениями и, возможно, будущими версиями magento.

+1

уточните пожалуйста больше. Обработчик 'varienTabs', который вы отправили обычно, - это место для прослушивания кликов на вкладках. –

+0

Насколько я вижу, этот класс используется для визуализации интерфейса, я не могу найти что-то, что можно использовать для получения события вкладки кликов. – changeling

+0

«Что-то, чтобы использовать для получения щелчка» уже есть, вам нужно только добавить свой код в обработчик 'tabMouseClick'. Например: вставьте строку «alert» (нажата вкладка «)», 'прямо перед блоком' if/else' вашего сообщения, чтобы увидеть это в действии. –

ответ

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(); 
    : 
+0

отлично, спасибо большое. – changeling

0

Старого ответа, но так как я здесь: Magento Внутренности огонь события, когда Дэ вкладки отображается. Вы можете просто подключиться к этому событию.

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

Также не нужно вводить с помощью управляющего контроллера. Просто добавьте в свою собственную директиву макета yoru и загрузите js соответственно.

Смежные вопросы