Modul erstellen unter Oxid 6 für Dummies

Gerne, und fast.

In deinem Shop liegt bereits eine composer.json. In der Datei musst du eintragen wo dein Modul liegt.

Ich habe hier (zwar für Contao, aber egal, Composer ist überall das selbe) ein Beispielmodul geschrieben, welches lokal installiert wird: https://github.com/Sioweb/Contao4DummyBundle

In der Beispiel-Composerdatei steht, wie der Pfad angegeben werden muss: https://github.com/Sioweb/Contao4DummyBundle/blob/master/example_composer.json#L38

Hier kann grundsätzlich alles drin stehen, ein Link zu Github, einem eigenen Paketmanager (Satis) oder zu deinem lokalen Verzeichnis.

Danach muss du nur noch “composer req dein/modul” eingeben. Je nachdem ob Composer installiert ist oder ob du composer.phar verwendest :slight_smile:

Wow, super vielen Dank. Ich denke, das wird vielen weiterhelfen, die an dem Punkt stehen.
Noch eine Frage:
Ich habe das Demomodul (linslin) installieriert (composer require linslin/oxid6-example-module:dev-master --update-no-dev)t. Da wurde das Modul automatisch in die composer.json eingetragen. Das macht er also bei Modulen, die man lokal einspielt nicht?

Ho!

doch sollte er, nur den Pfad musst du extra einmalig eintragen.

Wenn man die composer.json editieren will, hat man zwei Möglichkeiten, entweder von Hand oder über den Befehl composer. Zum Beispiel “composer require” macht folgendes:

  1. trägt das Package in der composer.json ein
  2. führt automatisch “composer update” aus.

(Punkt zwei kann man mit dem Parameter “–no-update” unterbinden, dann wird das Package lediglich in der composer.json eingetragen, und erst beim nächsten “composer update” installiert.)

Damit das Package gefunden wird, muss composer das Repository kennen wo das Package liegt. Packages die in packagist.org liegen findet er automatisch, deshalb reicht “composer require”. Bei allen anderen Repositories muss das Repository extra eingetragen werden in der composer.json. Das geht auch wieder entweder manuell, oder über den Befehl “composer config repositories”.

Das hängt nicht direkt zusammen. Du kannst die Datenbankaufrufe portieren ohne Metadata 2 mit composer zu verwenden. Dann könnnen die Module per copy/paste installiert werden wie eh und je.

Falls du dennoch composer verwenden willst, gibt es eine Anleitung von OXID wie man ein Modul während der Entwicklung registrieren kann, indem man direkt den Pfad zum Modul in source/modules/ als Repo verwendet. Bei der Abfrage während “composer update” ob das Modul überschrieben werden soll, muss man dann “Nein” angeben, weil das Modul ja schon da liegt wo es hin soll, und sich nicht selber überschreiben kann. Der Namespace wird aber registriert, und das ist das wichtige: Best practice module setup for development with composer — OXID eShop developer documentation 6.1.0 documentation

Wenn die Entwicklung abgeschlossen ist und das Modul in einem Shop installiert werden soll, muss man sich dann für einen der Repository-Typen entscheiden, kann auch typ “path” sein, aber dann von einem anderen Ordner aus. Beim Typ “path” muss man in der composer.json des Moduls immer eine “version” angeben (bei github/packagist nicht, da geht das über tags/releases), und diese “version” auch ändern wenn man eine neue Version des Moduls hat, sonst wird die neue Version nicht installiert.

1 Like

Cool. Danke sehr. Da habe ich am WE einiges zu lernen.

Hallo,
ich habe es zwar mittlerweile geschafft mein Modul local über composer zu installieren, aber dennoch komme ich nicht weiter.

Ich möchte eine eigene Klasse über den Browser aufrufen.
localhost/meinprojekt/source/index.php?cl=meineklasse
Im alten Shop habe ich dazu oxubase erweitert.
In der metadata.php habe ich meineklasse unter controllers eingetragen:
‘controllers’ => array(
‘meineklasse’ => \MeinProjekt\MeinProjektModule\Controller\meineklasse::class,
),

