====== Plugins ====== Plugins sind Programmteile, die sich nahtlos in Sefrengo einfügen und das CMS um weitere Funktionen ergänzen, die evtl. nicht in jedem Projekt gebraucht werden. Plugins können verschiedenste Funktionen erfüllen und dazu z.B. auf Ereignisse, die im CMS stattfinden, reagieren. ===== Plugintyp ===== Zuerst muss entschieden werden, ob das Plugin als Teil einer Sefrengo-Backend-Seite (z.B. Backend-Log) oder quasi "selbstständig" in einem Frame angezeigt (z.B. Newssystem oder phpMyAdmin) werden soll. Als nächstes musst festgelegt werden, ob das Plugin Multi-Client-Fähig sein soll, d.h. von jedem Projekt als neues Plugin behandelt. Bei nicht Multi-Client-Plugins wird nur eine Instanz des Plugins für jedes Projekt verwendet. ===== Grundlagen ===== * Neuen Ordner unter backend/plugins anlegen. Der Name des Ordners ist gleichzeitig der Pluginname. Er sollte nur aus Kleinbuchstaben bestehen (keine Sonderzeichen!). * Entpacken der Dateien aus der Datei pluginvorlage.tar im Ordner backend/tpl in den neuen Ordner (z.B. mit einem Entpackprogramm wie [[http://www.winrar.de/|WinRAR]] oder [[http://www.7-zip.org/de/|7Zip]]) * Dateiname von Pluginvorlage.php in pluginname_meta.php umbenennen. * In der Datei pluginname_meta.php alle Vorkommnisse von {pluginname} durch pluginname ersetzen. * Wenn das Plugin im Multi-Client-Modus betrieben wird die Einstellung //var $multi_client = false;// auf true setzen. * Die SQL-Dateien im Unterordner meta anpassen. (s. nächster Abschnitt) * Die Startdatei (das ist die Datei die beim Klick auf den Menüpunk angezeigt wird) als index.php anlegen und testweise z.B. mit //// befüllen Wenn alles angelegt und angepasst ist, kann das Plugin in Sefrengo eingefügt werden. Dazu unter System -> Plugins oben links auf den Link "Neues Plugin" und anschließend an gleicher Stelle auf "Verzeichnis Importieren" klicken. In dem sich öffnenden Formular den späteren Namen des Plugins, dessen Versionsangabe, Beschreibung sowie Kategorie eingeben, den vorher angelegten Ordner in der Drop-Down-Liste auswählen und als Startdatei "index.php" eingeben. Nach einem Klick auf Speichern ist das Plugin in Sefrengo verfügbar. Es kann nun testweise installiert werden oder, zum veröffentlichen, mit einem Klick auf "Download" als .cmsplug-Datei heruntergeladen werden. Vor dem veröffentlichen des Plugins im Forum die [[http://forum.sefrengo.org/index.php?showtopic=13|Anleitung zur Modulveröffentlichung]] lesen -- diese gilt auch für Plugins! Generell ist das Erstellen eines einfachen Plugins nicht schwer. Erweiterte Einstellungen wie Event-Verarbeitung, Backend-Mehrsprachigkeit, Konfigurationsereignisse oder Autostarts sind schwieriger zu erstellen und zum fehlerfreien Laufen zu bringen. Am einfachsten arbeitet man sich in diese nicht ganz leichte Materie ein, in dem man sich Beispiele anschaut. Schöne Beispiele, die eigentlich alle hier beschriebenen Optionen abdecken, sind die Plugins SFlog (Single-Client ohne Frame, Rechte, Events) und Smartypants (keine Backendseite, Konfigurationseinstellungen, Autostarts). Backend-Mehrsprachigkeit ist in beiden Plugins vollständig implementiert. Diese Plugins können und sollen als Musterbeispiele für weitere Plugins benutzt werden. Im Zweifelsfall einfach im Entwicklerforum nachfragen und einen Profi drübergucken lassen. ===== Meta-Dateien ===== Die Meta-Dateien sind Scripte, die beim Installieren, Updaten und Deinstallieren des Plugins ausgeführt werden. Sie enthalten vorallem SQL-Queries, allerdings kann auch PHP-Code, in eingeschlossen, in den Dateien abgelegt werden. Dafür ist im meta-Ordner jeweils eine .meta-Datei (install.meta, uninstall.meta, update.meta). In diesem Abschnitt werden die wichtigsten Einträge in der install.meta und uninstall.meta erklärt, die für eine korrekte Installation des Plugins in Sefrengo nötig sind. Vor der Ausführung des Queries werden folgende Valiablen ersetzt: * {now}: aktueller Timestamp * {client_id}: ID des aktuellen Projektes * {table_prefix}: Tabellen-Präfix, z.B. cms_ * {client_prefix}: Zusammengesetztes Präfix aus {table_prefix}, 'client_' und {client_id}, z.B. cms_client_1_ * {mod_prefix}: Zusammengesetztes Präfix aus {table_prefix} und 'mod_', z.B. cms_mod_ * {mod_client_prefix}: Zusammengesetztes Präfix aus {table_prefix}, 'mod_' und {client_id}, z.B. cms_mod_1_ * {plug_prefix}: Zusammengesetztes Präfix aus {table_prefix} und 'plug_', z.B. cms_plug_ * {plug_client_prefix}: Zusammengesetztes Präfix aus {table_prefix}, 'plug_' und {client_id}, z.B. cms_plug_1_ ==== Menüeintrag ==== * **Pluginname**: Sollte immer kleingeschrieben werden und ohne Sonderzeichen sein. Er dient als Erkennungsmerkmal für Sefrengo und muss Eindeutig sein (wie eine ID). * **Projekt-ID**: Entscheidet über Multi- oder Single-Client-Fähigkeit. {client_id} wird beim installieren durch die Projekt-ID des Projektes ersetzt in dem das Plugin installiert wird. Steht dort eine 0 wird das Plugin in alle Projekte eingebunden. * **Menü-Ebene**: Mit dieser Zahl wird bestimmt, wo der Menüpunkt zum Plugin erscheinen soll. * 1 = Unterpunkt für Redaktion * 2 = Unterpunkt für Design * 3 = Unterpunkt für Administration * 4 = Unterpunkt für Plugins * **Sortierung**: Je größer die Zahl, desto weiter hinten erscheint der Eintrag im Menü. Die Zahl wird normalerweise in Zehnerschritten hochgezählt. Wie das Query für den Menüeintrag im Backend aussehen muss ist von den unter [[#Grundlagen|Grundlagen]] getroffenen Entscheidungen abhängig. === Multi-Client mit Frame === INSERT INTO {table_prefix}backendmenu VALUES ('', 1 , # Menüebene {client_id}, # Projektid 10, #sortierung 'nav_pluginname', 'plugins/pluginname/index.php', 'frame', '$perm->have_perm("area_plug_pluginname")'); === Multi-Client ohne Frame === INSERT INTO {table_prefix}backendmenu VALUES ('', 1 , # Menüebene {client_id}, # Projektid 10, #sortierung 'nav_pluginname', 'main.php?area=plugin&cms_plugin=pluginname/index.php', 'single', '$perm->have_perm("area_plug_pluginname")'); === Single-Client mit Frame === INSERT INTO {table_prefix}backendmenu VALUES ('', 1 , # Menüebene 0, # Projektid 10, #sortierung 'nav_pluginname', 'plugins/pluginname/index.php', 'frame', '$perm->have_perm("area_plug_pluginname")'); === Single-Client ohne Frame === INSERT INTO {table_prefix}backendmenu VALUES ('', 1 , # Menüebene 0, # Projektid 10, #sortierung 'nav_pluginname', 'main.php?area=plugin&cms_plugin=pluginname/index.php', 'single', '$perm->have_perm("area_plug_pluginname")'); ==== Rechte ==== Es ist möglich für das Plugin Rechteeinträge vorzunehmen, die dann für jede Benutzergruppe im Backend oder für das Plugin direkt konfiguriert werden können. Die einzelnen Angaben in den Queries sind farblich markiert: * **Pluginname**: Sollte immer kleingeschrieben werden und ohne Sonderzeichen sein. Er dient als Erkennungsmerkmal für Sefrengo und muss eindeutig sein (wie eine ID). * **Rechte-ID**: Die Nummer des Rechtes. Wird später zum Abfragen des Rechtes gebraucht. Zahlen in Einerschritten hochzählen. (1, 2, 3, 4, ...) * **Bitmaske**: Die Zahlen geben die Bitmaske für das Recht an. Zahlen immer vordoppeln. (1, 2, 4, 8, 16, 32, ...) * **Sortierung**: Je größer die Zahl, desto weiter unten erscheint der Eintrag auf der Rechteseite. Die Zahl wird normalerweise in Zehnerschritten hochgezählt. (10, 20, 30, 40, ...) === Zugriffsrecht === Zunächst wird das Zugriffsrecht angelegt, über den der generelle Zugriff auf das Plugin geregelt wird. Dieser Eintrag wird mit folgendem Query vorgenommen: INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'user_perms', 'cms_access', 'area_plug_pluginname', NULL, NULL, 'plug', 100, #sortierung 'group_area_plug_pluginname', '', 'txt', NULL, NULL, 0); === Unterrechte === Desweiteren können untergeordnete Rechte angelegt werden, die z.B. den Zugriff auf speziellere Funktionen innerhalb des Plugins steuern können. INSERT INTO {table_prefix}values VALUES ( '', 0, 0, 'user_perms', 'area_plug_pluginname', '1',#Rechte-ID NULL, NULL, '1',#Bitmaske 10,#Sortierung 'group_area_plug_pluginname_1', #Rechte-ID muss immer hinten dran '', 'txt', NULL, NULL, 0); INSERT INTO {table_prefix}values VALUES ( '', 0, 0, 'user_perms', 'area_plug_pluginname', '2',#Rechte-ID NULL, NULL, '2',#Bitmaske 20,#Sortierung 'group_area_plug_pluginname_2', #Rechte-ID muss immer hinten dran '', 'txt', NULL, NULL, 0); INSERT INTO {table_prefix}values VALUES ( '', 0, 0, 'user_perms', 'area_plug_pluginname', '3',#Rechte-ID NULL, NULL, '4',#Bitmaske 30,#Sortierung 'group_area_plug_pluginname_3', #Rechte-ID muss immer hinten dran '', 'txt', NULL, NULL, 0); INSERT INTO {table_prefix}values VALUES ( '', 0, 0, 'user_perms', 'area_plug_pluginname', '4',#Rechte-ID NULL, NULL, '8',#Bitmaske 40,#Sortierung 'group_area_plug_pluginname_4', #Rechte-ID muss immer hinten dran '', 'txt', NULL, NULL, 0); /* ==== Sprachstrings === Auch die Sprachstrings für die Rechteeinträge werden in der Datenbank abgelegt. Dazu werden folgende Queries benötigt. # Haupteintrag INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'lang', 'group_area_plug_pluginname', '', '', '', ' '$cms_lang[[group_area_plug_pluginname]]' ', 0, NULL, NULL, 'txt', NULL, NULL, 0); # Untereinträge INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'lang', 'group_area_plug_pluginname_1', '', '', '', '$cms_lang[[]]', 0, NULL, NULL, 'txt', NULL, NULL, 0); INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'lang', 'group_area_plug_pluginname_2', '', '', '', '$cms_lang[[group_area_plug_pluginname_2]]', 0, NULL, NULL, 'txt', NULL, NULL, 0); INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'lang', 'group_area_plug_pluginname_3', '', '', '', '$cms_lang[[group_area_plug_pluginname_3]]', 0, NULL, NULL, 'txt', NULL, NULL, 0); INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'lang', 'group_area_plug_pluginname_4', '', '', '', '$cms_lang[[group_area_plug_pluginname_4]]', 0, NULL, NULL, 'txt', NULL, NULL, 0); */ ==== Deinstallation ==== In der uninstall.meta müssen alle Änderungen, die in der Installation gemacht wurden, wieder rückgängig gemacht werden. Für die oben beschriebenen Einträge sehen die passenden Queries so aus (nicht Benötigtes einfach weglassen): # Menüeintrag DELETE FROM {table_prefix}backendmenu WHERE entry_langstring = 'nav_pluginname'; # Pluginrechte DELETE FROM {table_prefix}values WHERE group_name = 'user_perms' AND key1 = 'area_plug_pluginname' OR key2 = 'area_plug_pluginname'; # Events (wenn nötig) DELETE FROM {table_prefix}values WHERE group_name='events' and key1='actions' AND key2 = 'pluginname'; # Projektabhängige Einstellungen (wenn nötig) DELETE FROM {table_prefix}values WHERE idclient = {client_id} AND group_name = 'pluginname'; # Systemeinstellungen (wenn nötig) DELETE FROM {table_prefix}values WHERE idclient = 0 AND group_name = 'pluginname'; /* # Sprachstrings DELETE FROM {table_prefix}values WHERE group_name = 'lang' AND key1 = 'nav_pluginname'; DELETE FROM {table_prefix}values WHERE group_name = 'lang' AND key1 LIKE 'group_area_plug_pluginname%'; */ ===== Rechtekontrolle ===== Zunächsts sollte vor allen Anweisungen in jeder direkt ausführbaren Datei des Plugins geprüft werden, ob der Benutzer das Plugin überhaupt ausführen darf. Dazu sollte als eine der ersten Anweisungen $perm->check('area_plug_pluginname'); aufgerufen werden. Besitzt der Benutzer nicht die nötigen Rechte für diesen Bereich wird eine Fehlermeldung ausgegeben. Um den Status der Unterrechte zu prüfen wird die Methode have_perm des $perm-Objektes aufgerufen. Zum Testen auf das 1. definierte Recht kann z.B. ein solcher Aufruf ausgeführet werden: if($perm->have_perm(1, 'area_plug_pluginname')) { // tu etwas } ===== Konfigurationseinstellungen ===== Für Plugins gibt es die Möglichkeit Konfigurationseinstellungen über Sefrengo zu verwalten und im Plugin darauf zu reagieren. Es gibt zwei unterschiedliche Arten von Einstellungen - zum einen die systemweiten und zum anderen die projektabhängigen Einstellungen. Beide können auch gemischt genutzt werden. Um Einstellungen zu nutzen müssen als erstes sogenannte values in die Datenbank eingetragen werden. Diese können dann unter Administration -> Plugins -> Plugin konfigurieren (Schraubenschlüssel) konfiguriert werden. Oben rechts kann zwischen Globaler und Client Konfiguration gewechselt werden. Sind alle Werte gespeichert, wird das Auslesen der Werte im Plugin aufgezeigt. ==== Plugin Auto-Settings aktivieren ==== Aktivieren Sie als erstes die Auto-Settings in der pluginname_meta.php im Plugin-Verzeichnis. Ist diese Einstellung aktiviert kümmert sich Sefrengo selbstständig um das Auslesen der Konfiguration und stellt diese bereit. /* * enable auto load of plugin settings on D*DI startup * this feature supports dedi_values with group_named settings * sample: * dirname = /myplugin * group_name = myplugin * $cfg_myplugin = array() * */ var $auto_settings = true; ==== Projektabhängige Einstellungen ==== Tragen Sie die gewünschte Anzahl an Values in die install.meta oder client_install.meta im meta-Verzeichnis des Plugins ein. Folgende Angaben werden benötigt: * **Pluginname**: Sollte wie das Pluginverzeichnis (kleingeschrieben, ohne Sonderzeichen) heißen. Er dient als Erkennungsmerkmal für Sefrengo und muss eindeutig sein (wie eine ID). * **Einstellungs-ID**: Gibt den späteren Namen der Einstellung an und muss für das Plugin eindeutig sein (eine ID). * **Sortierung**: Je größer die Zahl, desto weiter hinten erscheint der Eintrag im Menü. Die Zahl wird normalerweise in Zehnerschritten hochgezählt. * **Sprachstrings**: cfgclient_pluginname_value1 und cfgclient_pluginname_header können in der [[#sprachdateien|Sprachdatei]] als $cms_lang['cfgclient_pluginname_value1'] = "Beschreibung"; abgelegt werden, wenn in der pluginname_meta.php $auto_lang = true; ist.\\ Der Gruppentitel (lang_pluginname_header) darf nur beim ersten Eintrag (in der Reihenfolge des Sortindex) angegeben werden. * **Anzeigen**: Es ist auch möglich Einstellungen in der DB abzulegen, ohne diese anzuzeigen. Dazu wird dann einfach der letzte Wert im Query von **1** auf **0** geändert. Es sind dann natürlich auch keine Sprachstrings notwendig. INSERT INTO {table_prefix}values VALUES ('', {client_id}, 0, 'pluginname', #Pluginname 'value1', #EinstallungsId NULL, NULL, NULL, 'Standardwert',#Standardwert 500,#Sortierung 'cfgclient_pluginname_value1', 'cfgclient_pluginname_header', 'txt', NULL, '', 1); INSERT INTO {table_prefix}values VALUES ('', {client_id}, 0, 'pluginname', #Pluginname 'value2', #EinstellungsId NULL, NULL, NULL, 'Standardwert',#Standardwert 510,#Sortierung 'cfgclient_pluginname_value2', NULL, 'txt', NULL, '', 1); ==== Systemweite Einstellungen ==== Systemweite Einstellungen werden genauso wie [[#projektabhaengige-einstellungen|Projektabhängige Einstellungen]] erstellt, mit dem Unterschied, dass keine {client_id} benötigt wird und diese auf 0 gesetzt wird. Die Beschreibung der SQL-Querys lesen Sie oben. INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'pluginname', #Pluginname 'value1', #EinstellungsId NULL, NULL, NULL, 'Standardwert', #Standardwert 500, #Sortierung 'cfg_pluginname_value1', 'cfg_pluginname_header', 'txt', NULL, '', 1); INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'pluginname', #Pluginname 'value2', #EinstellungsId NULL, NULL, NULL, 'Standardwert', #Standardwert 510, #Sortierung 'cfg_pluginname_value2', NULL, 'txt', NULL, '', 1); ==== Einstellungen auslesen ==== Ist die Einstellung $auto_settings = true;, kann über $cfg_pluginname['value1'] und $cfg_pluginname['value2'] auf die Werte der Einstellungen zugegriffen werden. === Sonderfall: Standalone-Plugins === Einen Sonderfall stellen [[#standalone-plugins|Standalone-Plugins]] dar, die in einem Frame laufen. Bei diesem Plugins muss die inc.init_external.php includiert werden. Um Zugriff auf die Einstellungen zu haben benötigt man außerdem noch eine Aufruf der Funktion lib_init_settings(). //Load external Sefrengo configuration if(!isset($cfg_cms)) { require_once('../../inc/inc.init_external.php'); } require_once ($cms_path.'inc/fnc.libary.php'); lib_init_settings('pluginname') /* Es ist auch möglich Konfigurationseinstellungen für das Anzeigen unter Administration -> System oder Administration -> Projekt -> Konfigurieren anzulegen. Die Einstellungen können entweder systemweit oder für jedes Projekt einzeln festgelegt werden. Es können auch beide Optionen gemischt werden. Auf die Projektkonfigurationen kann mittels des Arrays $cfg_client in der Form $cfg_client[pluginname][value1] zugegriffen werden. Die systemweiten Einstellungen sind per $cfg_cms verfügbar, auf die in der gleichen Form wie bei $cfg_client zugegriffen werden kann. Es ist auch Möglich einstellungen in der DB abzulegen, ohne diese anzuzeigen. Dazu wird dann einfach der letzte Wert im Query von **1** auf **0** geändert. Es sind dann natürlich auch keine Sprachstrings notwendig. Um die Einstellungen im System anzeigen zu lassen, müssen die folgenden Queries in die install.meta eingefügt werden. Die einzelnen Angaben in den Queries sind natürlich wieder farblich markiert: * **Pluginname**: Sollte immer kleingeschrieben werden und ohne Sonderzeichen sein. Er dient als Erkennungsmerkmal für Sefrengo und muss eindeutig sein (wie eine ID). * **Einstellungs-ID**: Gibt den späteren Namen der Einstellung in $cfg_cms und $cfg_client an und muss für das Plugin eindeutig sein (eine ID). * **Sortierung**: Je größer die Zahl, desto weiter hinten erscheint der Eintrag im Menü. Die Zahl wird normalerweise in Zehnerschritten hochgezählt. ==== Projektabhängige Einstellungen ==== INSERT INTO {table_prefix}values VALUES ('', {client_id}, 0, 'cfg_client', 'pluginname', #Pluginname 'value1', #EinstallungsId NULL, NULL, 'Standardwert',#Standardwert 500,#Sortierung 'cfgclient_pluginname_value1', 'cfgclient_pluginname', 'txt', NULL, '', 1); INSERT INTO {table_prefix}values VALUES ('', {client_id}, 0, 'cfg_client', 'pluginname', #Pluginname 'value2', #EinstellungsId NULL, NULL, 'Standardwert',#Standardwert 510,#Sortierung 'cfgclient_pluginname_value2', NULL, 'txt', NULL, '', 1); Der Gruppentitel ('cfgclient_pluginname') darf nur beim ersten Eintrag (in der Reihenfolge des Sortindex) angegeben werden. ==== Systemeinstellungen ==== INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'cfg', 'pluginname', #Pluginname 'value1', #EinstellungsId NULL, NULL, 'Standardwert', #Standardwert 500, #Sortierung 'cfg_pluginname_value1', 'cfg_pluginname', 'txt', NULL, '', 1); INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'cfg', 'pluginname', #Pluginname 'value2', #EinstellungsId NULL, NULL, 'Standardwert', #Standardwert 510, #Sortierung 'cfg_pluginname_value2', NULL, 'txt', NULL, '', 1); Der Gruppentitel ('cfg_pluginname') darf nur beim ersten Eintrag (in der Reihenfolge des Sortindex) angegeben werden. ==== Sprachstrings ==== Auch die Sprachstrings für Konfigurationseinstellungen können in der DB verankert werden. Die für die Projektabhängien Einstellungen nötigen Einträge sehen wie folgt aus, die Einträge für systemabhängige Einstellungen werden analog mit **cfg** statt **cfgclient** angelegt. INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'lang', 'cfgclient_pluginname', '', '', '', '$cms_lang[[cfgclient_pluginname]]', 0, NULL, NULL, 'txt', NULL, NULL, 0); INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'lang', 'cfgclient_pluginname_value1', NULL, NULL, NULL, '$cms_lang[[cfgclient_pluginname_value1]]', 0, NULL, NULL, 'txt', NULL, NULL, 1); INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'lang', 'cfgclient_pluginname_value2', NULL, NULL, NULL, '$cms_lang[[cfgclient_pluginname_value2]]', 0, NULL, NULL, 'txt', NULL, NULL, 1); Es wird jedoch empfohlen die Funktion **Sprachdateien** des Plugins zunutzen, das die Sprachstrings aus dem jeweilen Plugin nachlädt. */ ===== Autostarts ===== Plugins haben auch die Möglichkeit, Autostarts zu definieren. Diese werden beim Aufrufen der Frontenddatei (beim ansehen oder auch beim bearbeiten einer Seite) automatisch ausgeführt. Darüber können Zugriffe geloggt (Statistikplugin), die Ausgabe manipuliert (Smartypants) oder auch Aktionen wie ein Backup angestoßen werden (Pseudochron). Um Autostarts einzufügen müssen die folgenden Queries in die Installation aufgenommen werden: INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'cfg', 'autostart', 'frontend', 'pluginname', NULL, 'pluginname/process.php', 0, NULL, NULL, 'txt', NULL, NULL, 0); INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'cfg', 'autostart', 'backend', 'pluginname', NULL, 'pluginname/process.php', 0, NULL, NULL, 'txt', NULL, NULL, 0); Je nach Query wird dann im Frontend, im Backend oder in beidem die Datei process.php im Pluginverzeichnis eingebunden. Die Einstellung ist nur je Projekt möglich. Der Text, der ausgegeben wird ist über die Variable $output ansteuerbar. ===== Sprachdateien ===== Innerhalb des Plugin-Ordners sollte ein Ordner lang angelegt werden (in der Datei pluginvorlage.tar bereits enthalten). Dort wird für jede vorhandene Sprache ein Unterordner mit dem Namen des [[http://de.selfhtml.org/diverses/sprachenkuerzel.htm#uebersicht_iso_639_1|Sprachkürzels nach ISO-639-1]] (beispielsweise de, en oder fr) angelegt. Darin werden die sprachspezifischen Dateien abgelegt. In der Pluginvorlage sind bereits zwei Dateien vorhanden: lang_general.php sollte alle Spracheinträge enthalten, die für die Anzeige der Pluginoberfläche notwendig sind, also eigentlich alle "normalen" Sprachstrings. Diese Strings sollten in das Array $cms_lang eingefügt werden, wie in der Vorlage demonstriert. Diese Datei sollte so am anfang aller notwendigen Dateien eingebunden werden: $lang_dir = $cfg_cms[['cms_path']].'plugins/pluginname/lang/'.$cfg_cms[['backend_lang']].'/'; $lang_defdir = $cfg_cms[['cms_path']].'plugins/pluginname/lang/de/'; require_once((file_exists($lang_dir.'lang_general.php') ? $lang_dir : $lang_defdir ) .'lang_general.php'); lang_general.php wird automatisch (über die pluginname_meta.php) auf jeder Seite des Backends eingebunden und sollte die in der DB verlinkten Sprachstrings für den Menüeintrag sowie Rechte und Konfigurationseinstellungen enthalten. Dazu müssen die folgenden Strings gesetzt werden: $cms_lang['nav_pluginname'] = 'Anzeigename im Menü'; $cms_lang['group_area_plug_pluginname'] = 'Bereich {Bereichname} / Angezeigter Name Deines Plugins'; $cms_lang['group_area_plug_pluginname_1'] = 'Angezeigetitel des 1. Rechte-Eintrags'; $cms_lang['group_area_plug_pluginname_2'] = 'Angezeigetitel des 2. Rechte-Eintrags'; $cms_lang['group_area_plug_pluginname_3'] = 'Angezeigetitel des 3. Rechte-Eintrags'; $cms_lang['group_area_plug_pluginname_4'] = 'Angezeigetitel des 4. Rechte-Eintrags'; $cms_lang['cfgclient_pluginname_header'] = 'Angezeigetitel der Projekt-Konfigurationsgruppe'; $cms_lang['cfgclient_pluginname_value1'] = 'Angezeigetitel der Projekt-Einstellung 1'; $cms_lang['cfgclient_pluginname_value2'] = 'Angezeigetitel der Projekt-Einstellung 2'; $cms_lang['cfg_pluginname_header'] = 'Angezeigetitel der System-Konfigurationsgruppe'; $cms_lang['cfg_pluginname_value1'] = 'Angezeigetitel der System-Einstellung 1'; $cms_lang['cfg_pluginname_value2'] = 'Angezeigetitel der System-Einstellung 2'; ===== Standalone-Plugins ===== Bei Standalone-Plugins sollte noch die Sefrengo-Datei inc.init_external.php eingebunden werden. Diese stellt nicht nur sicher, dass ein gültiger Benutzer im Sefrengo-Backend angemeldet ist, sondern lädt auch alle Konfigurationsdaten, Seiten und Ordner in ihre zugehörige Arrays. Aus dem Pluginorder wird dies mit folgender Anweisung erledigt: require_once('../../inc/inc.init_external.php'); Um die Loginmaske zu unterdrücken kann man das Autologin (Frontend-Session) verwenden. define('SF_SKIP_HEADER', true); define('SF_USE_FRONTEND_SESSION', true); include_once("../../inc/inc.init_external.php"); * MaZderMind