Magento: Direktlink auf Tab in Adminhtml Tab Widgets

Für eine Extension an der ich neulich gearbeitet habe, habe ich mich gefragt, ob es eine eingebaute Möglichkeit gibt, direkt auf einen Tab einer Seite im Backend zu linken. Meine Nachforschungen haben nichts ergeben (sprich: Mein Google Foo hat versagt), also habe ich mir den Core Code vorgenommen um einen Ansatz zu finden. Was ich herausgefunden habe:

Das Problem

Im speziellen wollte ich einen Link auf den “Bezeichnungen / Optionen verwalten” Tab der “Produktattribut bearbeiten” Seite setzen:

Screenshot

Die Lösung

Tatsächlich ist es mit einem URL-Parameter möglich: ?active_tab=$id.

Wie finde ich die Tab-ID heraus?

Finde den verantwortlichen Tab Container. Dies ist eine Unterklasse von Mage_Adminhtml_Block_Widget_Tabs, in meinem Fall Mage_Adminhtml_Block_Catalog_Product_Attribute_Edit_Tabs.

Du wirst Aufrufe von $this->addTab() finden, üblicherweise in den Methoden _beforeToHtml(), oder _construct(). Der erste Parameter von addTab() ist die Tab ID:

    $this->addTab('labels', array(
        'label'     => Mage::helper('catalog')->__('Manage Label / Options'),
        'title'     => Mage::helper('catalog')->__('Manage Label / Options'),
        'content'   => $this->getLayout()->createBlock('adminhtml/catalog_product_attribute_edit_tab_options')->toHtml(),
    ));

Die URL ist also /admin/catalog_product_attribute/edit/attribute_id/123/?active_tab=labels, generiert mit diesem Code (innerhalb eines Adminhtml Blocks):

    $this->getUrl('adminhtml/catalog_product_attribute/edit',
        array('attribute_id' => 123, '_query' => array('active_tab' => 'labels'));

Wie es funktioniert

Schauen wir uns den verantwortlichen Code an:

Mage_Adminhtml_Block_Widget_Tabs::_beforeToHtml()

Setzt den aktiven Tab, basiert auf dem URL Parameter oder Session-Werts. Wenn setActiveTab() nicht aufgerufen wird, fällt die Eigenschaft _activeTab als Standardauf den zuerst hinzugefügten Tab zurück:

        if ($activeTab = $this->getRequest()->getParam('active_tab')) {
            $this->setActiveTab($activeTab);
        } elseif ($activeTabId = Mage::getSingleton('admin/session')->getActiveTabId()) {
            $this->_setActiveTab($activeTabId);
        }

app/design/adminhtml/default/default/template/widget/tabs.phtml

Hier wird das Ergebnis von getActiveTabId() an die varienTabs Instantiierung in JavaScript übergeben:

    <script type="text/javascript">
        <?php echo $this->getJsObjectName() ?> = new varienTabs(
            '<?php echo $this->getId() ?>',
            '<?php echo $this->getDestElementId() ?>',
            '<?php echo $this->getActiveTabId() ?>',
            <?php echo $this->getAllShadowTabs()?>);
    </script>

Der varienTabs Konstructor erwartet die ID des aktiven Tabs als Parameter und zeigt diesen. Für alle Neugierigen: Der Code ist in js/mage/adminhtml/tabs.js

Frage und Antwort auf StackExchange