RagnarZeroRagnarZero MitgliedKommentare: 3 Danke erhalten: 0 Mitglied seit: 13. Februar

Hallo miteinander,

ich bin noch recht neu in Shopware und bin gerade dabei ein kleines Plugin zu schreiben. Das Plugin nimmt einige zusätzliche Daten bei der Bestellung entgegen und speichert sie in Attribute in der s_orders_detail_attributes. Das funktioniert soweit auch schon mal ganz gut. Nun geht es darum diese im Backend in der Bestellübersicht anzuzeigen und zwar am liebsten als zusätzliche Felder bei den Positionen.

Ich dachte bevor ich "echte" Daten dort anzeige, versuche ich erstmal die Tabelle dort zu erweitern und irgendeinen String anzuzeigen. Komme allerdings nicht wirklich weiter. Habe jetzt viel hier im Forum gelesen und das Tutorialprojekt zu dem Thema durchstöbert, aber bei mir will einfach nichts passieren :/

Ich habe folgende Komponenten:

Den Subscriber, der auf ein PostDispatch auf den Order Controller im Backend reagiert:

<?php
namespace TestPlugin\Subscriber;

use Enlight\Event\SubscriberInterface;

class ExtendOrderPositionSubscriber implements SubscriberInterface
{
   private $pluginDirectory;


   public static function getSubscribedEvents()
   {
       return [
            'Enlight_Controller_Action_PostDispatchSecure_Backend_Order' => 'onOrderPostDispatch'
        ];
   }

    public function __construct($pluginDirectory)
    {
        $this->pluginDirectory = $pluginDirectory;
    }

    public function onOrderPostDispatch(\Enlight_Event_EventArgs $args)
    {
        $controller = $args->getSubject();

        $view = $controller->View();
        $request = $controller->Request();
        
        $view->addTemplateDir($this->pluginDirectory . '/Resources/views');

        if ($request->getActionName() == 'getList') {
            $view->extendsTemplate('backend/test_plugin/view/model/position.js');
            $view->extendsTemplate('backend/test_plugin/view/detail/position.js');
        }   
    }
}

Ich höre hier auf getList, weil er, soweit ich das verstehe an dieser Stelle die Liste zusammenbaut. Habe aber auch schon andere Actions ausprobiert. Ist das vielleicht der falsche Anknüpfungspunkt und da läuft vom Timing her was schief?

Dann meine Erweiterung der ExtJS-Klasse (liegt in Resources/views/backend/test_plugin/view/detail/position.js)

//{block name="backend/order/view/detail/position"}
// {$smarty.block.parent}
Ext.define('Shopware.apps.TestPlugin.view.detail.Position', {
    override: 'Shopware.apps.Order.view.detail.Position',


     getColumns:function (grid) {
            console.log("Executing getColumns");
            var me = this;
            var columns = me.callParent(arguments);
            columns.push(
            {
                header: 'Test',
                dataIndex: 'test',
                flex: 1,
                renderer: function(value, metaData, record) {
                    return 'bla';
                }
            });
            return columns;
    }

});
//{/block}

Dann benötige ich glaube ich noch eine Model-Erweiterung (liegt in Resources/views/backend/test_plugin/model/position.js):

// {block name='backend/order/model/position/fields' append}
// {literal}
{ name: 'test', type: 'string' },
// {/literal}
// {/block}

Habe ich vielleicht irgendwas wichtiges vergessen? Das console.log() in der getColumns wird auch nicht aufgerufen leider.

Bin für jeden Hinweis dankbar!

Antworten

  • RagnarZeroRagnarZero MitgliedKommentare: 3 Danke erhalten: 0 Mitglied seit: 13. Februar

    Hat niemand eine Idee oder vielleicht schonmal etwas ähnliches implementiert?

    Habe als Basis das Beispiel aus der Dokumentation für Erweitern von Backendfunktionen benutzt:

    https://developers.shopware.com/developers-guide/backend-extension/

  • simklisimkli MitgliedKommentare: 1007 Danke erhalten: 364 Mitglied seit: Februar 2014

    Schau dir noch einmal die Beispiele in dem von dir verlinkten Artikel an.
    Du frägst ab, ob die Action "getList" heißt und erweiterst dann mit extendsTemplate. getList holt aber nur die Daten, die ExtJS Applikation ist dabei schon längst generiert.
    Du musst hier ebenfalls die index bzw. load Action nutzen um das Template zu erweitern, analog zu dem von dir genannten Artikel.

    Zusammenfassend: 

    • Kunde öffnet die Bestellungen-Applikation
    • Shopware feuert den index/load Action des jeweiligen Controllers, welche die Javascript-Dateien lädt (<- hier musst du erweitern)</li>
    • Die ExtJS Applikation feuert dann den getList Request um die eigentlichen Bestelldaten zu laden (<- hier versuchst du oben die Javascript-Anwendung zu erweitern -> Falsch.)

    Viele Grüße

    Danke von 1RagnarZero
  • RagnarZeroRagnarZero MitgliedKommentare: 3 Danke erhalten: 0 Mitglied seit: 13. Februar

    Danke für die schnelle Antwort!

    Das probier ich heute Abend gleich mal aus. Ich hatte mir testweise mal alle ActionNames, die für den Order-Controller aufgerufen werden ausgeben lassen und dabei kein load finden können, deshalb war ich davon ausgegangen, dass sie in dem Controller nicht existiert (was mir aber auch schon komisch vorkam).

    Viele Grüße und schönes Wochenende :)

  • simklisimkli MitgliedKommentare: 1007 Danke erhalten: 364 bearbeitet 16. Februar Mitglied seit: Februar 2014

    Die wirst du dort auch nicht finden. Diese werden, da sie eben für alle Backend Controller gleich sind,  in der Elternklasse Shopware_Controllers_Backend_ExtJs definiert ;)

    Viele Grüße

  • RagnarZeroRagnarZero MitgliedKommentare: 3 Danke erhalten: 0 Mitglied seit: 13. Februar

    Aua, klar. Da hatte ich wohl ein Brett vorm Kopf ;)

    Danke nochmal

Anmelden oder Registrieren, um zu kommentieren.