Artikeldetails um Tab erweitern

 Hallo erstmal, also meine frage ist wie kann ich in artikeldetails einen weiteren Tab hinzufügen, ich habe über das Buch(Shopware Das Handbuch für Entwickler) herrausgefunden das man mit der funktion getTabs einen weiteren Tab im Kunden modul erzeugen kann, aber diese funktion ist für die Artikeldetails nicht vorhanden nun meine frage wie wäre es dann möglich?  

//{block name="backend/customer/view/detail/window" append}
Ext.define('Shopware.apps.CustomerExtension.view.detail.Window', {
    override: 'Shopware.apps.Customer.view.detail.Window',

    getTabs: function () {
        var me = this,
            tabs = me.callParent(arguments);

        tabs.push({
            xtype: 'my-customer-tab'
        });

        return tabs;
    }
});
//{/block}

Das ist laut dem buch die zweite möglichkeit einen Tab hinzuzufügen aber ich verstehe nicht auf welchen blocknamen die zurückgreifen.

//{block name="backend/customer_extension/view/detail/window"}
Ext.define('Shopware.apps.CustomerExtension.view.detail.Container', {
    extend: 'Ext.panel.Panel',
    alias: 'widget.my-customer-tab',

    title: 'My new tab',
    cls: 'shopware-form',

    initComponent: function () {
        var me = this;

        me.items = me.createContainer();

        me.callParent(arguments);
    },

    createContainer: function () {
        var me = this;

        return [{
            xtype: 'fieldset',
            margin: 10,
            title: 'My fieldset',
            items: [{
                xtype: 'textfield',
                fieldLabel: 'Some text'
            }, {
                xtype: 'datefield',
                fieldLabel: 'Some date'
            }]
        }];
    }

});
//{/block}

 

Schau dir mal die Datei shopware/themes/Backend/Extjs/backend/article/view/detail/window.js an. Da gibt es folgende Methode:

/**
 * Creates the main tab panel which displays the different tabs for the article sections.
 * To extend the tab panel this function can be override.
 *
 * @return Ext.tab.Panel
 */
createMainTabPanel: function() {
   ..... 
}

Diese müsstest du dann überschreiben wie in deinen Buch beschrieben:

//{block name="backend/article/view/detail/window"}
Ext.override(Ext.container.DockingContainer, {
    dockedItems: []
});
Ext.define('Shopware.apps.Article.view.detail.Window', {
    // Möglichkeit 1
    initComponent:function () {
       var me = this;
       
       me.registerAdditionalTab({ // siehe Methode original js Datei
         title: 'Test-Tab',
         tabConfig: { disabled: false },
         contentFn: me.contentFn });
    },
    contentFn: function(article, stores, eOpts) {
       // Do stuff 
           eOpts.tab.add({ xtype: 'panel', html: 'Tab-Content' });
    },
    
    /**
     * Möglichkeit 2
     * Override creatMainTabPanel method and add your custom tab here.
     * To extend the tab panel this function can be override.
     *
     * @return Ext.tab.Panel
     */
    createMainTabPanel: function() {
       var me = this;
       
       // Call parent 
       me.callParent(arguments);

       // füge hier deinen eigenen Tab hinzu Siehe auch hier für andere Varianten an Tabs in 
       // original Methode
       me.additionalTab = Ext.create('Ext.container.Container', {
            title: "Zusätzlicher Tab",
            name: 'additional-tab',
            cls: Ext.baseCSSPrefix + 'additional-tab-container'
        });
    }
});
//{/block}

 

 

Danke erstmal, ich habe das meiner window.js hinzugefügt und mir das nochmal angesehen, da kommt mir aber die Frage auf überschreibe ich mit diesem Code das modul oder Erweiter ich es dann um den zuzätlichen Tab, weil bei mir kommt immer der Selbe Fehler…

Was mache ich falsch, also ich lade den subscriber mittels der servcis.xml

    public static function getSubscribedEvents()
    {
        return [
            'Enlight_Controller_Action_PostDispatchSecure_Backend_Article' => 'onArticlePostDispatch'
        ];
    }

    public function onArticlePostDispatch(Enlight_Event_EventArgs $args)
    {
        $args->getSubject()->View()->addTemplateDir(
            $this->Path() . 'views/'
        );

        //Hier lädst du alle Javascript Dateien die ein Override enthalten.
        if ($args->getRequest()->getActionName() == 'load') {
            $args->getSubject()->View()->extendsTemplate(
                'backend/tjl_artikel_ausleihe/view/detail/window.js'
            );
        }
        //Hier erweiterst du die APP.JS um eigene Komponenten (Models, Views, Stores, Controllers) hinzuzufügen
        if ($args->getRequest()->getActionName() == 'index') {
            $args->getSubject()->View()->extendsTemplate(
                'backend/tjl_artikel_ausleihe/app.js'
            );
        }
    }
}

Dann wird die Window.js geladen

//{block name="backend/article/view/detail/window" append}
//{$smarty.block.parent}
Ext.define('Shopware.apps.Article.view.detail.Window', {
    override: 'Shopware.apps.Article.view.detail.Window',
    // Möglichkeit 1
    initComponent: function () {
        var me = this;

        me.registerAdditionalTab({ // siehe Methode original js Datei
            title: 'Test-Tab',
            tabConfig: {disabled: false},

            contentFn: function (article, stores, eOpts) {
                // Do stuff
                eOpts.tab.add({xtype: 'panel', html: 'Tab-Content'});
            }

        });
    }
});
//{/block}

 

Den subscriber per service.xml zu laden ist schon mal sehr gut. Wie schaut denn deine Plugin ordernerstruktur aus. 

 

$args->getSubject()->View()->addTemplateDir(
            $this->Path() . 'Resources/views'
        );

        //Hier lädst du alle Javascript Dateien die ein Override enthalten.
        if ($args->getRequest()->getActionName() == 'load') {
            $args->getSubject()->View()->extendsTemplate(
                'backend/tjl_artikel_ausleihe/view/detail/window.js'
            );
        }
        //Hier erweiterst du die APP.JS um eigene Komponenten (Models, Views, Stores, Controllers) hinzuzufügen
        if ($args->getRequest()->getActionName() == 'index') {
            $args->getSubject()->View()->extendsTemplate(
                'backend/tjl_artikel_ausleihe/app.js'
            );
        }

Ändere die Pluginordernstuktur für die Views mal zu der folgenden

  1. Resources 
  2. views
    1. backend
    1. tj1_artikel_ausleihe

Schau dir auch mal die Dokumentation https://developers.shopware.com/developers-guide/backend-extension/ Da kannst du dir ganz unten auch das Beispiel Plugin (downloaded here) herunterladen. Dort kannst du dir abschauen wie die Struktur aufgebaut ist. 

Wenn alle Stricke reißen gibts da zur Not auch Plugins zu im Store.