====== Module ====== Module sind das Rückgrat von Sefrengo und eine der Stärken des CMS. Module sind eigenständige Programmteile, die die Funktionalität einer Website bestimmen. Module stellen zum Beispiel eine Navigation oder eine Schlagwortwolke auf einer Website dar, oder ermöglichen dem Redakteur die Eingabe von Artikeln, bietet Anzeigeplätze von Bildern und vieles mehr. Der über Module generierte Inhalt wird über Templates mit dem Layout der Website verbunden. Während somit Module dem Frontend dienen, erweitern Plugins hingegen die Backend-Möglichkeiten von Sefrengo. Sefrengo bietet Ihnen die Möglichkeit, eigene Module zu programmieren und sie nach individuellen Bedürfnissen des Redakteurs und der Website zu gestalten. Einfache Module lassen sich mit den Sefrengo Werkzeugen cms:Tags und mip_forms erstellen. Die Erstellung komplexerer Module sind dank PHP und MySql kein Problem. Dadurch erhalten Sie ein Maximum an Flexibilität. ====== Ein Modul erstellen ====== Um sich mit dem Thema Module vertraut zu machen, beginnen Sie am besten ganz vorne: Beim Erstellen eines eigenen Moduls. In diesem Tutorial wird Schritt für Schritt gezeigt, wie man ein eigenes Modul erstellt. Im folgenden Beispiel erstellen wir ein kleines einfaches Modul, welches ein Artikel mit einer Überschrift, einem Teaser, einem Bild und einem Textkörper erzeugt ==== Modul anlegen ==== Gehen Sie dazu in Sefrengo im Bereich "Design" auf "Module" und dort auf "neues Modul". Sie sehen folgende Eingabemaske: {{:handbuch:entwicklung:modul0.jpg|}} __**Erklärung Formularfelder:**__ | **Modulname** | Unter diesem eindeutigen Namen wird das Modul gespeichert. Wenn man später verschiedene Varianten des Moduls verwenden möchte, kann man das Modul weitere Male importieren und ihnen alternative Namen geben. | | **Version** | Die Versionsnummer ermöglicht das einfache aktualisieren überarbeiteter Modulversionen. Mehr dazu später in "Versionsummerbeschreibung". | | **Kategorie** | Module können verschiedenen Kategorien zugeordnet werden. Die Kategorie dient zur groben Vorsortierung und Funktionseinordnung des Moduls. Zur Auswahl stehen Content, Contentliste, Navigation, System, Interaktion, Tools. Die Kategorie kann in der Selectbox "Auswahlmöglichkeiten" ausgewählt werden und wird automatisch im Formularfeld "Kategorie" eingetragen. Alternativ können Sie im Feld "Kategorie" Ihre eigene Kategorie erstellen, z.B. "Meine Module", diese wird dann auch in die Selectbox übernommen und kann später benutzt werden. | |**Beschreibung** | Notieren Sie hier eine kurze Beschreibung Ihres Moduls: Was macht das Modul? | |**Frontendausgabe**|Der Frontendbereich stellt den Code für die Ausgabe des Moduls im Frontendbereich zur Verfügung. Die Frontendausgabe ist also der Bereich, der später an der Stelle der Website erscheint, in dem das Modul eingebunden wurde.| Nun legen wir unser erstes Modul an. {{:handbuch:entwicklung:m2.jpg|}} **Formularfelder:** |**Modulname**| Artikelmodul| |**Version**|1.0| |**Kategorie**|Für das Artikelmodul währen wir "Content".| |**Beschreibung**|In unserem Beispiel ein Modul, welches einen Artikel erzeugt. In diesem Feld tragen wir ein.| |**Konfiguration**|Hier wird noch nichts eingetragen. Das Modul wird später konfiguriert.| |**Frontendausgabe** | In unserem gegenwärtigen Entwicklungsstadium ist das schlichtweg der Text, den wir hier eingeben. Und zwar: "Dieses Artikemodul erzeugt stets den gleichen Inhalt - nämlich diesen Text - und zwar an jeder Stelle auf der Website, wo es eingefügt wird."| ==== Modul in die Webseite einbinden ==== Im nächsten Schritt muss das Modul in die Website eingebunden werde. Dazu gehen Sie im Bereich „Design“ auf „Layouts“ und wählen Sie ein Layout aus (sofern es besteht, andernfalls müssen Sie ein neues Layout anlegen). Im Layout fügen Sie nun den Container ein, der das Modul beinhaltet, also z.B:
Wählen Sie eine hohe ID, um Konflikte mit anderen schon bestehenden Containern zu vermeiden. Als nächstes gehen Sie im Bereich „Design“ auf „Templates“ und wählen ein Template aus, in welches Sie das Artikelmodul einfügen möchten. Innerhalb des Templates sollten Sie nun den Bereich „Artikel“ sehen: {{:handbuch:entwicklung:m3.jpg?600|}} Wählen Sie hier aus der Dropdown-Liste das „Artikelmodul“ aus. {{:handbuch:entwicklung:m4.jpg?600|}} Daraufhin aktualisiert der Browser und zeigt Ihnen die Konfigurationsmöglichkeiten des Moduls - da wir zum jetzigen Zeitpunkt noch keine haben, steht hier genau der Text, den wir vorhin beim Modul unter „Konfiguration“ angegeben haben („noch keine Konfiguration“). {{:handbuch:entwicklung:m5.jpg?600|}} Damit die Änderungen für alle Seiten und Ordner übernommen werden, vergessen Sie nicht, bei „Änderungen für Ordner und Seiten übernehmen“ ein Häkchen zu setzen und speichern Sie das Template. Wenn Sie nun auf „Redaktion“ und „Seitenvorschau“ gehen, sollten Sie beim Aufruf der entsprechenden Website die Frontendausgabe an der Stelle sehen, wo Sie den Artikel-Modul-Container platziert haben. ====== CMS:MOD Tags ====== Als CMS:MOD Tag (Modultag) wird eine einzelne CMS-Funktion bezeichnet. CMS:MOD Tags legen fest, in welcher bestimmten Weise die Inhalte eines Websites angezeigt werden sollen. Mit Hilfe von CMS:MOD Tags kann der Entwickler festlegen, welche Einstellungen ein Redakteur zur Verfügung hat, beispielsweise welche Textbearbeitung ermöglicht werden soll (womöglich fett und normal-Schrift, aber keine kursiv-Schrift), oder der Entwickler bestimmt, welche Optionen die Frontend-Bearbeitungsmenüs, z.B. von Artikeln, aufweisen, etwa „Artikel löschen“, „neuen Artikel hinzufügen“, „Artikel bearbeiten“. Der Redaktor kann sich auf den wesentlichen Teil seiner Arbeit, das Erstellen von Inhalten, konzentrieren und muss sich nicht um Darstellung und Funktionalität kümmern. Die CMS:MOD Tags werden in den Frontendausgabe eingetragen. Dabei ist Folgendes zu beachten: |**cms:mod**| Leitet die Codezeile für das CMS:MOD Tag ein.| |**type = "type"**|Pflichfeld. Bezeichnet die Funktion die verwendet werden soll, z.B. eine Textzeile(type="text") oder ein Bild (type = "image").| |**id = "id"** |Pflichfeld. Fortlaufende, eindeutige Nummer des cms:mod Tags.| |**/>** |Beendet die Codezeile für das CMS:MOD Tag.| **Artikelmodul um CMS:MOD Tags erweitern** Nehmen wir nun unser bisheriges Artikelmodul auf und erweitern wir es um CMS:MOD Tags. Der Redakteur soll die Möglichkeit erhalten, einen Artikel mit einer Überschrift (cms:mod text), einem Teaser (cms:mod textarea), einem Bild (cms:mod image) und natürlich einem Textkörper (cms:mod wysiwyg2) zu versehen. Um die Funktionsweise von den CMS:MOD Tags besser zu verstehen, erstellen wir zunächst ein HTML-Gerüst mit Platzhaltern und ersetzen im nächsten Schritt die Platzhalter durch CMS:MOD Tags. __HTML-Gerüst:__

