Neu connector plugin

Lars Lorenz

Neues Mitglied
29. Oktober 2019
6
0
Hi,

ich wollte mein erstes connector plugin schreiben. Es geht hier um den Shopware connector v 2.2.3.1.
Ich wollte nun ganz einfach erstmal einen Einstiegspunkt definieren und zwar wollte ich das mein Plugin arbeitet wenn die WAWI die Bestellungen abholt.
Ich dachte nun also ich lege mir ein Ordner an unter jtlconnector/plugins meinPlugin
dann in die Bootstrap:
PHP:
namespace jtl\meinPlugin;

use jtl\Connector\Plugin\IPlugin;
use jtl\Connector\Event\CustomerOrder\CustomerOrderBeforePullEvent;
use Symfony\Component\EventDispatcher\EventDispatcher;

class Bootstrap implements IPlugin
{
    public function registerListener(EventDispatcher $dispatcher)
    {
        $dispatcher->addListener(CustomerOrderBeforePullEvent::EVENT_NAME, [
            new OrderListener(),
            'onCustomerOrderBeforePullAction'
        ]);
    }
}
dann im gleichen Ordner eben die Datei OrderListener.php angelegt.

PHP:
<?php

namespace jtl\meinPlugin;

use jtl\Connector\Event\CustomerOrder\CustomerOrderBeforePullEvent;
use jtl\Connector\Shopware\Utilities\Shop as ShopUtil;
use jtl\Connector\Core\Logger\Logger;
use jtl\Connector\Formatter\ExceptionFormatter;
use jtl\Connector\Core\Model\QueryFilter;

class OrderListener
{
    public function onCustomerOrderBeforePullAction(CustomerOrderBeforePullEvent $event)
    {

Logger::write('test ob mein plugin läuft', Logger::WARNING, 'cleverplugin');
        try {
            Logger::write($event->getCustomerOrder(), Logger::WARNING, 'cleverplugin');
        } catch (\Throwable $e) {
            Logger::write(ExceptionFormatter::format($e), Logger::WARNING, 'cleverplugin');
        }
    }
}
Ich dachte also das ich mir erstmal einfach etwas in die Logs schreibe. Im json habe ich den developer modus auf true gestellt. Seitdem sehe ich auch neue Logs im logs Ordner aber meine eingaben werden nirgends gespeichert.
Was mache ich hier falsch? Ziel ist es bei bestimmten Artikeln nach bestimmten Vorgaben ein Infoarray aufzubauen welches ich dann zB in die notes der bestellung speichern möchte.

Aber es geht mir hier auch vielmerh um das allgemeine Verständniss an der Stelle.


Vielen Dank für jede Hilfe
Viele Grüße
 

Immanuel

Moderator
Mitarbeiter
24. August 2016
480
80
Hallo Lars,

dadurch, dass der gewählte Namespace jtl\meinPlugin ist, müsste das Plugin innerhalb des plugin Ordners auch in jtl/meinPlugin liegen. Wenn ich dich richtig verstehe, liegt es aber nur in meinPlugin. Wenn du im Namespace der beiden Dateien jtl\ entfernst, dann sollte das Plugin funktionieren.
 

Lars Lorenz

Neues Mitglied
29. Oktober 2019
6
0
Hi,

erstmal vielen lieben Dank für die schnelle Antwort. Manchmal sieht man ja die simpelsten sachen nicht. Ich habe den namespace nun mal angepasst und auch weiter in die Richtung getestet, leider ohne Erfolg.
Ich hab auch einfach das Gefühl das das Plugin nicht wie gewünscht eingebunden wird, den selbst wenn ich hier zB ein "die();" reinsetze oder irgendwas es passiert einfach nichts.
Im RPC Log sehe ich das mein gewünschter event auch gestartet wird: "[#] rpc.DEBUG: RequestPacket: {"method":"customer_order.pull","params":"{\"limit\":50,\"filters\":[]}","jtlrpc":"2.0","id":"#"} [] []".
Meine Hoffnung war nun das irgendwo in diesen Logs auch meine
PHP:
Logger::write('test ob mein plugin läuft', Logger::WARNING, 'cleverplugin');
auftauchen, das tun sie aber leider nicht.
irgendwas mache ich hier immernoch falsch. Ich habe mich auch schon fürs webinar nächste Woche eingetragen, nur würde ich ungern so lange warten um hier weiter zu kommen.
Für Shopware habe ich in den letzten 5 Jahren erfolgreich einige Plugins entwickelt, insofern ist mir der Pluginstack auch nicht komplett neu.
Wie ist das mit diesem autoloader? Muss ich hier noch irgendwo mein plugin registrieren o.ä.?
Hier nochmal der komplkette Pfad:
engine/Shopware/Plugins/Community/Frontend/jtlconnector/plugins/meinPlugin

