J4 installation script: Kann man use ... oder require_once in install, update oder postflight benutzen?

  • In meiner Komponente möchte ich im Installations-Skript Hilfsklassen laden die auch sonst benutzt werden.


    Im preflight sind noch keine Dateien übertragen.

    Bei Install, update, und postflight sind sie kopiert.


    Ich versuche in install oder update eine externe Klasse zu laden und zu benutzen.


    Require once findet die Datei aber die Klasse kann nicht mit new ... instanziert werden

    Use ... geht auch nicht mit new ...


    Gibt es da Einschränkungen oder muss ich meinen Code verbessern ?

    Oder gibt es Beispiele anderer Komponenten

  • Require once findet die Datei aber die Klasse kann nicht mit new ... instanziert werden

    Das siehst du woran?

    Gibt es da Einschränkungen oder muss ich meinen Code verbessern ?

    Weiß man nicht. Hängt von der Klasse ab, die du einbinden willst und den Methoden-"Arten" (static oder nicht etc.).


    Und deine script.php kennen wir ja auch nicht.


    Bin nicht ganz sicher, weil ich immer nach Schema F mache, aber probier mal mit

    Code
    JLoader::register('DerNameMeinerKlasse', 'AbsoluterPfadZurKlasse');

    Zumindest static Methoden sollten dann direkt per

    Code
    DerNameMeinerKlasse::dieMethode()
  • Danke für die Mühe.


    Sorry für die vermissten Daten.

    Ich programmiere seit 2014 für die Gallery RSGallery2 mit PHP Storm und passe sie gerade für J4 an (Jug Stuttgart Robert Mittl sagt die wird nie fertig ;) )

    Sorry für die fehlende Information:


    * Single step im ? installerAdapter.php ? brachte mich immer zur Zeile der Exception.

    * Wenn die Komponente installiert war, also beim Update funktionierte es wie gewünscht. DH. die Klassen konnten mit Use ... eingebunden werden.


    Ich probiere jetzt relative Pfade für require once am Anfang der Datei und teile das Ergebnis mit.

  • Weder register noch load half soweit


    install script Datei

    wenn die Componente schon installiert ist, dann kann mit der obersten auskommentierten use Anweisung die Klasse geöffnet und der Text angezeigt werden.


    In der Zeile mit $msg = InstallMessage kann die Klasse nicht efunden werden.

    "Error: Class 'InstallMessage' not found in ..."

  • Mir gelingt das mit dem JLoader::register nur dann, wenn ich die namespace-Zeile in der aufgerufenen Helper-Klasse entferne. Aber ja nicht Sinn der Sache, eigentlich.


    Den use-Kram habe ich mit entferntem namespace nicht getestet, nach 30 Installationen, weil ja eh sinnfrei. Auch nicht, den JLoader früher zu verwenden.


    Ich verbleibe leider mit einem "Keine Ahnung" ;)

  • Mit den Namespaces hab ich auch noch nicht gearbeitet, da können andere vielleicht besser weiterhelfen. Das sollte ja eigentlich ab V4 der way to go sein.

    Was mir in deinem Code aufgefallen ist: dirname(__FILE__) . '/administrator/components/com_rsgallery2/Helper/InstallMessage.php' sieht mir nach einem falschen Pfad aus. dirname(__FILE__) gibt dir den Ordner der Datei, und ich bezweifle, dass du das in die index.php von Joomla schreibst. Versuch es mal mit JPATH_ADMINISTRATOR . '/components...' o.Ä.

  • Danke für die Info.

    Der Dateiname ist relativ zum Installationspfad da es nur bei der Installation nicht funktioniert.

    Wenn ich das Selbe aus der installierten Komponente starte dann werden die Funktionen / Dateien über Namespace geladen und gestartet.


    Werde es im Postflight nochmal probieren, da sind die Dateien übertragen. Donnerstag nehme ich mir dafür Zeit.

  • Es hat funktioniert Danke Re:later


    Code
    $this->basePath = '/administrator/components/com_rsgallery2';
    $path = JPATH_SITE . $this->basePath . '/Helper/Rsg2InstallTasks.php';
    JLoader::register('Rsg2InstallTasks', $path);
    Rsg2InstallTasks::initConfigFromXmlFile ();
  • $this->basePath

    ist in der Art nicht unbedingt nötig. Ich hab das nur aus meinem InstallerScript rauskopiert, wo ich aus Faulheit öfters eine $basePath als private Klassenvariable drin habe, wenn ich den Pfad öfters brauche.


    Trotzdem würde ich gerne noch wissen, ob es einen Trick gibt, damit ich aus der verwendeten/aufgerufenen Klasse den später im Normalbetrieb nötigen namespace nicht rausnehmen muss ;) Weil sonst finde ich Namespaces dooooof ;)

  • Nach viel Schweiss und Versuchen fand ich eine hinreichende Einbindung.

    Trick: Import und dann Adressierung der Klasse über den kompletten in der Klasse angegebenen Namespace.


    GalleryTreeModel

    Code
    namespace Joomla\Component\RSGallery2\Administrator\Model;
    ...
    
    class GalleryTreeModel extends BaseModel
    {
    ...
        public function isRootItemExisting()


    Install script

    Code
    $GalleryTreeModelFileName = JPATH_ADMINISTRATOR . '/components/com_rsgallery2/Model/GalleryTreeModel.php';
    include ($GalleryTreeModelFileName);
    $galleryTreeModel =  new Joomla\Component\Rsgallery2\Administrator\Model\GalleryTreeModel ();
    
    // check for root item
    $isRootItemExisting = $galleryTreeModel->isRootItemExisting();

    In wieweit dort dann komplexe Aufrufstrukturen d.h. andere Namespaces benutzt werden können weiss ich nicht. Mein Bauchgefühl sagt wird wohl nicht funktionieren.