Eigenes Shopware 6 Plugin erstellen
In diesem Blogbeitrag lernen Sie die Basisstruktur von Shopware 6 Plugins und ein einfaches Beispiel kennen. Wir zeigen Ihnen, wie Sie ein Modell und einen Controller anlegen, um eigene Daten zu speichern und auszugeben.
Sie benötigen Unterstützung für Ihr Shopware Plugin?
Kontaktieren Sie uns!
Eigenes Shopware 6 Plugin erstellen
Shopware 6 bietet durch die Möglichkeit eigene Plugins zu programmieren, fast grenzenlose Erweiterungsmöglichkeiten. Durch Plugins können gewünschte Funktionen update sicher implementiert werden, oder das Erscheinungsbild des Shops verändert werden. In diesem Artikel zeigen wir Ihnen die Grundstruktur eines Plugins und erklären, anhand kleiner Codebeispiele, wie Sie Dateien, wie Modells und Controller erstellen, um Daten in der Datenbank zu speichern und diese auch im Frontend anzeigen zu lassen.
Grundstruktur
Zu Beginn müssen Sie die minimale Ordnerstruktur des Plugins erstellen. Plugins werden in Shopware 6 im Verzeichnis /custom/plugins abgelegt. Hier erstellen Sie nun einen Ordner der den Namen Ihres Plugins erhält. In unserem Beispiel werden wir den Namen CobExamplePlugin verwenden. Es ist immer sinnvoll Ihr Vendortag vorne an den Namen Ihres Plugins zu hängen, um Kollisionen mit anderen Plugins, die den gleichen Namen tragen, zu vermeiden.
Eigenes Shopware 6 Plugin erstellen
Shopware 6 bietet durch die Möglichkeit eigene Plugins zu programmieren, fast grenzenlose Erweiterungsmöglichkeiten. Durch Plugins können gewünschte Funktionen update sicher implementiert werden, oder das Erscheinungsbild des Shops verändert werden. In diesem Artikel zeigen wir Ihnen die Grundstruktur eines Plugins und erklären, anhand kleiner Codebeispiele, wie Sie Dateien, wie Modells und Controller erstellen, um Daten in der Datenbank zu speichern und diese auch im Frontend anzeigen zu lassen.
Grundstruktur
Zu Beginn müssen Sie die minimale Ordnerstruktur des Plugins erstellen. Plugins werden in Shopware 6 im Verzeichnis /custom/plugins abgelegt. Hier erstellen Sie nun einen Ordner der den Namen Ihres Plugins erhält. In unserem Beispiel werden wir den Namen CobExamplePlugin verwenden. Es ist immer sinnvoll Ihr Vendortag vorne an den Namen Ihres Plugins zu hängen, um Kollisionen mit anderen Plugins, die den gleichen Namen tragen, zu vermeiden.
name
Der Name sollte den Richtlinien von Composer entsprechen und aus dem Vendorpräfix und dem Namen des Plugins bestehen, die mit einem “/” gretrennt sind
description
Hier beschreiben Sie die Funktion Ihres Plugins in einem kurzen Text. Dieser wird auch als ofizielle Beschreibung des Plugins verwendet.
license
Sie können für Ihr Plugin jede Lizenz wählen, die Sie wollen. Sie sollten es aber nicht unter der MIT Lizenz veröffentlichen, weil das Andere dazu berechtigen würde, Ihr Plugin unter deren Namen weiterzuverkaufen.
author
Hier können Sie Informationen zum Autor des Plugins hinterlegen. Wie zum Beispiel Name, Rolle, Webseite, E-Mail.
type
Als Typ müssen Sie shopware-platform-plugin angeben, sonst wird das Plugin nicht als solches erkannt.
autoload
Bei diesem Wert können Sie sich an der offiziellen Dokumentation von composer orientieren. Hier definieren Sie das Pluginverzeichnis und den Namespace. Sie können Ihr Plugin Strukturieren wie Sie wollen, es macht aber Sinn sich an die gängige Struktur von composer zu halten.
extra
extra kann jeden Wert enthalten. Shopware nutzt es um Basis Klasse, das Copyright und das Label in verschiedenen Sprachen abzurufen. Der gesamte Namespace Ihrer Basisklasse ist wichtig, weil Sie durch autoload die Struktur des Plugins selbst festlegen können und Shopware somit wissen muss, wo es nach Ihrer Klasse suchen soll.
Plugin Klasse
Jedes Plugin in Shopware 6 benötigt eine PHP Basisklasse. Diese Klasse trägt den gleichen Namen wie Ihr Plugin. In unserem Beispiel also CobExamplePlugin. Hier bestimmen Sie was während des Lebenszyklus Ihres Plugins passieren soll.
Dieser besteht aus folgenden Teilen.
install: wird aufgerufen, wenn das Plugin installiert wird
postInstall: wird aufgerufen, nachdem das Plugin installiert wurde
update: wird aufgerufen, wenn das Plugin updatet
postUpdate: wird aufgerufen, nachdem das Plugin upgedatet wurde
activate: wird aufgerufen, wenn das Plugin aktiviert wird
deactivate: wird aufgerufen, wenn das Plugin deaktiviert wurde
uninstall: wird aufgerufen, wenn das Plugin deinstalliert wird
Die einfachste Pluginklasse sieht zum Beispiel so aus:
Datenbank erstellen / Migrationen
Um Daten für Ihr Plugin zu speichern, müssen Sie die Datenbank von Shopware erweitern. Shopware 6 bietet dafür eine einfache Methode Migrations zu schreiben, die bei der Installation Ihres Plugins ausgeführt werden. Dafür müssen Sie die Migration nur im richtigen Verzeichnis /src/Migration ablegen.
Die Änderungen an der Datenbank machen Sie in der update Methode. Nur für destruktive Änderungen müssen Sie die updateDestructive Methode verwenden.
Wichtig bei der Erstellung der Migrations ist, dass die Methode getCreationTimestamp den gleichen Timestamp zurückgibt, der auch im Klassennamen vorkommt. Außerdem müssen Sie die Felder created_at und updated_at anlegen, da das DAL (Data Abstraction Layer) diese Werte später automatisch befüllen wird.
Entity erstellen
Nachdem Sie nun die Datenbankstruktur für unser Plugin erstellt haben, müssen Sie dem DAL noch mitteilen das diese existiert. Dafür definieren Sie Ihre eigene EntityDefinition. Diese definiert, wie der Name schon sagt, die Felder Ihrer Entity und mappt diese auf die Felder in der Datenbank. Die Datei erstellen Sie im Verzeichnise /src/Entitiy.
Die EntityDefinition muss die Methoden getEntityName und defineFields enthalten. Erstere gibt lediglich einen String zurück, der dem Namen Ihrer Tabelle gleichen muss.
In defineFields sind alle Felder enthalten, die Sie in der Datenbanktabelle erstellt haben. Im Gegensatz zu voher müssen Sie hier created_at und updated_at nicht mehr definieren. Die Feldklassen benötigen zwei Parameter. Den storageName, der wieder identisch mit dem Namen der Tabellenspalte in der Datenbank ist, und den propertyName der identisch mit dem Namen des Feldes in der Entity sein muss, die Sie noch erstellen.
Nachdem nun die Entity definiert ist, brauchen Sie noch die Entity selbst. Unter /src/Entity erstellen Sie eine Datei MyEntity.php. In dieser Datei legen Sie nun alle Felder an, die deine Entity benötigt. Die ID wird dabei durch den EntetityIdTrait umgesetzt. Zu den Feldern müssen Sie natürlich noch Getter und Setter Methoden definieren. Aus Platzgründen haben wir in unserem Beispiel nur wenige Felder angelegt. Je nach Umfang Ihres Plugins, kann eine Entity natürlich auch bedeutend größer sein.
services.xml
Um die Entity für Shopware nutzbar zu machen, müssen Sie die EntityDefinition nun im Dependency Injection Container registrieren. Hierfür nutzen Shopware Plugins wie in Shopware 5 die services.xml. Anders als noch in Shopware 5 liegt diese nun aber im Verzeichnis /Resources/config/. Dem geben Sie noch den shopware.entity.definiton mit und nennen das Attribut entity genau so wie den EntityName in Ihrer EntityDefiniton.
Controller erstellen
Im nächsten Schritt erstellen Sie Ihren eigenen Controller um Ihnen die Daten auch im Frontend ausgeben lassen zu können. Im Verzeichnis /src/Controller erstellen Sie eine Datei ExampleController.php. Die PHP-Klasse muss vom Shopware\Storefront\Controller\StorefrontController erben. Die Route des Controllers wird über Annotations (@Route(‘/exmapleRoute’) festgelegt. Diese Route müssen Sie aber auch wieder für Shopware “sichtbar” machen. Hierfür legen Sie unter /Resources/config eine routes.xml Datei an und definieren hier in welchem Verzeichnis Shopware nach Annotationen suchen soll. Nun ist Ihr Controller unter deinShop.de/exampleRoute aufrufbar.
Jetzt geht es daran die in der Datenbank gespeicherten Daten im Frontend sichtbar zu machen. Da Sie Ihre EntityDefinition im Dependency Injection Container registriert haben, hat das DAL automatisch ein Repository erstellt. In der index Methode beutzen wir nun dieses Repository um die von uns gespeicherten Daten aus der Datenbank abzurufen und diese ans Frontend weiterzugeben.
Template
Um auch eine Anzeige zu erhalten, erstellen Sie noch eine simple index.html.twig. Unser Beispiel ist sehr simpel gehalten, im Normalfall wollen Sie hier natürlich mehr Styling und Struktur umsetzen. Um zu verdeutlichen, wie die Daten im Frontend ausgegeben werden, reicht dieses Beispiel aber.
Fazit
Shopware 6 ist durch die neue Pluginstruktur und Softwarearchitektur noch besser zu erweitern als Shopware 5. Ihnen sind als Pluginentwickler fast keine Grenzen gesetzt. Dieses Beispiel ist nur ein Einstieg in die generelle Struktur und Funktionsweise eines Plugins, es gibt noch viel mehr Möglichkeiten Shopware 6 nach seinen eigenen Bedürfnissen und Wünschen zu erweitern. In zukünftigen Beiträgen werden wir andere Vorgehensweisen wie zum Beispiel das Eventsystem von Shopware 6 beleuchten. Sie können also gespannt bleiben und sich hier weiter über Shopware 6 informieren.
Wenn Sie Unterstützung bei der Umsetzung Ihres eigenen Onlineshops wollen, können Sie sich gerne bei uns melden.