Frage zu "Eigenen Cronjob als Plugin"?

Hallo, ich möchte gernen einen eigenen Cron im System hinterlegen. Dazu habe ich mir zunächst das Cron-Plugin im Plugin-Manager aktiviert. Anlehnend an den folgenden Link Example 7: Eigener Cronjob als Plugin würde ich nun gerne ein Cron aus einem eigenen Plugin im Backend hinzufügen. Erste Frage: Geht das überhaupt? Wie kriege ich die “Verknüpfung” aus dem neuen Cron einem eigenen Plugin hin? Geht das rein über die “Aktion” die ich beim Cron eintrage? Oder sind hierfür noch weitere Schritte erforderlich? Zweite Frage: Im Code des Beispiels wird unter anderem subscribeCron() verwendet. Diese Methode wird bei mir in der IDE als deprecated gekennzeichnet. Was soll denn stattdessen verwendet werden? Vielen Dank für Tipps und Hilfe! Viele Grüße Timo

In Install-Funktion: $this-\>createCronJob( 'MeinImport', 'MeinImportCron', 3600, true ); $this-\>subscribeEvent( 'Shopware\_CronJob\_MeinImportCron', 'onRunMeinImportCronJob' ); und dann die passende Funktion, die die gewünschten Aktionen durchführt: public function onRunMeinImportCronJob(Shopware\_Components\_Cron\_CronJob $job) { $log .= "Import gestartet: " . date("Y-m-d H:i:s"); return $log; }

Hallo Andre, vielen Dank für Deine Antwort! Und wie wähle ich diesen Cron dann im Admin-Backend aus? Unter “Grundeinstellungen --> Cronjobs” habe ich ja die Möglichkeit Crons hinzufügen. Ich hätte es jetzt so verstanden, dass ich meinen Cron dort einfügen muss. Ist das richtig? Wenn ja: Wie, also mit welcher Aktion? Viele Grüße Timo

1 „Gefällt mir“

Der wird dort automatisch eingefügt. Ist dein Plugin schon installiert und du ergänzt den Cronjob musst du dein Plugin deinstallieren und neu installieren, dann taucht der Cronjob da automatisch mit auf. Noch ein Hinweis: Jeder (PHP-)Fehler im Skript deaktiviert den Cronjob und du musst den unter Cronjobs wieder aktivieren.

Hallo Andre, vielen Dank für Deine Antwort - das mit dem Cron hat gut geklappt! Eine kurze Rückfrage hätte ich noch: Wie kann in in dem Cron nun auf die Daten aus der Datenbank zugreifen? Ich hatte folgendes getestet: $api = Shopware()-\>Api()-\>Import(); $article = $api-\>sArticle()-\>sGetArticleById('SW10001'); Dies liefert einen Fatal Error. Mir ist nicht ganz klar wie ich 1.) überhaupt auf die Models und Daten zugreife, z.B. um alle aktiven Artikel zu ermitteln und 2.) ob die in zahlreichen Dokus enthaltenen s-Klassen (wie z.B. sArticle) noch verwendet werden sollten oder ob diese deprecated sind. Vielen Dank für einen kurzen Tipp hierzu! Viele Grüße Timo

Über das Artikel Repository: $repository = Shopware()-\>Models()-\>getRepository('Shopware\Models\Article\Article'); $articles = $repository-\>findAll(); oder direkt via SQL. Das ist zwar weniger elegant als über Doctrine, aber wegen der verschachtelten Struktur der Artikel in der Datenbank oft der bessere Weg: $sql = "SELECT DISTINCT details.id as id, articles.id as articleId, articles.name as name, articles.configurator\_set\_id, suppliers.name as supplier, articles.active as active, details.id as detailId, details.additionaltext as additionalText, details.instock as inStock, details.ordernumber as number, ROUND(prices.price\*(100+tax.tax)/100,2) as `price`, tax.tax as tax FROM s\_articles as articles INNER JOIN s\_articles\_details as details ON articles.main\_detail\_id = details.id LEFT JOIN s\_articles\_supplier as suppliers ON articles.supplierID = suppliers.id LEFT JOIN s\_articles\_prices prices ON prices.articledetailsID = details.id AND prices.`to` = 'beliebig' AND prices.pricegroup = 'EK' LEFT JOIN s\_core\_tax AS tax ON tax.id = articles.taxID ORDER BY articles.name"; Shopware()-\>Db()-\>fetchAll($sql);

Hallo Christian, vielen Dank für Deine Antwort. Mein Ansatz ist es gerade über das Repository zu gehen. So funktioniert wenn ich es richtig verstehe z.B. folgendes um die Bestellungen mit einem bestimmten Status abzufragen: $orders = $repository-\>findBy(array('status' =\> 1)); Nun noch eine ganz arge Einsteigerfrage: Wie kann ich bei einer Bestellung nun einen Wert ändern, also z.B. den Bestellstatus von 1 auf 2 ändern oder einen Kommentar einfügen? Vielen Dank für einen Tipp hierzu! Viele Grüße Timo

Über das Objekt selber habe ich es jetzt noch nicht hingekriegt (was ich schöner fänd…). Aber mit Shopware()->Modules()->Order()->setOrderStatus($order->getId(), 1); hat es funktioniert.