PHP:
namespace meinPlugin;

use jtl\Connector\Plugin\IPlugin;
use jtl\Connector\Event\CustomerOrder\CustomerOrderBeforePullEvent;
use Symfony\Component\EventDispatcher\EventDispatcher;
PHP:
namespace meinPlugin;

use jtl\Connector\Event\CustomerOrder\CustomerOrderBeforePullEvent;
use jtl\Connector\Shopware\Utilities\IdConcatenator;
use jtl\Connector\Shopware\Utilities\Shop as ShopUtil;
use jtl\Connector\Core\Logger\Logger;
use jtl\Connector\Formatter\ExceptionFormatter;
use jtl\Connector\Core\Model\QueryFilter;

class OrderListener
{
    public function onCustomerOrderBeforePullAction(CustomerOrderBeforePullEvent $event)
    {
Nun hatte ich noch die Idee das ich den listener irgendwie genauer registrieren müsste also zB das ich Ihn nochmal in nen Unterordner spielen muss oder auch beim registrieren der Klasse etwas anders aufbauen muss.
Bin weiterhin über jeden Hinweis dankbar.

Viele Grüße
 

Immanuel

Moderator
Mitarbeiter
24. August 2016
480
80
Fängt die bootstrap.php mit einem kleinen oder großen B an? Damit es funktioniert, muss die bootstrap.php komplett klein geschrieben werden.
 
  • Gefällt mir
Reaktionen: Lars Lorenz

Lars Lorenz

Neues Mitglied
29. Oktober 2019
6
0
Hi,

suuuper das war es vielen Dank. Nun kann ich zumindest klar verifizieren das mein Plugin läuft und damit hab ich schonmal die halbe Miete.

Aber ich konnte per:
PHP:
Logger::write('test ob mein plugin läuft', Logger::WARNING, 'cleverplugin');
keien Infos in ein logfile schreiben, oder ich habe das falsche Logfile. Gibt es eine Doku zu der Logger funktion?
Grundsätzlich denke ich kann ich mir hier nun auch anders helfen aber interessant finde ich das eben schon.


PS Der Logger macht nun auch wie gewünscht seine Arbeit.

Mal ganz abgesehen davon: Toller support hier vorbildlich!!!

Viele Grüße
 
Zuletzt bearbeitet:

Lars Lorenz

Neues Mitglied
29. Oktober 2019
6
0
Nochmal ein Nachtrag:

ausserdem würde mich ein Beispiel für den queryfilter interessieren. Wenn ich das ganze richtig verstehe kann ich im before.pull ja ein filter definieren.
Ich würde jetzt erwarten das ich dieses filter array dafür nutzen könnte bestimmte Bestellungen vom export zur jtl wawi auszuschließen. Das wäre jetzt eine Erweiterung die mich einfach interessieren würde. Klar ich könnte sicherlich auch ein workflow im jtl einrichten welcher dann Bestellungen zB anhand eines Eintrags im note feld markiert/entfernt o.ä. aber ich denke die Funktion ist ja hier schon gegeben.
wie genau kann ich diesen Queryfilter nutzen / erweitern (standard mäßig gibt es hier immer ein limit Wert, und eine leeres filter array).


Viele Grüße und
vielen Dank
 

Lars Lorenz

Neues Mitglied
29. Oktober 2019
6
0
Hi,

ich habe nun heute mit Hilfe der neuen Informationen aus dem webinar ein wenig weiter Licht ins dunkle gebracht. Leider konnte mir meine Frage bzgl. der Syntax/eines Beispiels zur nutzung des Queryfilters hier auch nicht beantwortet werden. Hier nochmal mein Ziel:
Ich möchte bestimmte Bestellungen für den connector blocken. Diese sollen beim CustomerOrder pull nicht in die WaWi übernommen werden.
Meine Idee war nun das ich zB in das note feld der Bestellung noch auf Shopwareseite während des Bestellprozesses etwas eintrage, und diese Bestellung dann blocke. Im customerOrderBeforePull Event habe ich ja keine wirklichen Orderdaten sondern eben nur ein Object mit einen Limit Wert und einem leeren Array was filters heßt:
Code:
jtl\Connector\Core\Model\QueryFilter Object

(

    [limit:protected] => 50

    [filters:protected] => Array

        (

        )


)
Nun dachte ich das ich mithilfe der möglichen methoden aus der QueryFilter class wie zB addFilter; setFilters o.ä. einen filter definieren kann der eben die Orders schon vorher auf den individuellen Wert filtert.
Ich hatte sachen versucht wir zb:

PHP:
use jtl\Connector\Core\Model\QueryFilter as Filter;

....

Filter::setFilters('fields.city', 'berlin');
$event = $event->addFilter('fields.city', 'berlin');

oder auch

Filter::setFilters('customerId', '2');
$event = $event->addFilter('customerId', '2');
leider hat nichts zum erfolg geführt (verwendet habe ich hier erstmal möglist eindeutige Werte, welche ich auch zB im rpcviewer sehen kann).

Wenn ich nun den customerOrdersAfterPullEvent nehme dann kann ich zwar die orders durchsteppen, sehe hier aber 2 Probleme:
1. Ich weiß ja nicht genau wie der connector abarbeitet aber wenn die orders im Query ein limit von 100 haben und nach und nach die 100 bestellungen welche er dann ziehen sollte alle als geblockt nicht in die WaWi wandern würde ja am ende garnichtsmehr in der WaWi ankommen oder?
2. Ich habe es nochnicht probiert aber ich könnte mir gut vorstellen das es der WaWi/dem connector auch nicht besonders gut gefällt wenn ich jetzt einfach sachen aus dem Array rauschmeiße oder ist das kein Problem?

Vielleicht erwarte ich auch einfach zu viel von den Anpassungsmöglichkeiten, irgendwie habe ich das gefühl das mein vorhaben (was am ende hauptsächlich den Komfort im täglichen Umgang verbessern soll und dementsprechend als "kleiner Eingriff" gewertet wird) am ende recht kompliziert und aufwändig wird.

Ich weiß leider nichtmehr weiter und hoffe hier kann mir nochmal wer weiterhelfen.


Viele Grüße &
vielen Dank
 

Immanuel

Moderator
Mitarbeiter
24. August 2016
480
80
Hallo @Lars Lorenz,

das wird so leider nicht funktionieren. Der Query Filter existiert zwar, wird aber gar nicht verwendet. Wir überlegen ob wir zwei weitere Events dem Connector Core hinzufügen:

BeforeHandle [ControllerName, Action, Data] => Data würde bei Push und Delete aus den von der Wawi gesendeten Daten bestehen. Bei Statistic und Pull wäre Data der QueryFilter
AfterHandle [ControllerName, Action, Result] => Result wäre bei Push und Delete alle von der Wawi gesendeten Elemente. Bei Pull wären in Result alle Elemente, die in der Pull Methode geholt wurden. Und bei Statistic wäre Result die Anzahl der noch zu importiereneden Elemente.

In deinem Falle wäre dann das AfterHandle Event interessant, wo entsprechend bei dem Controller "CustomerOrder" und der Action "pull" das "Result" gefiltert werden könnte.

Könntest du damit arbeiten?
 

Lars Lorenz

Neues Mitglied
29. Oktober 2019
6
0
Hallo @Immanuel ,

vielen Dank für die Rückmeldung. Grundsätzlich hört sich das sehr gut an, die Frage die ich mir direkt stelle ist wofür dann das Event customerOrderBeforePull zur Zeit überhaupt genutzt werden kann?
Wenn ich das richtig verstehe würde das bedeuten das im customerOrderHandleAfterPull Event im Result nur noch genau die elemente sind welche geholt werden sollen. Also wenn es nur 3 neue noch nicht in der Wawi vorhandene Orders gibt wären hier eben nur diese 3 drinnen? Welche ich dann entsprechend filtern könnte.
Woran erkennt den der connector das er aktuelle Order bereits gezogen hat? Gibt es da intern eine art matching Table oder läuft das irgendwie über eine art Timestamp o.ä.?
Ich habe halt ein wenig Bauchschmerzen das er ansonsten versucht die geblocken Orders immer wieder zu ziehen was dann irgendwann das Limit sprengen könnte...

Sorry das ich soviele Fragen vermixe, aber ich bin noch sehr neu beim jtl-connector und versuche mir hier mein Überblick zu verschaffen.

Zuletzt natürlich die übliche Frage: kann man abschätzen wann ein solches feature eingebaut wird?


Viele Grüße und vielen Dank für die gute Unterstützung.
 

Über uns

  • In unserem moderierten JTL-Forum könnt Ihr Euch themenbezogen mit der JTL-Community rund um die Produkte von JTL, passende Erweiterungen und den E-Commerce im Allgemeinen austauschen, Tipps und Tricks teilen sowie Verbesserungswünsche und Fehler diskutieren.

    Unsere Forumsnutzer helfen sich untereinander auch gerne weiter, wenn Sie mal nicht weiterkommen oder einen Ratschlag benötigen.

Schnell-Navigation

Benutzer Menü