Cronjob Plugin mit dem Shopware 5.2 Plugin System

Hallo,

ich versuche mich gerade in die Shopware Plugin Erstellung einzuarbeiten und komme aktuell bei einem Fehler nicht weiter.

Grundsätzlich möchte ich ein Plugin erstellen, das einen Cronjob registriert. Dieser Cronjob soll dann bestimmte Funktionen des Plugins ausführen.

Wenn ich versuche folgendes Plugin ( myPluginTest.php in custom/plugins/myPluginTest/ ) zu aktivieren, erhalte ich den unten genannten Fehler.

subscribeEvent(
            'Shopware_CronJob_Test',
            'onRun'
        );
        
        $this->createCronJob("Test", "test", 86400);

        return true;
    }

    public function onRun(Enlight_Components_Cron_EventArgs $job)
    {
        $this->test();
    }

    public function test() {

        return true;
        
    }

}

Fehlermeldung:

PHP Strict Standards: Declaration of myPluginTest\myPluginTest::install() should be compatible with Shopware\Components\Plugin::install(Shopware\Components\Plugin\Context\InstallContext $context) in myPluginTest.php on line 5
PHP Fatal error: Call to undefined method myPluginTest\myPluginTest::subscribeEvent() in myPluginTest.php on line 9

Kann mir jemand an dieser Stelle weiterhelfen? Was fehlt der install Methode, und was muss ich mit subscribeEvent noch tun, damit ich keinen Fehler erhalte.
Ausserdem, würde es wenn die Fehler erledigt sind, so funktionieren das die methode onRun ausgeführt wird, immer dann wenn der Cronjob läuft?

Vielen Dank!

Hallo emjay,

bitte schau dir noch mal genau an, wie du Events im neuen Plugin-System einbaust: https://developers.shopware.com/developers-guide/plugin-system/#plugin-bootstrap-as-event-subscriber

Die Methode „subscribeEvent“ gibt es dort so nicht mehr. Auch die Helfermethode „createCronJob“ hast du so nicht mehr zur Verfügung. 

Für die Registrierung der CronJobs kannst du allerdings eine XML Datei nutzen: https://developers.shopware.com/developers-guide/plugin-system/#plugin-cronjob Dies funktioniert aber erst ab der Version 5.2.15

Viele Grüße aus Schöppingen

cool Michael Telgmann

Hallo Michael,

vielen Dank schonmal für deinen Input.

Wenn ich das richtig verstehe, muss ich das also wie folgt machen:

namespace myPluginTest;

class myPluginTest extends \Shopware\Components\Plugin {

    public function install(InstallContext $context)
    {

    }

    public static function getSubscribedEvents()
    {
        return [
            'Enlight_Controller_Front_RouteStartup' => 'onRun'
        ];
    }

    public function onRun(Enlight_Components_Cron_EventArgs $job)
    {
        $this->test();
    }

    public function test() {

        return true;
        
    }

}

Nun bin ich überfragt, welches Event ich an stelle von „Enlight_Controller_Front_RouteStartup“ verwenden sollte. Empfiehlt es sich hier evtl. „Enlight_Controller_Front_StartDispatch“ zu nehmen?

Im Ordner Ressources meines Plugins habe ich jetzt auch eine cronjob.xml angelegt. Muss ich die dann in der Install Methode irgendwie initialisieren? Oder wird die automatisch von Shopware übernommen?

Vielen Dank!

Martin

Die wird automatisch übernommen wenn du mindestens Shopware Version 5.2.15 hast.

Was mächtest du denn mit den Event Enlight_Controller_Front_RouteStartup tun?

Hallo Shyim,

also ganz einfach gesagt möchte ich ein Plugin, das einen Cronjob registriert, und dieser Cronjob startet dann eine Methode aus meinem Plugin. Jetzt zum start versuche ich einfach mal zum Test bspw. in der jeweiligen Methode eine E-Mail zu versenden. Einfach damit ich das Zusammenspiel von Plugin und Cronjob verstehe. Wenn das soweit funktioniert würde ich mal das erstellen eines Produktes über die API testen wollen, was ich ausserhalb von einem Plugin schon hinbekommen habe.

Das Plugin installiert jetzt ohne Fehler, nach den Tipps von Michael, ein Cronjob wird auch automatisch angelegt, durch die cronjob.xml die ich im Plugin abgelegt habe.

Was ich nun noch nicht verstehe, wie startet der Cronjob eine Methode in meiner Klasse?

Ich habe jetzt einfach mal folgende cronjob.xml erstellt:

        Test
        TestAction
        true
        86400
        true

Ich denke über das Element action in der XML Datei kann ich eine Verbindung zu meinem Plugin schaffen. Nur wie genau muss ich das hier definieren?

Das Plugin sieht gerade so aus. Wahrscheinlich muss ich für den Cronjob ein anderes Event verwenden!?

 'onRun'
        ];
    }

    public function onRun(\Enlight_Controller_EventArgs $args)
    {
        $this->test();
    }

    public function test()
    {

        $empfaenger = 'email@tld.de';
        $betreff = 'Der Betreff';
        $nachricht = 'Hallo';
        $header = 'From: email@tld.de' . "\r\n" .
                  'Reply-To: email@tld.de' . "\r\n" .
                  'X-Mailer: PHP/' . phpversion();

        mail($empfaenger, $betreff, $nachricht, $header);

        return true;
        
    }

}

Vielleicht brauche ich auch gar kein Event, sondern muss beim Cronjob nur richtig meine Klasse ansprechen!?

Danke schonmal im vorraus für eure Hilfe.

Hier ist ein kleines Beispiel, das mit den Cron erstellen kannst du hier weglassen, da du die cronjob.xml verwendest

 

Hallo,

muss die xml-Datei irgenwie eingelesen werden damit die Cronjobs angelegt werden? Wir haben einen Job in der xml definiert er wird aber nicht angelegt. Was muss den außer der xml sonst noch (welche Funktionen) für die Cronjobs im Plugin vorhanden sein?

xml

        CC CheckOrderState
        Shopware_CronJob_CheckOrderState
        true
        7200
        true

 

php event

public static function getSubscribedEvents()
{
    return [
        'Shopware_CronJob_CheckOrderState' => 'onRunClickCheckOrderState',
    ];
}

php funktion

public function onRunClickCheckOrderState(Shopware_Components_Cron_CronJob $job)
{
   //mach etwas
}

 

Bei mir will das mit der cronjob.xml nicht funktionieren. Ich kann in die XML eintragen was ich will es wird nie ein CronJob erstellt den ich unter Einstellungen->Grundeinstellungen->System->Cronjobs sehe. Wie bringt man den das Plugin dazu die XML einzulesen?