OXID 6 steht in den Startlöchern. Während sich oberflächlich nicht viel ändert, wurde der Shop-Core deutlich entschlackt und modularisiert. Nicht zuletzt ist es nun möglich und erwünscht, sowohl den Shop als auch Erweiterungen / Module per Composer zu installieren.
Eine noch im Aufbau befindliche Dokumentations-Plattform beschreibt die Modulinstallation mittels Composer genauer. Das wollen wir uns im folgenden einmal näher ansehen.
Module portieren
OXID hat sich viel Mühe gemacht, damit Shop-Updates und Modulübernahmen trotz großem Refactoring, der Einführung von PHP Namespaces usw. nicht allzu schwer fallen, u.a. gibt es einen eigenen Layer, der alte Klassennamen auf die neuen Namespace-Klassen mappt. So sollten die meisten bestehenden Module lt. OXID ohne jegliche Anpassungen zumindest zum größten Teil lauffähig sein.
Nichtsdestotrotz sollte man sich natürlich dennoch die Mühe machen, Module korrekt zu portieren, d.h. Namespaces einzuführen, DB-Zugriffe anzupassen, die „metadata.php“ zu aktualisieren, eine „composer.json“ zu erstellen usw.
Neue Module erstellen
Wir wollen nun jedoch versuchen, ein komplett neues, über Composer installierbares Modul zu erstellen.
Nachdem der Shop ebenfalls über Composer installiert wurde (Document-Root im Webserver auf das erstellte „source“-Verzeichnis setzen!), müssen wir in der OXID „composer.json“ unser Modul-Repository einfügen und das Modul als Requirement ergänzen. Falls es noch kein GIT-Repository gibt, kann Composer auch aus ZIP-Dateien installieren. Das wollen wir nutzen und fügen der „composer.json“ von OXID selbst ein „ZIP-Repository“ hinzu:
„repositories“: [{
„type“: „package“,
„package“: {
„name“: „myvendor/mymodule“,
„type“: „oxideshop-module“,
„version“: „0.1.5“,
„dist“: {
„url“: „http://localhost/mymodule-0.1.5.zip“,
„type“: „zip“
}
},
„autoload“: {
„psr-4“: {
„MyVendor\\“: „“
}
}
}],
Wichtig ist hier, wenn man ein ZIP verwenden will, auch an dieser Stelle den Autoloader für eigene Namespaces zu konfigurieren, ansonsten können die Source-Dateien später nicht automatisch von OXID geladen werden.
Für ein „richtiges“ GIT-Repository sähe dies z.B. so aus:
„repositories“: {
„myvendor/mymodule“: {
„type“: „vcs“,
„url“: „git@www.github.com:myvendor/mymodule.git“
}
},
Statt die „composer.json“-Datei zu editieren, kann man zusätzliche Abhängigkeiten übrigens auch über die Konsole hinzufügen, z.B.
composer config repositories.smx/mymodule vcs github.com/shoptimax/mymodule
composer require smx/mymodule:dev-master
Spätestens beim nächsten „php composer.phar update“ sollte das zusätzliche Modul automatisch mit installiert werden.
Das Modul selbst
Im Modul-Repo selbst sollte man direkt die Modul-Dateien im Hauptverzeichnis ablegen, die Verzeichnisstruktur unter „modules“ wird beim Composer Install automatisch angelegt.
Ein gutes Referenz-Modul ist das Paypal-Modul von OXID selbst:
Zentral ist hier natürlich die „composer.json“ für das Modul selbst, hier muss man v.a. zwingend den „type“ auf „oxideshop-module“ setzen, damit der korrekte Composer Installer aktiviert wird, ausserdem muss auch hier der Autoloader konfiguriert sowie mit „target-directory“ unter „extras“ das Installationsverzeichnis (relativ zum „modules“-Verzeichnis im Shop) des Moduls angegeben werden:
{
„name“: „myvendor/mymodule“,
„description“: „This is a module for the OXID eShop.“,
„type“: „oxideshop-module“,
„keywords“: [„oxid“, „modules“, „eShop“],
„homepage“: „https://www.myvendor.de“,
„license“: [
„GPL-3.0“,
„proprietary“
],
„extra“: {
„oxideshop“: {
„blacklist-filter“: [
„documentation/**/*.*“
],
„target-directory“: „myvendor/mymodule“
}
},
„require“: {
„php“: „>=5.6“
},
„autoload“: {
„psr-4“: {
„MyVendor\\“: „../../../source/modules/myvendor/mymodule“
}
}
}
In den eigenen Modul-Klassen kann man nun ebenfalls Namespaces nutzen, z.B. hier ein neuer Frontend-Controller:
namespace MyVendor\MyModule\Controller;
use \OxidEsales\Eshop\Application\Controller\FrontendController as FrontendController;
/**
* A frontend controller…
*/
class MyDemoController extends FrontendController
{
…
Auch die Metadata hat einige Updates erfahren, Details hierzu finden sich in der Dokumentation, auch hier ist das OXID Paypal Modul wieder eine gute Referenz! Hier ein Beispiel für eine erweiterte Klasse und einen neuen, eigenen Controller:
‚extend’=>array(
\OxidEsales\Eshop\Application\Controller\ArticleDetailsController::class => MyVendor\MyModule\Controller\MyArticleDetailsController::class,
),
‚controllers’=>array(
‚mydemocontroller’=> MyVendor\MyModule\Controller\MyDemoController::class,
),