Contenido Plugin(s) entwickeln (Teil 2: Das Grundgerüst)

Nachdem es nun doch etwas länger gedauert hat, möchte ich heute den 2. Teil der Serie veröffentlichen. Am Ende dieses Artikels sollten wir dann ein Plugin-Grundgerüst haben, welches im Backend unserer Contenidoinstallation unter dem Hauptmenüpunkt Statistik erreichbar ist.

Zum besseren Verständnis werden wir für dieses Grundgerüst (noch) keinen Plugin-Installer nutzen, sondern benötigte Datenbankeinträge mit unserer DB-Adminoberfläche, ich empfehle da phpMyAdmin, von Hand einpflegen.

Weiterhin sollte man Contenido Plugin(s) entwickeln (Teil 1: Grundlegendes) und den Artikel Contenido Plugin(s): Backend Frames (es muss Alles im Rahmen bleiben) gelesen haben, da diese Informationen vorausgesetzt werden.

Von Ordnern und Dateien

Wir nehmen eine Teil unserer im 1 Teil besprochenen Ordnerstruktur und ergänzen sie mit den aufgeführten Dateien. Am Besten macht man das gleich in einer Demoinstallation von Contenido, wobei ich mit heutigem Stand die Version 4.8.12 bis zum Ende der Artikelserie nutzen werden.

Also bitte erstellt in eurer Installation im Ordner contenido/plugins folgende Unterordner und (leere) Dateien.

dceExtStat

  • includes
    include.left_top.php
    include.left_bottom.php
    include.right_top.php
    include.right_bottom.php 
  • templates
    • standard
      page.html
  • xml
    lang_en_US.xml
    lang_de_DE.xml

Als nächstes werden wir nun unsere Dateien soweit mit Inhalt füllen, das wir später im Backend erkennen können, welche Datei wo eingebunden ist. Die Dateinamen der include-Dateien sind daher auch absichtlich analog den Frames im Backend benannt.

Fangen wir aber erstmal mit der Templatedatei an, welche vorerst ein einfaches HTML-Grundgerüst mit einem {content}-Platzhalter enthält. Bitte schreibt folgendes in die Datei page.html im Ordner templates/standard.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="de" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<link rel="stylesheet" type="text/css" href="styles/contenido.css" />
</head>
<body style="margin: 10px;">
{content}
</body>
</html>

Kommen wir als nächstes zu den eigentlichen Seiten im includes-Ordner. Hier nun die Inhalte für die einzelnen Dateien, wobei die beiden Top-Frames Standardinhalte bekommen.

includes.left_top.php

<?php
include ($cfg['path']['contenido'].$cfg['path']['templates'].'template.left_top_blank.html');
?>

includes.right_top.php

<?php
 include ($cfg['path']['contenido'].$cfg['path']['templates'].'template.right_top_blank.html');
 ?>

includes.left_bottom.php und includes.right_bottom.php

<?php
/**
 *
 **/

include_once('config.plugin.php');
$plugin_name = "dceExtStat";

if (ereg("sysadmin", $auth->auth['perm']))
{
 $sHTMLOutput = "Datei: ".basename(__FILE__)." Pfad: ".dirname(__FILE__);
 $tpl->set('s', 'content', $sHTMLOutput);

}else
{
 $sHTMLOutput = $notification->messageBox("error", i18n("No permission.", $plugin_name),0);
 $tpl->set('s', 'content', $sHTMLOutput);

}

$tpl->generate($cfg['path']['contenido'].$cfg['path']['plugins'].$plugin_name.'/templates/standard/page.html');
?>

Als kleines Schmankerl kann man hier auch schon mal eine Möglichkeit sehen, den Zugriff auf die Seite(n) zu beschränken. Durch die Abfrage der Authentifizierung, hier im Speziellen des Objektarray $auth, in dessen Key ‚perm‘ die Benutzerrechte als Liste enthalten sind, mit Hilfe einer ereg-Funktion, wird der Zugriff auf den sysadmin begrenzt.

