Zum Inhalt

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

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.