Plugins

Aus Contenido Wiki

Wechseln zu: Navigation, Suche


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


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

s. Backend-Übersetzung


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

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.

  1. plugin | myPlugin/plugins-pluginorder | Liste der gefundenen Plugins mit "," getrennt
  2. 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


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