Für den „normalen“ User, kann man das später auch in der Rechteverwaltung von Contenido machen, wenn die Area dafür in der DB gesetzt ist. Doch dazu später noch mehr.

Um die Inhalte der Dateien unseres Grundgerüstes abzuschließen, fehlt nun noch der für die XML-Dateien. Diese sind, wie bereits im Artikel zu den Backend Frames gesagt, für die lokalisierte Anzeige der Menüpunkte da. Beispielhaft führe ich nur den Inhalt der deutschen XML-Datei auf. (Leider rückt das WP-Plugin nicht ordentlich ein mit Tab)

<?xml version="1.0"?>
<language>
 <navigation>
 <statistic>
 <dceExtStat>
 <main>erweiterte Statistik</main>
 </dceExtStat>
 </statistic>
 </navigation>
</language>

Datenbankeinträge machen unser Plugin sichtbar

Um unser Grundgerüst nun im Backend sichtbar zu machen, müssen wir Einträge in den DB-Tabellen con_area, con_nav_sub, con_files und con_frame_files machen. Hierbei gehe ich der Einfachheit halber davon aus, das es kein anderes Userplugin gibt, und somit auch keine Einträge beginnend mit 10000 in den genannten Tabellen vorhanden sind. Id >= 10000 ist, wie bereits erwähnt, der Beginn des Id-Bereiches, der bei einem Update nicht vom Setup überschrieben wird.

con_area

INSERT INTO con_area VALUES ('10000', '0', 'dceExtStat', '1', '1', '0');

Dieser Eintrag legt unsere Area (Bereich) mit dem Namen „dceExtStat“ und der idarea (=10000), die wir noch in den weiteren Tabellen benötigen, fest.

  • con_area, mit folgenden Spalten
    • idarea, muss über 10000 liegen, sonst wirds beim Update/Upgrade überschrieben. Am besten dynamisch vergeben per Installer.
    • parent_id, 0 für die oberste Ebene, oder der Name der übergeordneten Ebene.
    • name, der Name der Area, in unserem Fall dceExtStat.
    • relevant, boolean (0/1), gibt an ob diese Area in der Rechteverwaltung berücksichtigt werden soll oder nicht.
    • online, boolean (0/1), macht genau das, was der Name aussagt, schaltet die Area on-/offline.
    • menuless, boolean (0/1), gibt an ob das Frameset mit 4 Frames (=0) oder nur mit den 2 rechten Frames (=1) angezeigt werden soll. Dementsprechend benötigt man dieselbe Anzahl an Einträgen in con_files und con_frame_files.

con_nav_sub

INSERT INTO con_nav_sub VALUES ('10000', '4', '10000', '0', 'dceExtStat/xml/;navigation/statistic/dceExtStat/main', '1');

Hiermit legen wir fest, wo unser Plugin im Hauptmenü auftauchen soll.

  • con_nav_sub, mit folgenden Spalten
    • idnavs, muss über 10000 liegen, sonst wirds beim Update/Upgrade überschrieben. Am besten dynamisch vergeben per Installer.
    • idnavm, gibt den Hauptmenüpunkt aus der con_nav_main an, unter dem unser Plugin geführt wird. In unserem Fall 4, so daß unser Plugin unter dem Hauptmenü „Statistik“ aufgeführt wird. Ein Sonderfall ist der Eintrag 0, dieser, zusammen mit einer 1 bei level, bezeichnet die Menüebene im Frame 3, also eigentlich die 3.Ebene.
    • idarea, sollte klar sein.
    • level,  (0/1), habe ich bei idnavm bereits erklärt.
    • location, gibt Pfad der XML-Datei und Zweig in der XML-Datei durch Semikolon getrennt an.
    • online, boolean (0/1), macht genau das, was der Name aussagt, schaltet den Menüeintrag on-/offline

Fehlen nur noch die Einträge der Dateien in con_files, und in welchem Frame sie angezeigt werden sollen (con_frame_files). Der aufmerksame Leser wird nun sicher bemerken, das ich zu diesem Thema bereits bei Backend Frames die entsprechenden Einträge gezeigt habe, wenn auch als Eintrag in der install.sql.

