Controllermethode aus der Bootstrap aufrufen

Hallo Shopware-Team, Wie kann ich aus der Bootstrap.php eine Methode des Controllers aufrufen? class Shopware\_Plugins\_Backend\_ImportCSV\_Bootstrap extends Shopware\_Components\_Plugin\_Bootstrap { public function install() { $event = $this-\>createEvent( 'Enlight\_Controller\_Dispatcher\_ControllerPath\_Backend\_ImportCSV', 'onGetControllerPathBackend' ); $this-\>subscribeEvent($event); $parent = $this-\>Menu()-\>findOneBy('label', 'Inhalte'); $item = $this-\>createMenuItem(array( 'label' =\> 'CSV Import', 'onclick' =\> 'openAction(\'ImportCSV\');', 'class' =\> 'ico2 money\_euro', 'active' =\> 1, 'parent' =\> $parent, 'style' =\> 'background-position: 5px 5px;' )); $this-\>Menu()-\>addItem($item); $this-\>Menu()-\>save(); return true; } public static function onGetControllerPathBackend(Enlight\_Event\_EventArgs $args) { return dirname(\_\_FILE\_\_).'/ImportCSV.php'; # Controller laden } } Hier gebe ich ja nur den Controller zurück. Ich würde gern einen Aufruf einer bestimmten Action in der „ImportCSV.php“ durchführen. Wie mache ich das am Besten? Viele Grüße

Hallo noch mal, ist so etwas einfach nicht möglich? Oder liegt’s an mir? :slight_smile: Viele Grüße

Hi, kannst du vielleicht noch etwas genauer beschreiben wozu du eine Controller-Methode direkt aufrufen möchtest? Eigentlich sind ja die Controller nur für den Aufruf über den Brower bzw. den Front-Controller gedacht. Heiner

Klar, also habe mir ein einen Importer anhand eines Backend-Plugins gebaut. Beim Klick aus dem Backend beginnt dieser zu importieren (er ruft dabei die Methode „Import“ auf). Nun muss ich genau dieses Verhalten einem Cronjob beibringen. Der Cronjob soll jede Nacht Daten importieren. Am einfachsten dachte ich wäre es daher die Methode „Import“ aufzurufen. Wie mache ich das oder hast Du vielleicht ne andere Idee wie ich das auf die Reihe kriege? Denis

Hi, eigentlich müsste dazu die “Import”-Methode in eine eigene Klasse ausgelagert werden. Die Controller sind ja keine Libraries/Models etc. sondern für die Application-Logic da. Ich würde aber im diesem Fall vorschlagen, dafür einen eigene CronJob anzulegen. Dazu sind folgende Schritte notwendig: 1. Eine neue Action im Controller anlegen: [quote]public function cronAction() { if($this->import()) { echo “Fehlgeschlagen”; } }[/quote] 2. Für diese Action die Autorisierung und den Renderer deaktvieren: [quote]public function preDispatch() { if(in_array($this->Request()->getActionName(), array(‘cron’))) { Shopware()->Plugins()->Backend()->Auth()->setNoAuth(); Shopware()->Plugins()->Controller()->ViewRenderer()->setNoRender(); } }[/quote] 3. Dafür ein Cron-Script erstellen und diesen im Linux-CronTab hinterlegen: cron.sh #!/bin/sh wget -O /tmp/shopware.cron -q 'http://shopware.de/backend/import\_c\_s\_v/cron' cat /tmp/shopware.cron rm -f /tmp/shopware.cron Das Auslagern in einem eignen Cron hätte übrigens auch den Vorteil, dass der Shopware-Cron dadurch nicht beeinträchtigt wird. Heiner

1 Like

Hallo Heiner, Danke das hat so geklappt! Hab mir noch einen simplen Sicherheitsmechanismus eingebaut, damit nicht jeder den Cron starten kann, ansonsten alles übernommen. Frohes neues und Vielen Dank Denis

ich kann eurer Unterhaltung leider nicht ganz folgen. Im Grunde habe ich vor das gleiche zu machen: Über einen CronJob oder Script den CSV-Import für Bilder, Artikel und Kategorien zu starten. Wie könnte ich so etwas realisieren?

Mein ShopwareCLI Framework kann Controller Out-of-the-box von der Kommandozeile starten: https://github.com/shredding/ShopwareCL … er-actions

1 Like

Hallo Christian, vielen dank für die schnelle Antwort, allerdings habe ich kein Zugriff auf die Konsole. Kennen Sie eine Möglichkeit wie ich aus dem Plugin Code (eigener Plugin) auf die Methoden der Controller Klasse Shopware_Controllers_Backend_ImportExport zugreifen kann? Diese Methoden möchte ich ansteuern: - public function importImages($filePath) - public function importCategories($filePath, $extension) - protected function importArticlesCsv($filePath) Haben Sie eine Idee wie ich das realisieren kann?

Jein, das Problem ist, dass du nicht Teil des HTTP lifecycles bist. Ich habe das im CLI Framework mit Traits gelöst, die die Standard HTTP Funktionen wrappen, so dass man sie auch ohne aufrufen kann. Da müsstest du dir den Source Code anschauen, das kann man da schon reinbauen, ist aber etwas mühselig.

1 Like