Plugins
Aus Contenido Wiki
Dies ist nur ein Anfang der Beschreibt was für das Erstellen eines Plugin nötig ist.
Inhaltsverzeichnis |
Was ist ein Plugin in Contenido?
Ein Plugin erweitert die Eingabemasken und somit die Funktionen von Contenido. Im Gegensatz zu Contenido Extension Chainer (CEC) werden mit Plugins ganz neue Bereiche erstellt. Diese Bereiche können im Hauptmenü (s. Extras -> Workflow), aber auch in bestehende Bereiche (s. Content -> Artikel -> Content Allocation ), eingebunden werden.
Wo finde ich ein Plugin?
Alle Plugins werden im Verzeichnis "root://contenido/plugins/" gespeichert.
Struktur und Aufbau
PHP-Header
In jeder Datei sollte ein bestimmter Header innerhalb von PHP integriert werden
DocBook-Header
/**
* Project:
* Projektname
*
* Description:
* Kurzbeschreibung
*
* Requirements:
* @con_php_req 5.0
*
*
* @package Contenido Backend includes
* @version 1.3.1
* @author Name Surname
* @copyright Company <www.company.de>
* @license http://www.contenido.org/license/LIZENZ.txt
* @link http://www.domain.de
* @since or Contenido-Version z.B: 4.8.3
*
* {@internal
* created 2000-00-00
* modified 2000-00-00, User_name, Coment
*
* $Id: file_name.php 000 2000-00-00 10:09:06Z User_name $:
* }}
*
*/
Sicherheitabfrage Ab der Contenido-Version 4.8.7 sollte am Anfang jeder PHP-Datei die Sicherheitabfrage eingebunden sein die ledigtlich guckt ob eine Constante gesetzt wurde.
if(!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
Verzeichnis & Dateien
contenido - plugins
- myPlugin
- ajax
- classes
- docs
- includes
- libs
- locale
- de_DE
- LC_MESSAGES
- myPlugin.mo (gettext-Datei)
- myPlugin.po
- LC_MESSAGES
- en_US
- LC_MESSAGES
- myPlugin.mo (gettext-Datei)
- myPlugin.po
- LC_MESSAGES
- de_DE
- plugins
- scripts
- templates (verwendette Templates)
- standard
- images
- styles
- standard
- xml
config.plugin.php
Die Datei config.php ist Konfigurationsdatei für Globale-/Basis-Konfigurationen. In der Konfigurationsdatei sollte man div. angaben machen. z.B.:
<?php $sName = "myPlugin"; # This is not the right place / for golbal inlcudes use DB:con_files / use 'plugin_include' for optional include in frame-files # plugin_include($sName, 'includes/functions.'.$myDir.'.php'); /* * Section 1: Fixed settings ---------------------------------- */ $cfg['path'][$sName]['images'] = $cfg['path']['contenido'].$cfg['path']['plugins'].$sName.'/images/'; $cfg['path'][$sName]['includes'] = $cfg['path']['contenido'].$cfg['path']['plugins'].$sName.'/includes/'; $cfg['path'][$sName]['plugin'] = $cfg['path']['contenido'].$cfg['path']['plugins'].$sName.'/plugin/'; $cfg['path'][$sName]['templates'] = $cfg['path']['contenido'].$cfg['path']['plugins'].$sName.'/templates/'; /* * Section 2: Template Files ------------------------------------ */ $cfg['templates'][$sName.'_left_top'] = $cfg['path'][$sName]['templates'].'template.left_top.html'; $cfg['templates'][$sName.'_menu'] = $cfg['path'][$sName]['templates'].'template.menu.html'; $cfg['templates'][$sName.'_subnav'] = $cfg['path'][$sName]['templates'].'template.subnav.html'; $cfg['templates'][$sName.'_overview'] = $cfg['path'][$sName]['templates'].'template.overview.html'; $cfg['templates'][$sName.'_edit_form'] = $cfg['path'][$sName]['templates'].'template.edit_form.html'; /* * Section 3: Table Settings ------------------------------------ */ $cfg['tab'][$sName.'_main'] = $cfg['sql']['sqlprefix'].'_'.$sName.'_main'; /* Section 4: Language Strings ---------------------------------- */ /* Section 5: Settings ------------------------------------------ */ /* Section 6: Chain Function ------------------------------------ */ /* * Section 7: Search-Plugin's ----------------------------------- */ scanPlugins( $sName ); // clean up unused variables unset( $sName ); ?>
myPlugin_nav_top.php
<?php
cInclude("classes", "widgets/class.widgets.page.php");
cInclude("classes", "class.ui.php");
$aItems = array();
$data_typs = array();
$data_typs[] = array('typ' => "bereich1", 'caption' => i18n("Haupt-Titel 1", "myPlugin") );
$data_typs[] = array('typ' => "bereich2", 'caption' => i18n("Haupt-Titel 2", "myPlugin") );
forech( $data_typs as $data_typ ) {
if ($perm->have_perm_area_action_anyitem("MyPlugin_".$data_typ['typ'])) {
$oLnkCRM = new cHTMLLink;
$oLnkCRM->setCLink("MyPlugin", 2, "MyPlugin_".$data_typ['typ']); // Area, Frame 2, Action
$aItems[] = array( $cfg['plugins']['myPlugin']['images'].$data_typ['typ'].".gif", $data_typ['caption'], $oLnkCRM->getHref());
}
}
$oPage = new cPageLeftTopMultiPane($aItems);
$oPage->render();
?>
myPlugin_nav.php
- EDIT -
myPlugin_nav_sub.php
- EDIT -
myPlugin_main.php
- EDIT -
Übersetzung in PHP-Files
Plugins
(Plug & Play)
Möchte man weiteren Entwicklern die Möglichkeit bieten mit Plug&Play-Plugins (s. FEU-Plugins) die Software zu Erweitern, muss man an verschiedenen Punkten ansetzen.
Verzeichnisstruktur:
- myPlugin/plugins/
- myPlugAndPlay1/
- myPlugAndPlay1.php - Konfigurations-File
- myPlugAndPlay1/
Der Name des Konfigurationsfile muss gleich mit dem Verzeichnisname sein.
scanPlugins():
In der config.plugin.php (Section 7) die Funktion scanPlugins() aktivieren. Übergeben wird das Verzeichnis ($entity) innerhalb des Ordner "contenido/plugins/".
Contenido scannt dann automatisch das Verzeichnis nach Plugins.
Bei dem Scannen werden zwei System-Settings erstellt.
- plugin | myPlugin/plugins-pluginorder | Liste der gefundenen Plugins mit "," getrennt
- plugin | myPlugin/plugins-lastscantime | Letzte Scann-Zeit
Der Wert "lastscantime" verhindert das ständige Scannen bei jedem Seitenaufruf. Es wird somit nur noch alle 60 Sekunden nach neuen Plugins gescannt.
Die Funktion erstellt auch automatisch Konfigurations-Variablen in $cfg. Struktur: $cfg['plugins'][ entity ][] = plugin-name;
Laden der Plugins in den PHP-Files:
Simpel mit folgendem Code:
$entity = 'myPlugin/plugins';
if ( is_array( $cfg['plugins'][ $entity ] ) )
{
foreach ( $cfg['plugins'][ $entity ] as $plugin)
{
plugin_include("myPlugin", "plugins/".$plugin."/".$plugin.".php");
}
}
Ausführen der Plugin-Funktionen:
$entity = 'myPlugin/plugins';
/* Check out if there are any plugins */
if (is_array( $cfg['plugins'][ $entity ] ))
{
foreach ( $cfg['plugins'][ $entity ] as $plugin)
{
if ( function_exists("myPlugin_".$plugin."_FunctionName") )
{
$result = call_user_func("myPlugin_".$plugin."_checkUserGroup", $Parameter_1, $Parameter_2);
} } }
Navigations-Übersetzung
Damit der Menüpunkt in anderen Sprachen auch richtig angezeigt wird, werden im Vereichnis 'xml' entsprechende Datein abgelegt. Default Sprache ist immer 'en_US' somit erstellen wir die Datei 'lang_en_US.xml' und 'lang_de_DE.xml' im Verzeichnis "myPlugin/locale/de_DE/LC_MESSAGES/" bzw. "myPlugin/locale/en_US/LC_MESSAGES/".
Inhalt der 'lang_de_DE.xml'-Datei in ISO-8859-1 kann wiefolgt aussehen:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Contenido XML language file -->
<language>
<navigation>
<extra>
<myPlugin>MyPlugin</myPlugin>
</extra>
</navigation>
</language>
Die Tags innerhalb vom '<language>'-Tag der XML-File, entsprechen dem Pfad der in der DB 'con_nav_sub' unter 'location' eingetragen wurde. Der String ist die Übersetung des Menüpunkts.
Datenbank-Tabellen
- con_area - Anlegen eines neuen Plugins
- con_area - Anlegen eines neuen Bereichs
- con_nav_sub - Einbinden in das Menü
- con_files - Registrierung der Dateien
- con_frame_file - Zuordnung Frame-zu-Datei
- con_actions - Aktionen die Ausgeführt werden können
- con_sequence
Info: Sollten eigene Tabellen benötigt werden sollte der Tabellenname nach folgenden Schema aufgebaut werden:
<Prefix>_pi<Plugin-Akronym>_<Name>
- Prefix = In der normalen Installation ist er "con"
- Plugin-Akronym = wf -> WorkFlow, ca -> Content Allocation
- Name = Tabellenname
con_plugins
Diese Tabelle wird noch nicht vollständig von allen Plugins verwendet.
con_area
Um eine neue Area zu erstellen muss diese in der 'con_area' registriert werden.
- idarea = die nächst höhere ID (z.B.: 123)
- parent_id = 0 (als Master-Area)
- name = MyPlugin (Name der Area)
- relevant = 1 (User-Rechte abfrage aktivieren)
- online = 1 (natürlich)
- menuless = 0 (1 = keine linke Frame-Spalte)
con_nav_sub
Plugin in der Navigation Platzieren Damit wir diese Erweiterung an passender Stelle in der Navigation auftaucht definieren wir das in der 'con_nav_sub'.
- idfridnavs = die nächst höhere ID
- idnavm = 3 (Master-ID aus 'con_nav_main')
- idarea = 123 (wie in der 'con_area' angegeben)
- level = 0
- location = 'myPlugin/xml/;navigation/extra/myPlugin' ( [pfad der Übersetzungs-Datei] ; [Ort des Nav.-Punkt] )
- online = 1
con_files
Damit Datein bei dem Aufruf eines Bereichs entsprechend geladen werden, müssen diese in der Datenbank registriert werden. Es werden bei der Erstellung des Bereichs noch mehr Daten hinzukomme, die alle nach dem gleichen Schema registriert werden müssen.
Das Includieren der Daten läuft folgender massen ab: Als erstes werden alle Dateien vom Typ 'inc' nach (Sortierung: Filename) einander includiert, dann folgen weitere Aktionen ausgeführt und als letztes die 'main'-Datei zur Darstellung der Daten.
idarea ist in diesem Beispiel "123" (wie in der 'con_area' angegeben)
filetype kann einen von zwei Werte haben. 'inc' = Include-File das vor der Haupt-Datei geladen wird. 'main' = Haupt-Datei kann nur einmal angegeben werden.
1. Config-File File: config.php
- idfile = die nächst höhere ID (z.B.: 300)
- filename = 'myPlugin/includes/config.php'
- filetype = 'inc' (weil diese Datei includiert werden soll)
2. Topnavigation File: myPlugin_nav_top.php
- idfile = die nächst höhere ID (z.B.: 301)
- filename = 'myPlugin/includes/myPlugin_nav_top.php'
- filetype = 'main' (weil es eine Hauptdatei ist)
3. Menu File: myPlugin_nav.php
- idfile = die nächst höhere ID (z.B.: 302)
- filename = 'myPlugin/includes/myPlugin_nav.php'
- filetype = 'main' (weil es eine Hauptdatei ist)
4. Subnavigation File: myPlugin_nav_sub.php
- idfile = die nächst höhere ID (z.B.: 303)
- filename = 'myPlugin/includes/myPlugin_nav_sub.php'
- filetype = 'main' (weil es eine Hauptdatei ist)
5. Edit File: myPlugin_main.php
- idfile = die nächst höhere ID (z.B.: 303)
- filename = 'myPlugin/includes/myPlugin_nav_sub.php'
- filetype = 'main' (weil es eine Hauptdatei ist)
con_frame_file
Dateien einem Framebereich zuweisen. Damit das System weiss in welchem Framebereich eine Datei geladen werden soll, werden die Datein in der 'con_frame_file' einem Frame zugewiesen.
In dieser Tabelle können wir jedem Frame (1-4) die gleiche Funktionsdatei (Typ: inc) zuordnen. Jedem Frame wird auch genau 1 Datei vom Typ 'main' zugewiesen. Wird in einem Frame eine Datei benötig, aber es existiert keine hier für, wird die Datei 'contenido/include/include.blank.php' verwendet.
Durch diese Zuweisung ist es möglich das Frameset automatisch mit dem Link 'contenido/frameset.php?area=MyPlugin&contenido=...' zu befüllen.
idframefile ist die nächst höhere ID.
idarea ist in diesem Beispiel "123" (wie in der con_area angegeben).
Topnavigation
- idframe = 1 (für left_top)
- idfile = 301 (wie in der con_files angegeben)
Menu
- idframe = 2 (für left_ bottom)
- idfile = 302 (wie in der con_files angegeben)
Subnavigation
- idframe = 3 (für right_top)
- idfile = 303 (wie in der con_files angegeben)
Config-File
-
- idframefile = die nächst höhere ID (z.B.: 14)
- idframe = 1 (für left_top)
-
- idframefile = die nächst höhere ID (z.B.: 15)
- idframe = 3 (für left_bottom)
-
- idframefile = die nächst höhere ID (z.B.: 16)
- idframe = 3 (für right_top)
-
- idframefile = die nächst höhere ID (z.B.: 17)
- idframe = 4 (für right_bottom)
con_actions
In con_actions sind mögliche Aktionen und optional auszuführende Anweisungen (Code) gespeichert. Diese werden auch für die Vergabe von Rechten in der Benutzerverwaltung benötigt und für die History der Benutzeraktionen (con_actionlog).
- idaction ist die nächst höhere ID.
- idarea ist in diesem Beispiel "123" (wie in der con_area angegeben).
- alt_name ???
- name Name der Aktion.
- code hier werden Codeschnipsel eingetragen, die beim Auftreten dieser Aktion abgearbeitet werden. Contenido nutzt sie intern sehr oft zum Aufrufen von Funktionen oder zum Zuweisen / Füllen von Variablen.
- location wird aktuell nicht benutzt und mir ist auch nicht bekannt wofür dieser Eintrag sein soll.
- relevant Boolean (0/1) der die Aktion z.B. für die Rechtevergabe der Benutzer relevant macht.
In den PHP-Dateien kann mit dem Objekt $perm geprüft werden ob der aktuelle User berechtigt ist diese action auszuführen. Beispiel: if( $perm->have_perm_area_action("Area-Name", "Action-Name") ) ...
con_sequence
Sequence anpassen: Da an diversen stellen die Tabellen ergänzt wurden, müssen wir die IDs in der Tabelle 'con_sequence' anpassen.
- con_area
- con_files
- con_frame_file
- con_nav_sub
Ein "Hello World" Plugin für Contenido
- EDIT -
Plugin-Installer
- EDIT -
Autoren
Oliver Lohkemper, team4media GmbH
Ortwin Pinke
weitere Autoren erwünscht

