Hallo liebe Community, seit einigen Tagen beschäftige ich mich mit der Frage: - Wie kann ich auf den Standard Controller von Shopware zugreifen? Genauer gesagt auf den Shopware()-\>Controller()-\>Backend()-\>ImportExport()
Wenn ich diesen Code eingebe: $controller = Shopware()-\>Controller()-\>Backend();
Bekomme ich diese Fehlermeldung: [quote]Method „Shopware::Controller“ not found failure in Shopware/Plugins/Local/Backend/demoPlugin/Bootstrap.php on line 75[/quote] Was mache ich falsch?
Ich bin mir nicht so ganz sicher was du da eigentlich vorhast. Du kannst Controller nicht einfach so aufrufen, weil der Controller dafür da ist den Request/Response Cycle zu bearbeiten. Wie ich in einem anderen Post schon mal schrieb, habe ich das Problem im Shopware CLI Framework schon gelöst und wenn du nicht weiter weißt, könntest du dir einfach mal anschauen wie ich das da gemacht habe und es genauso machen. Du könntest sogar einfach den ganzen Controller Namespace nehmen und den eins zu eins verwenden: Eigene Klasse schreiben, die von dem Controller erbt, den du haben willst. Den CLIControllerTrait da reinladen und den Konstruktor überschreiben - fertig. Das steht aber auch alles in der Doku.
Ich kann mir schon denken, was da der Gedanke war - in Shopware ist die Idee von “skinny controllers, fat models” noch nicht an allen Stellen umgesetzt und man hätte an einigen Stellen gerne Zugriff auf die Controllerlogik - ohne entsprechende Templateausgabe (ich hatte einen ähnlichen Fall gerade im Backend beim CSV Export, wo der komplette Zusammenbau der Files im Controller stattfindet). Für eigene Plugins macht es Sinn die Logik in Components zu kapseln - das lässt sich dann prima in der Plugin Bootstrap beim Aufruf instanzieren, genauso wie im Controller oder sonstwo. Ach so, und plus ein Daumen hoch für die CLI Klasse.
Nachdem ich mir das jetzt noch einmal angeschaut habe: Wenn du einfach nur die Controller Action triggern willst, kannst du in deinem Plugin ja auch einfach die URL via Curl aufrufen. Schau dir mal im Backend an, welche URL da aufgerufen wird, wenn du unter Inhalte -> Import/Export einen Import einstellst, siehst du dass da - die URL backend/ImportExport/import aufgerufen wird - eine CSV Datei via POST mitgeschickt wird - der Parameter type gesetzt wird (etwa: articles) Wenn du dass jetzt von deinem Cronjob aus aufrufen willst, kannst du das ja einfach via curl machen. Das ist in Shopware eh Pflicht, und man kann damit easy Fileuploads machen.
Hallo Christian, vielen Dank für dein Rat. Ich habe es mit CURL versuch, leider funktioniert es noch nicht so richtig. Hier ist der Code was ich verwende. public function onRunDemoCronJob(\Shopware\_Components\_Cron\_CronJob $job) { Shopware()-\>Plugins()-\>Backend()-\>Auth()-\>setNoAuth(); Shopware()-\>Plugins()-\>Controller()-\>ViewRenderer()-\>setNoRender(); $target\_url = 'http://www.demoShop.de/backend/ImportExport/import.php'; $file\_name\_with\_full\_path = realpath('article\_import.csv'); $post = array('type' =\> 'articles','file\_contents'=\>'@'.$file\_name\_with\_full\_path); $ch = curl\_init(); curl\_setopt($ch, CURLOPT\_URL,$target\_url); curl\_setopt($ch, CURLOPT\_POST,1); curl\_setopt($ch, CURLOPT\_POSTFIELDS, $post); curl\_exec($ch); curl\_close ($ch); return true; }
Obwohl ich im Code (curl_setopt($ch, CURLOPT_POST,1);) versuche es über Post zu übertragen. So zeigt mir der Browser es immer GET Methode. So sieht es aus wenn ich es über den Backend mache: Und So sieht es aus wenn ich es über mein Cronjob es machen lasse: Hast du oder jemand anderer ne Idee wieso es nicht funktioniert?
… die Curl Abfrage läuft serverseitig. Die taucht in deiner Chrome Konsole nicht auf.
ok, aber wieso funktioniert es nicht? Habe ich ein Fehler im Code? Den die Artikeln werden nicht importiert. Habe ich die Möglichkeit die Fehler oder die Ausgaben zu Loggen? um dem Fehler auf die Spur zu kommen?