Aufgabe soll nun sein, die entsprechenden SQL-Anweisung für unsere include-Dateien bis zum nächsten Artikel der Serie zu erstellen. Mal schauen, wer als Erster die  richtige Lösung als Kommentar postet. 😯

Aussichten…

Soweit zum 2. Teil meiner Artikelserie zur Pluginentwicklung. Im nächsten Teil

Contenido Plugin(s) entwickeln (Teil 3: Interaktion von Frontend und Backend)

möchte ich zeigen, wie man, im speziellen Fall unseres Statistik-Plugins, im Frontend Daten gewinnt, die wir später im Backend aufbereiten werden. Schlagwörter hierzu sind CEC, Chains und Hooks.

Ich hoffe, das ich für den nächsten Teil nicht ganz so lange brauchen werde. Fragen und Anregungen sind natürlich auch diesmal willkommen 🙂

7 Antworten zu “Contenido Plugin(s) entwickeln (Teil 2: Das Grundgerüst)”

  1. Okay, da ist natürlich was gekürzt worden… Versuch 2

    In der config.plugin.pp sollte zumindest das hier stehen:

  2. Hallo Ortwin,

    Danke für die Anleitung! :O)

    Äh… wenn ich mich nicht ganz vergucke, hast Du die „config.plugin.php“ für den includes-Ordner vergessen. Ohne die kommt nämlich im BE die Fehlermeldung „Warning: include_once() [function.include]: Failed opening ‚config.plugin.php‘ for inclusion…“

    In der Datei sollte dann (habe Murats Datei vom AMR-Plugin zusammengestrichen) zumindest das hier stehen:

    Bis dann,

    Markus

  3. Hi Ortwin,

    das Abprüfen der Admin-Berechtigung sollte besser mit
    if( strpos($auth->auth[„perm“], „sysadmin“) !== FALSE) )
    gemacht werden, nachdem ereg ab PHP5.3 deprecated ist und aus 6.0 ganz rausfallen wird.

  4. Hallo Christian,

    ob nun richtig oder nicht, möchte ich an dieser Stelle (noch) nicht sagen.
    Aber es ist leider nicht die Lösung der Aufgabenstellung.
    Gesucht waren und sind die Einträge für con_files und con_frame_files in Bezug auf das, im Artikel beschriebene, Beispiel.

    Gruß Ortwin

  5. INSERT INTO con_area VALUES (‚10300‘, ‚0‘, ’seoChecker‘, ‚1‘, ‚1‘, ‚0‘);

    INSERT INTO con_nav_sub VALUES (‚10300‘, ‚1‘, ‚10300‘, ‚0‘, ’seoChecker/xml/;navigation/content/seoChecker/main‘, ‚1‘);

    INSERT INTO con_files VALUES (‚10301‘, ‚10300‘, ’seoChecker/includes/includes.left_bottom.php‘, ‚main‘);
    INSERT INTO con_files VALUES (‚10302‘, ‚10300‘, ’seoChecker/includes/includes.left_top.php‘, ‚main‘);
    INSERT INTO con_files VALUES (‚10303‘, ‚10300‘, ’seoChecker/includes/includes.right_bottom.php‘, ‚main‘);
    INSERT INTO con_files VALUES (‚10304‘, ‚10300‘, ’seoChecker/includes/includes.right_top.php‘, ‚main‘);

    INSERT INTO con_frame_files VALUES (‚10301‘, ‚10300‘, ‚2‘, ‚10301‘);
    INSERT INTO con_frame_files VALUES (‚10302‘, ‚10300‘, ‚1‘, ‚10302‘);
    INSERT INTO con_frame_files VALUES (‚10303‘, ‚10300‘, ‚4‘, ‚10303‘);
    INSERT INTO con_frame_files VALUES (‚10304‘, ‚10300‘, ‚3‘, ‚10304‘);

    mal so als Beispiel 🙂 Hoffe ist alles richtig

Kommentare sind geschlossen.