Ausführungsreihenfolge Plugins zu Laufzeit beeinflussen

  • Gibt es eine Möglichkeit, die Ausführungsreihenfolge von Plugins zur Laufzeit zu beeinflussen oder wenigstens zu ermitteln?


    Es ist mir bekannt, dass man im Backend die Reihenfolge durch Umsortiene ändern kann. Und durch Datenbankbefehle ein Sortieren "an erste Stelle", "an letzte Stelle" etc. ausführen kann.


    Scenario:
    Ich habe z.B. ein System-Plugin, das immer als erstes oder letztes ausgeführt werden soll bzw. "weitestgehend immer" ;) .
    Andere Plugins z.B. JCH-Optimize haben den selben Anspruch. Kommt es halt ggf. nach einiger Zeit zu "unsicheren" Reihenfolgen, weil man was zuinstalliert usw.


    Mein System-Plugin setzt deshalb bei jedem Seitenaufruf Datenbankabfragen ab, die die Reihenfolge in DB prüfen und ggf. korrigieren. Ist klar, dass das dann nur beim nächsten Seitenaufruf Wirkung zeigt.
    Das würde ich gerne etwas optimieren.
    Bspw. per PHP aus schon vorliegenden Joomla-Systemdaten, Application, erfahren, wie denn die aktuelle Reihenfolge ist und ob DB-technisch was zu tun ist oder sogar Möglichkeit Reihenfolge zur Laufzeit umzustellen, wenn ich früh genug dran bin, mit dem Versuch.


    Füe jede Erleuchtung, jeden Ansatz dankbar.

    • Hilfreich

    Ermitteln sollte gehen, die Reihenfolge müsstest du im JEventDispatcher raus bekommen, allerdings ne private property (Reflection ist dein Freund).


    Verändern ist m.E. eine ganz schlechte Idee und führt entweder in eine Sackgasse oder endet in einem Alptraum. Sackgasse weil die SystemPlugins als erstes geladen werden und du dann sowieso zu spät bist, solltest du es doch irgendwie schaffen die Reihenfolge zu verändern dann bringst du das System in einen instabilen weil unerwarteten Zustand. Du könntest einen Loop erzeugen und das System lahm legen, Plugins mehrfach ausführen und all so einen Spass. Momentan führst du auch noch ein bis zwei DB-Query aus, was ja durchaus Auswirkungen auf die Perfomance hat. Meine Empfehlung lass es und such nach einer anderen Lösung, sehr wahrscheinlich gehts Du das Problem falsch an.

  • Danke @rdeutz Dachte mir das schon mit zur Laufzeit.


    Zirka-Weg. Mal schaun, ob das wirklich effizienter.

    Code
    $dispatcher = JEventDispatcher::getInstance();$reflected = new ReflectionObject($dispatcher);$methods = $reflected->getProperty('_methods');$methods->setAccessible(true);$methods = $methods->getValue($dispatcher);


    (Keine Ahnung, ob es via Joomla API eleganter geht. Neuland.).


    Ergibt ein Array $methods der Methoden, als Array-Index, sämtlicher, bis hierhin gesammelter, "observierter" Klassen/Objekte


    Darunter bspw. auch $methods['onafterinitialise'], eine Methode, die auch im besagten Systemplugin PlgSystemExample und um die es mir im ersten Schritt vornehmlich geht.


    Die Arraywerte von $methods['onafterinitialise'] sind Array-Keys der Property _observers des JEventDispatcher, in der Reihenfolge der Ausführung.
    Die zugehörigen Werte dieser Keys (1, 4, 8 usw.) sind die bereits initialisierten/geladenen Plugin-Objekte/Plugin-Klassen (bspw. PlgSystemExample Object).


    Kann ich also so in der Art prüfen "ist Key 4 mein Plugin PlgSystemExample? Ist es OK, dass nach Key 1 (plgSystemAbc) und vor Key 8 (plgSystemDef)? Wenn nicht, Info an User bzw. automatisch neu sortieren, je nachdem wie der sich das gewünscht hat." (noch nicht fertig gedacht).


    Man könnte auch direkt über die Reihenfolge der Objekte PlgSystemXyz im Array _observers gehen, ohne Vorstufe Methoden auslesen.


    Wird sich zeigen, ob der ganze Luxus überhaupt die Arbeit wert ist oder die User einfach einen Datenbank-Neusortieren-Button bekommen ;) mit zusätzlicher Prüfung gelegentlich im Backend und bei Events onExtensionAfterInstall, onExtensionAfterUpdate, onExtensionXyz...