Headline

Teaser

artikel_bild

Artikelbeschreibung

Wir beginnen mir der Überschrift. Bei **cms:mod text** handelt es sich um ein einzeiliges Textfeld, also bestens geeignet für eine Überschrift. In der Frontendasgabe tragen Sie anstatt des Satzes folgenden Code ein:

**Parameter:** |**type = „text“**|Stellt ein einzeiliges Textfeld zur Verfügung.| |**id="1"**|Eindeutiger numerischer Wert, welcher diesem bestimmten Artikel zugeordnet wird.| | **menuoptions=„true“** | Parameter "menuoption" Regelt ob und wie für ein Element ein Bearbeitungsmenü angezeigt wird und hat 3 mögliche Werte (true: das Menü ist aktiviert und zeigt die Option 'bearbeiten' (Standard); false:das Menü wird deaktiviert; advanced: das Menü wird zusätzlich um die Optionen 'neu, löschen" und bei mehreren Elementen „nach oben“ „nach unten“ (verschieben) erweitert. in der Selectbox "Auswahlmöglichkeiten" ausgewählt werden und wird automatisch im Formularfeld "Kategorie" eingetragen. Alternativ können Sie im Feld "Kategorie" Ihre eigene Kategorie erstellen, z.B. "Meine Module", diese wird dann auch in die Selectbox übernommen und kann später benutzt werden. | |**title=„Headline“** | Der Titel wird bei der Bearbeitung des Inhalts als Überschrift des betroffenen Eingabeformulars ausgegeben. In unserem Fall erscheint, wie bereits oben erwähnt, beim Überfahren des Bearbeiten-Buttons mit der Maus ein kleines Fenster mit der Überschrift „Headline“. {{:handbuch:entwicklung:m6.jpg|}} | Mit einem Klick auf „bearbeiten“ im Fenster der Redakteur den title-Parameter bearbeiten. {{:handbuch:entwicklung:m7.jpg?600|}} **Beispiele für menuoptins:** Zum besseren Verständnis, was das Parameter "menuoptions" bewirkt, ein paar Beispiele __menuoptins = "true"__ {{:handbuch:entwicklung:m11.jpg|}} __menuoptions = "advanced" (mit einem Element):__ {{:handbuch:entwicklung:m9.jpg|}} __ menuoptions = "advanced" (mit mehrerern Elementen):__ {{:handbuch:entwicklung:m10.jpg|}} Durch **cms:mod textarea** lassen sich mehrzeilige Texte erstellen. Der Redakteur erhält also im Backend die Möglichkeit hier einen ein- oder mehrzeiligen Aufmacher einzutragen.

{{:handbuch:entwicklung:m12.jpg|}} Um ein Bild dem Artikel hinzuzufügen, wählen Sie das **cms:mod image** Tag: Der Redakteur hat nun im Backend die Möglichkeit, die vom CMS auf dem Webserver hinterlegten Bilddateien, zu durchsuchen und auszuwählen. {{:handbuch:entwicklung:m14.jpg?600|}} Mit dem **cms:mod wysywg2** Tag erstellen Sie dem Redakteur einen wysywig-Texteditor.

{{:handbuch:entwicklung:m15.jpg?600|}} **__Bemerkung:__** Obwohl alle Tags mit der id=”1” gekennzeichnet sind, führt das in unserem kleinen Artikelmodul zu keinen Problemen. Dies liegt daran, dass jeder CMS:tag-type (also z. B. image, text, textarea usw.) seinen eigenen id-Zähler besitzt. Diese sind voneinander unabhängig. Das Ergebnis könnte auf der Website nun wie folgt aussehen: {{:handbuch:entwicklung:m16.jpg|}} Man bemerke, dass alle vier Artikelelemente einen eigenen Bearbeiten-Button besitzen. Um den Redakteur die Arbeit zu erleichtern, empfiehlt es sich die Elemente des Moduls zu gruppieren, um diese über einen einzigen Bearbeiten- Button editieren zu können, dafür fügen wir das Tag **cms:mod typegroup** in die Frontendausgabe hinzu. __**Parameter:**__ |**elements="text[1], textarea[1],wysiwyg2[1], image[1]"** |Elemente, die gruppiert werden sollen. In unserem Fall: die Überschrift, der Teaser, der WYSYWIG-Editor und das Bild. | Bei allen anderen cms Tags setzen Sie „menuoptions“ auf „false“, dann werden die eigenen Bearbeiten-Buttons ausgeblendet. Stattdessen erscheint ein Button „Ganzen Artikel bearbeiten“ und der Redakteur kann nun alle Bereiche gleichzeitig bearbeiten. {{:handbuch:entwicklung:m17.jpg|}} In der Frontendausgabe des Moduls sollten nun alle Tags wie im folgenden Beispiel angegeben sein:

====== mip_forms ====== Sefrengo stellt dem Entwickler durch so genannte mip_forms (Modul Input Forms) ein Werkzeug zur Verfügung, mit dem er die Modulkonfiguration einfach und effizient gestalten kann. So lässt sich beispielsweise festlegen, dass innerhalb der Modulkonfiguration des Artikelmoduls bei den Einstellungen des WYSIWYG-Editor eine Checkbox-Liste mit den Schaltflächen erscheint, die der Entwickler dem Redakteur zur Verfügung stellt und bei denen er einfach nur Häkchen setzen muss. mip_forms können dann die Konfigurationswerte speichern und übermitteln sie der Frontendausgabe des Moduls, dort können sie z.B. als Variablen in die CMS:MOD Tags eingebettet. == mip-forms für das Artikelmodul konfigurieren == Zurück zu uneserem Artikelmodul. Wir möchten nun dem WYSIWYG-Editor des Artikelhaupttextes in seiner Funktion einschränken und dem Administrator dazu eine einfache Konfigurationsmöglichkeit bieten. Zunächst wollen in der Konfiguration unter dem Label 'WYSIWYG' ein Input-Textfeld definieren, in dem der Entwickler die Features, die der Editor haben soll, eintragen kann, z.B. 'align' (nur Textausrichtungsschaltflächen) oder 'italic' (nur Kursivschrift). Im Konfigurationsfeld der Modulbearbeitung erstellen Sie nun folgendes mip_form: {{:mod11.jpg|}} $mip_form['1']['cat'] = 'option'; $mip_form['1']['type'] = ''; $mip_form['1']['desc'] = 'Haupttexteditor einschränken:'; $mip_form['1']['cms_var'] = 'MOD_VAR[1]'; $mip_form['1']['cms_val'] = $cms_mod['value']['1']; $mip_form['1']['cms_val_default'] = ' '; $mip_form['1']['option_desc']['0'] = 'Schrägschrift'; $mip_form['1']['option_val']['0'] = 'italic'; $mip_form['1']['option_desc']['1'] = 'Ausrichtung'; $mip_form['1']['option_val']['1'] = 'align'; $mip_form['1']['option_desc']['2'] = 'Fetter text'; $mip_form['1']['option_val']['2'] = 'bold'; $mip_form['1']['size'] = '3'; **Erläterung:** Das erste Array (['1']) identifiziert dieses spezielle mip_form und alle Elemente, die dazu gehören. **Parameter** |**['cat']**|sagt aus, wie das Input-Feld für die Variablen, die an CMS:MOD Tags weitergegeben werden, aussehen soll. In unserem Beispiel handelt es sich um ein Optionsfeld (['cat'] = 'option'), welches hier drei Werten bzw. Bezeichner italic/Schrägschrift, align/Ausrichtung und bold/Fetter Text aufweist. Mit ['size']=3 wird ein mehrzeiliges Optionsfeld erstellt.| |**['desc']**|Die Beschriftung des Textfeldes (Label). Das hier eingetragene ('Haupttexteditor einschränken:') finden Sie also neben dem Optionsfeld wieder. | |**$mip_form['0']['cms_var']=$cms_mod['value']['1']; $mip_form['0']['cms_val']='MOD_VALUE[1]';**|Die Variablen, in denen den Wert gespeichern wird.| |**['option_desc']**|Name des Wertes | |**['option_val']**|Wert| |**['size']=3**|Größe des Feldes. Ein mehrzeiliges Optionsfeld der Größe 3 wird erstellt. | Um nun die Konfigurationsvariablen auch in die CMS:MOD Tags zu übertragen, wird in den CMS:MOD Tags die Variable mit dem Array „MOD_VALUE[]“ aufgegriffen. Ändern Sie den cms Tag des Hauptartikeltextes in der Frontendausgabe wie folgt ab:

Die Auswahl für den Entwickler sollte nun wie folgt aussehen: Damit das Konfigurationsfeld auch ausgegeben wird, benötigen Sie am Ende noch folgenden Code: mip_formsp($mip_form['1']); mip_formsp($mip_form['2']); unset($mip_form); Mit mip_formsp wird das Feld „gedruckt“ (p für print). Um Konflikte mit anderen mip_forms zu vermeiden müssen Sie am Ende den Speicher wieder leeren und mit unset() die Variableninstanz zerstören. In dem Konfigutationsfenster haben wir also den folgenden Code stehen: $mip_form['1']['cms_var'] = 'MOD_VAR[1]'; $mip_form['1']['cms_val'] = $cms_mod['value']['1']; $mip_form['1']['cms_val_default'] = ' '; $mip_form['1']['option_desc']['0'] = 'Schrägschrift'; $mip_form['1']['option_val']['0'] = 'italic'; $mip_form['1']['option_desc']['1'] = 'Ausrichtung'; $mip_form['1']['option_val']['1'] = 'align'; $mip_form['1']['option_desc']['2'] = 'Fetter text'; $mip_form['1']['option_val']['2'] = 'bold'; $mip_form['1']['size'] = '3'; $mip_form['2']['cat'] = 'txt'; $mip_form['2']['type'] = ''; $mip_form['2']['desc'] = 'Überschrift Haupttext'; $mip_form['2']['cms_var'] = 'MOD_VAR[2]'; $mip_form['2']['cms_val'] = $cms_mod['value']['2']; $mip_form['2']['cms_val_default'] = 'Standardwert für den Titel des Haupttextes'; mip_formsp($mip_form['1']); mip_formsp($mip_form['2']); unset($mip_form); In dem Frontendausgabe Fenster müssen Sie nach der Änderung folgenden Code stehen haben:

== Referenz== Neben einzeiligen Textfeldern und Optionsfeldern stehen bei Sefrengo selbstverständlich auch andere mip_forms zur Verfügung wie Radiobuttons, Checkboxen, Drop-Down-Select-Felder und Textareas, so dass Sie die Konfiguration in der Weise anlegen können, wie Sie es für Ihr Modul am sinnvollsten erachten. In der Referenz zu [[:referenz:mipforms|mip-forms]] finden Sie sämtliche Hinweise und Parameter sowie Beispiele. ====== PHP in Modulen ====== Wie wir in unserem Beispiel gesehen haben, kann man mit CMS:MOD Tags nur "einfache" Module erstellen. Mit Hilfe von PHP kann man auf CMS:MOD Tags zugreifen und diese um x-beliebige Funktionen erweitern. Von einem einfachen Submitbutton bis zum Durchsuchen und Auswerten einer großen Datenbank ist alles möglich. All dieses lässt sich mit PHP programmieren. PHP bietet eine grosse Anzahl an Befehlen und Funktionen, die Sie in Ihre Website integrieren können, um dadurch die Funktionalität Ihrer Website zu steigern und diese atraktiver für den Besucher zu machen. In diesem Abschnitt wird erklärt, wie man mit PHP auf die CMS:MOD Tags zuzugreifen kann. Dafür bietet Sefrengo zwei Arten von PHP Tags: (normales PHP) und (gecachtes PHP) ===== Gecachtes und ungecachtes PHP ===== Sefrengo stellt zwei PHP-Tags zur Verfügung: : normales PHP, welches bei jedem Seitenaufruf ausgeführt wird und : gecachtes PHP wird nur einmal im Frontend generiert. Die Ausgabe des Skriptes wird zwischengespeichert um Ressourcen zu sparen. Der Cache bleibt so lange erhalten, bis die betreffende Seite geändert wird (z.B. wenn ein Redakteur einen ändert) oder der Cache per gelöscht wird. **Bemerkung:** Ein normaler Aufruf in Sefrengo wird als zu cachendes PHP angesehen. Um wirklich ein „dynamisches“ Skript zu erstellen, müssen unbedingt die Tags und benutzt werden. ** Beispiel:** Fügen Sie in das Konfigurationsfenster folegende Codes ein: echo time(); echo time(); Im Frontend wird man erkennen, dass die CMSPHP:CACHE nur das erste mal generiert wird und sich dann nicht mehr ändert. Die CMSPHP Zeit wird sich immer weiter ändern. Im Backend ist der Unterschied von gecachten und ungecachten PHP nicht erkennbar. Da dort grundsätzlich jede Seite neu erzeugt wird. ===== Mit PHP auf die CMS:tags zugreifen ===== **Bemerkung:** In diesem Kapitel wird mit CMSPHP:CACHE (gecachtes PHP) gearbeitet. Wie man auf CMS:Tags innerhalb von ungecachten PHP zugreifen kann, wird im nächsten Abschnitt erklärt. Um mit PHP auf die CMS:tags zuzugreifen, müssen Inhalte dieser CMS:tags in einem 1-dimensionalen Array gespeichert werden. Wir gehen zurück zu unserem Modul und speichern die Modul-Tags in einem 1-dimensionalen Array $mod[]. $mod['title']=; $mod['teaser']=; $mod['image']=; $mod['wysiwyg']=; $mod['editbutton']=; **Erklärung:** **addslashes ("Zeichenkette")** Mit der Funktion addslashes werden die Zeichen ', ", \, und NUL (0-Byte) mit einem Schrägstrich (\, Backslash) versehen. Dies ist vor allem für Datenbankabfragen wichtig, da diese Zeichen dabei eine besondere Bedeutung haben. Der String (str) wird danach modifiziert zurückgegeben. Standardmässig ausgeschaltet (false). Soll das Contentfeld in PHP weiterverarbeitet werden, ist dieser Parameter zu setzen (true). Bis jetzt haben wir ein festes HTML-Gerüst erstellt, bei dem die Reihenfolge der Elemente, festgelegt ist. Damit es möglich wird auch das HTML-Gerüst variabel konfigurieren zu können, brauchen wir ein neues mip_form. Wir nennen es "Template". $mip_form['3']['cat'] = 'txtarea'; $mip_form['3']['rows'] = ''; $mip_form['3']['type'] = 'long'; $mip_form['3']['desc'] = 'Template'; $mip_form['3']['cms_var'] = 'MOD_VAR[3]'; $mip_form['3']['cms_val'] = $cms_mod['value']['3']; $mip_form['3']['cms_val_default'] = '

{title}{editbutton}

{teaser}

{image}

{wysiwyg}

'; $mip_form['3']['tab'] = '0';
In der Frontendausgabe speichern wir nun das Element im Array $mod[]. $mod['tpl']=$cms_mod['value']['3']; **Erklärung:** Die Variable $mod['tpl'] speichert die Values aus der $mip_form['3']. Für die Ausgabe des Moduls brauchen wir die PHP-Funktion str_replace ($search, $replace, $subject). Diese Funktion mach es möglich, mehrere Suchbegriffe und mehrere Ersetzungen auf mehrere Strings auszuführen. Da wir nun ein Array mit dem String an die PHP Funktion str_replace übergeben, erhalten wir auch ein Array zurück, in dem alle Vorkommen von $search innerhalb von $subject durch den angegebenen $replace-Wert ersetzt wurden. $mod['final']= str_replace(array('{title}', '{teaser}', '{image}', '{editbutton}', '{wysiwyg}'), array($mod['title'], $mod['teaser'], $mod['image'], $mod['editbutton'], $mod['wysiwyg']), $mod['tpl']); **Erklärung** Die Werte aus unserem $mip_form['3'] werden durch die Array-Variablen $mod[] ersetzt. Das Array muss nur noch ausgegeben werden. echo $mod['final']; Im Konfigurationsfenster steht jetzt {title}{editbutton}

{teaser}

{image}

{wysiwyg}

'; $mip_form['3']['tab'] = '0'; mip_formsp($mip_form['1']); mip_formsp($mip_form['2']); mip_formsp($mip_form['3']); unset($mip_form); ?>
Und im Frontendausgabefenster $mod['title']=; $mod['teaser']=; $mod['image']=; $mod['wysiwyg']=; $mod['editbutton']=; $mod['tpl']=$cms_mod['value']['3']; $mod['final']= str_replace(array('{title}', '{teaser}', '{image}', '{editbutton}', '{wysiwyg}'), array($mod['title'], $mod['teaser'], $mod['image'], $mod['editbutton'], $mod['wysiwyg']), $mod['tpl']); ===== Auf CMS:Tags innerhalb von ungecachten PHP zugreifen ===== Der Zugriff auf CMS:Tags sind nur im gecachtem PHP (CMSPHP:CACHE) möglich. Wird versucht, auf die CMS:Tags innerhalb ungecachten PHP zuzugreifen, gibt es im einfachsten Fall einfach keine Ausgabe, im kritischtem Fall treten PHP Fehler auf und das Skript wird abgebrochen. Warum dies so problematisch ist, ist kurz erklärt. Beim ersten Skriptaufruf wird die Seite in den Cache geschrieben: Dort sind die Funktionen, die von den CMS:tags benötigt werden noch vorhanden. Kommt die Seite aus dem Cache sind die Funktionen nicht mehr da und es gibt einen PHP Fehler. Die Lösung ist ebenfalls recht einfach. Man muss einfach nur die CMS:tags innerhalb von gecachten PHP abgreifen. Danach muss das gecachte PHP in das ungecachte rübergerettet werden. //Alle Variablen, die nur innerhalb des gecachten PHPs sichtbar sind, auch für dynamisches PHP zur Verfügung stellen //Auf cms:tags kann nur innerhalb von gecachten PHP zugegriffen werden $elements['wysiwyg2:1'] = ; $elements['wysiwyg2:2'] = ; //innerhalb von gecachten PHP wird ein Tag erzeugt. Darin wiederum werden die CMS:tag //Variablen ausgegeben. echo ''; if (is_array($elements)) { foreach($elements AS $k => $v){ echo '$mvars["'.$k.'"] = "'. addslashes($v) .'";'."\n"; }} echo ''; //Die CMS:tag Variablen wurden in dynamisches PHP getette und können nun ausgegeben werden. echo $mvars['wysiwyg2:1']; echo '
'; echo $mvars['wysiwyg2:2'];
Soweit die Langform, zerlegen wir nun den oberen Code in noch verständlichere Häppchen und schauen, wie das Ganze in "Zeitlupe" funktioniert. Innerhalb von Sefrengo wird PHP immer 2 mal ausgeführt. Zuerst wird das ausgeführt. Die daraus resultierende Ausgabe wandert in den Cache. Der untere Teil des oberes Beispiel sieht dann nach der ersten Ausführung im Cache so aus: $mvars["wysiwyg2:1"] = "Inhalt von dem, was der Redakteur im wysiwyg2:1 eingegeben hat."; $mvars["wysiwyg2:2"] = "Inhalt von dem, was der Redakteur im wysiwyg2:2 eingegeben hat."; echo $mvars['wysiwyg2:1']; echo '
'; echo $mvars['wysiwyg2:2'];
Sobald die Inhalte dann bei einem Seitenaufruf aus dem Cache entnommen werden, wird Teil ausgeführt und die Ausgabe im Frontend sieht dann folgendermaßen aus: Inhalt von dem, was der Redakteur im wysiwyg2:1 eingegeben hat.
Inhalt von dem, was der Redakteur im wysiwyg2:2 eingegeben hat.
Hier noch eine Variante um auf die Modul-Konfiguration zuzugreifen: //Alle Variablen, die nur innerhalb des gecachten PHPs sichtbar sind, auch für dynamisches PHP zur Verfügung stellen echo ''; if (is_array($cms_mod['value'])) { foreach($cms_mod['value'] AS $k => $v){ echo '$mvars["'.$k.'"] = "'. addslashes($v) .'";'."\n"; }} echo ''; ===== Module in externen Dateien entwickeln ===== Bei aufwendigen Modulen mit viel Quellcode empfiehlt es sich, Module in externen Dateien zu entwickeln. So kann man viel leichter nach eventuellen Fehlern im Code suchen. Es würde sich zB. als sehr schwierig erweisen, im Frontendausgabefenster nach dem Fehler in Zeile 205 zu suchen. In einem externen PHP-Editor wäre es dagegen kein Problem. Die externen Dateien können mit dem include - Befehl eingebunden werden. Um die externe Datei zu includieren, gehen Sie folgendermaßen vor: Als erstes erstellen Sie eine externe PHP-Datei (z.B modul.php)und speichern diese im Ordner projekt01. Der Code dazu sieht so aus include $cfg_client['path']."modul.php"; Im nächsten Schritt defenieren wir eine boolsche Variable $is_dev und setzen diese auf true. $is_dev = true; In einer if-else Abfrage überpüfen wir, ob die Variable $is_dev "true" oder "false" ist. if($is_dev) { include $cfg_client['path']."modul.php"; } else { $mod['final']= str_replace(array('{teaser}', '{title}', '{image}', '{editbutton}', '{wysiwyg}'), array( $mod['teaser'], $mod['title'], $mod['image'], $mod['editbutton'], $mod['wysiwyg']), $mod['tpl']); echo $mod['final']; } **Erklärung** Ist die Variable auf true gesetzt, wird die externe PHP-Datei eingebunden, ist diese auf "false" gesetzt, wird der Code ausgeführt, der in der else-Bedingung im Konfigurationsfenster stehet. Im Konfigurationsfenster müsste jetzt folgender Code stehen. $is_dev=true; $mod['title']=; $mod['teaser']=; $mod['image']=; $mod['wysiwyg']=; $mod['editbutton']=; if($is_dev) { include_once $cfg_client['path']."modul.php"; } else { $mod['final']= str_replace(array('{teaser}', '{title}', '{image}', '{editbutton}', '{wysiwyg}'), array( $mod['teaser'], $mod['title'], $mod['image'], $mod['editbutton'], $mod['wysiwyg']), $mod['tpl']); echo $mod['final']; } $mod=null; ====== Erweiterte Modulkonfiguration ====== ==== Tabs ==== Unser Artikelmodul hat nur wenige Konfigurationsmöglichkeiten. Bei komplexen Modulen empfiehlt es sich übersichtlichkeitshalber, die einzelnen Modulkonfigurationen zu gruppieren und für jede Gruppe einen Tab zu erstellen. Die einzelnen Tabs müssen von einem "mip_forms_tabpane_beginp" und "mip_forms_tabpane_endp" umschlossen sein. Der gesamte Inhalt einer Tab-Seite muss von 'mip_forms_tabitem_beginp' und 'mip_forms_tabitem_endp' umschlossen sein. Dabei reicht es aus, dass die mip_formsp umschlossen sind, die Konfiguration selber muss nicht umschlossen sein. Für das Artikelmodul erstellen wir 2 Tabs: den Tab "Einstellungen" und den Tab "Template". mip_forms_tabpane_beginp(); mip_forms_tabitem_beginp('Einstellungen'); mip_formsp($mip_form[1]); mip_formsp($mip_form[2]); mip_forms_tabitem_endp(); mip_forms_tabitem_beginp('Templare'); mip_formsp($mip_form[3]); mip_forms_tabitem_endp(); mip_forms_tabpane_endp(); In der Modulkonfiguration haben wir jetzt 2 Tabs: {{:handbuch:entwicklung:tabs1.jpg|}} {{:handbuch:entwicklung:tabs2.jpg|}} ====== Hinweise ====== Im WIKI unter [[:howto/:eigene-module-schreiben|eigene-module-schreiben]] finden Sie ein weiteres Beispiel für die Modulerstellung. ====== Erweiterung des Moduls um eine Setuproutine ====== FIXME Folgende Themen sollen in diesem Abschnitt behandelt werden: * Erklärung der SQL Setup, Update, Delete Routine * [[profil>1|Björn Brockmann]]