In der meineklass.php steht das hier:

<?php namespace MeinProjekt\MeinProjektModule\Controller; class meineklasse { public function render(){ die('xx'); } } Rufe ich das hier auf: localhost/meinprojekt/source/index.php?cl=meineklasse bekomme ich ein Redirect auf die Startseite. Was mache ich nur falsch?

Hallo zusammen,

ich hab hier mal ein Tutorial geschrieben.
Das Modul selbst hab ich eben noch auf Github hochgeladen.
Vielleicht hilft es ja dem ein oder anderen.

Viel Erfolg!

1 Like

Hi protipps,
danke für Dein Modul. Könntest du mal kurz über mein Modul drüberschauen und
mir erklären was ich falsch mache?
Zum Download
Ich möchte das Modul über meinedomain.de/index.php?cl=mydemocontroller aufrufen. Aber ich
bekomme hier immer einen Redirect.

Beim überfliegen seh ich MetadataVersion 1.1?! Kann es daran liegen?

Ich vermute es liegt an deiner composer.json, der PSR-4 Namespace ist nicht korrekt, richtig wäre:

"MyVendor\\MyModule\\": "../../../source/modules/myvendor/mymodule"

PSR-4 muss immer eine Ordnerstruktur abbilden, wenn du nur MyVendor\\ schreibst, müsste in dem Ordner mymodule noch mal ein Unterordner namens mymodule stehen. Composer sucht deinen Controller bei deiner Config also unter:

../../../source/modules/myvendor/mymodule/MyModule/Controller/MyDemoController.php

Btw ich nehme an das du später MyVendor durch deinen Alias/Firmenname ersetzt und MyModule durch den korrekten Modulname. Je früher du das machst, umso weniger Probleme bekommst du.

Ich hab jetzt das Ganze mal auf Kleinschreibung umgebaut und die Ordnerstruktur angepasst. Aber auch das geht nicht. In meiner Log steht, dass er die Klasse nicht findet.
Könnte sich das mal bitte jemand downloaden und installieren? Ich komme da einfach nicht weiter :frowning:
Zum Download
Hab das über den Composer installiert.

Bei mir läuft das Modul. Bitte schreib alles wieder in korrekter Groß/Kleinschreibung um :slight_smile:

Hast du versucht, das Modul mal zu deaktivieren und wieder zu aktivieren?

Falls ja, lösche das Modul von Hand aus dem /modules Ordner, gehe ins Backend > Erweiterungen > Module. Oxid sollte dich nun Fragen ob das Modul entfernt werden soll, weil die Pfade nicht mehr gefunden werden können.

Dann kopiere das Modul wieder rein. Sollte es immer noch nicht funktionieren, öffne die metadata.php und ändere die Modul-ID - oder entferne alle Einträge aus der Tabelle oxconfig die mit dem Namen aModule beginnen.

LG
Sio

Kann ich bestätigen, Modul läuft.

Hi deddy,

ich würde dir noch empfehlen dein Browser Cache zu leeren. Das Modul scheint zu funktionieren.

Gruß
Ümit

Super - danke. Das wars :smiley:
Hab immer nur den tmp Ordner geleert

Schön, dass es geklappt hat. Viel Spaß :slight_smile:

Hallo, ich habe immer noch nicht herausgefunden, welchen Composer-Befehl ich wo eingeben muss, wenn das Modul im z.B. im Shopordner modules/meine_module/modul1 liegt. Es wird hier des öfteren gefragt, aber eine richtige Antwort finde ich darauf nicht oder bin ich zu doof?

Im Hauptverzeichnis deines Shop ( Dort wo source, vendor und composer.json liegen )

Befehl:
composer require meine_module/modul1

Danke sehr. Das habe ich gemacht: Ich habe obiges Modul runtergalden und wollte es installieren. Habe es also in den Ordner source/modules/ geladen und folgendes eingegeben:
composer require myvendor/mymodule
Dann gibt er mir aus: Could not find matching version of package myvendor/mymodule
Irgendwas mache ich noch falsch.