Benutzerdefinierte Plugins¶
Um die Anpassungen im custom-Ordner übersichtlich zu halten oder wiederverwendbaren Code auszulagen, können benutzerdefinierte Plugins entwickelt und eingesetzt werden. Der Aufbau und die Prinzipien ähneln dabei denen aus dem custom-Ordner.
Grundlegende Einrichtung¶
Ordnerstruktur und Benamung¶
Ein eigenes Plugin sollte in einem sprechenden Ordner abgelegt werden, für den folgendes Schema empfohlen wird: Vendorname_Pluginname - die eigentliche Klasse sollte den Namen Pluginname mit dem Zusatz Plugin haben. Die Ordnerstruktur orientiert sich dabei an der aus dem custom-Ordner.
- plugins
- Areanet_Test
- Annotations
- Controller
- Entity
- Frontend
- Traits
- Types
- TestPlugin.php
- Areanet_Test
Aufbau Plugin-Klasse¶
Die Plugin-Klasse muss von Areanet\PIM\Classes\Plugin abgeleitet werden und zwingend die init-Methode implementiert haben.
plugins/Areanet_Test/TestPlugin.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php namespace Plugins\Areanet_Test; use Areanet\PIM\Classes\Plugin; class Testlugin extends Plugin { public function init(){ $this-app[...]->... //Zugriff auf die Contentfly-Application analog wie zu custom/app.php } } |
Anpassung Frontend¶
Im Plugin können eigene UI-Komponenten verwendet und über den Plugin-Manager automatisch im Webroot als Symlink freigegeben werden. Dafür muss lediglich in der Plugin-Klasse die Frontend-Unterstützung aktiviert werden:
1 2 3 4 5 6 | <?php public function init(){ ... $this->useFrontend() ... } |
Info
Damit wird automatisch der Ordner Frontend im Plugin über einen Symlink auf appcms/public/plugins/PLUGINNAME veröffentlicht.
Assets¶
Pluginspezifische Assets können wie folgt in das Contentfly UI eingebunden werden - die Assets müssen unterhalb des Frontend-Ordners liegen:
1 2 3 4 5 6 7 | <?php public function init(){ ... $this->addJSFile('/scripts/leaflet.js'); $this->addCSSFile('/styles/plugin.css'); ... } |
Angular-Module¶
Analog dazu können auch pluginspezifische Angular-Module eingebunden werden:
1 2 3 4 5 6 | <?php public function init(){ ... $this->addAngularModule('froala', '/scripts/angular-froala.js'); ... } |
Blöcke¶
Das Angular JS UI des Contentfly CMS kann analog zu Anpassung Frontend/Anpassung UI angepasst werden. Entsprechende UI-Blöcke können wir folgt gesetzt werden:
1 2 3 4 5 6 | <?php public function init(){ ... $this->addBlock('BLOCK_NAME', '/blocks/list-buttin.html'); ... } |
UI-Routen¶
Pluginspezifische UI-Routen können über die Funktion addRoute(ROUTE_NAME, TEMPLATE_PATH, CONTROLLER_NAME, IS_SECURE = true) analog zu Anpassung Frontend/Anpassung UI definirt werden:
- ROUTE_NAME: Name der Route
- TEMPLATE_PATH, relativ zum Frontend-Ordner des Plugins
- CONTROLLER_NAME, Name des Controllers
1 2 3 4 5 6 7 | <?php public function init(){ ... $this->addRoute('test', '/views/test.html', 'TestCtrl'); $this->addJSFile('/scripts/test.controller.js'); ... } |
Benutzerdefinierte API-Aufrufe und Routen¶
Im Plugin können wie gewohnt eigene (API-)Routen definiert werden, analog zu Anpassung Backend/Benutzerdefinierte API-Aufrufe
1 2 3 4 5 6 7 | <?php public function init(){ ... $this->app['routeManager']->mount('pluginroute', 'Plugins\Vendorname_Pluginname\Controller\FooController') ->post('bar', true); ... } |
Events und Hooks¶
Eigene Events und Hooks können analog zu Anpassung Backend/Events und Hooks implementiert werden.
Entitäten¶
Pluginspezifische Entitäten müssen im Ordner Vendorname_Pluginname/Entity abgelegt werden. Damit das Contentfly CMS diese Entitäten nutzen kann, muss die ORM-Funktionalität für das Plugin freigeschaltet werden:
1 2 3 4 5 6 | <?php public function init(){ ... $this->useORM(); ... } |
Feldtypen¶
Pluginspezifische Feldtypen sollten im Ordner Vendorname_Pluginname/Types abgelegt werden und folgen den Richtlinien aus Konfiguration/Benutzerdefinierte Feldtypen mit folgendet Änderungen:
- Die Feldtyp-Klasse muss von Areanet\PIM\Classes\Type\PluginType anstatt Areanet\PIM\Classes\Type\CustomType abgeleitet werden.
Die Registrierung erfolgt im Plugin analog über
1 2 3 4 5 6 | <?php public function init(){ ... $this->registerPluginType(new CustomPluginType($this->app, OPTIONS)); ... } |
Composer verwenden¶
Sie können in Ihrem Plugin eigene Composer-Pakete verwenden. Installieren Sie diese wie gewohnt im Plugin-Ordner über
1 | composer install package-Name |
Der Plugin-Manager des Contentfly CMS bindet die entsprechenden Autoload-Skripte automatisch ein.
Warning
Beachten Sie bitte, dass es zu Problemen kommen kann, wenn die Composer-Bibliothek des Plugins gleiche Pakete verwendet, wie das Contentfly CMS.