WebsiteBuilder: Unterschied zwischen den Versionen
Aus Contao Community Documentation
Tril (Diskussion | Beiträge) (→Vererbung und abstrakte Datenzeilen) |
Tril (Diskussion | Beiträge) (→Abhängigkeiten) |
||
(3 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
− | Der WebsiteBuilder ist ein XML | + | Der WebsiteBuilder ist ein XML-konfigurierbarer Datensatzgenerator. In der XML werden ''@datasets@'' konfiguriert, die aus Variablen, Datenzeilen und Dateien bestehen können. |
{{ExtInfo | {{ExtInfo | ||
| Dev=Tristan Lins ([[User:tril|tril]]) | | Dev=Tristan Lins ([[User:tril|tril]]) | ||
Zeile 11: | Zeile 11: | ||
[[en:WebsiteBuilder]] | [[en:WebsiteBuilder]] | ||
[[Kategorie:Extensions]] | [[Kategorie:Extensions]] | ||
− | |||
− | |||
− | |||
− | |||
− | |||
=Die XML Konfiguration= | =Die XML Konfiguration= | ||
− | Die XML Dateien können sowohl lokal, als auch von extern (http://-URLs) bezogen werden. Es ist möglich mehrere @datasets@ in einer XML einzutragen, der WebsiteBuilder ist aber in der Lage, mehrere XML Dateien zu laden. Konfiguriert werden diese über die Systemeinstellungen, dort werden die Pfade zu den XML Dateien eingetragen. | + | Die XML Dateien können sowohl lokal, als auch von extern (<nowiki>http://-URLs</nowiki>) bezogen werden. Es ist möglich, mehrere ''@datasets@'' in einer XML einzutragen, der WebsiteBuilder ist aber in der Lage, mehrere XML Dateien zu laden. Konfiguriert werden diese über die Systemeinstellungen, dort werden die Pfade zu den XML Dateien eingetragen. |
− | Eine Beispiel XML zum | + | Eine Beispiel XML zum Erstellen eines Nachrichtenarchives, der notwendigen Module und einer Teaser-, Archiv- und Leser-Seite befindet sich im Anhang. |
=Variablen= | =Variablen= | ||
Zeile 51: | Zeile 46: | ||
==Variablen einbinden== | ==Variablen einbinden== | ||
− | Variablen können bei jedem Feld-Wert genutzt werden | + | Variablen können bei jedem Feld-Wert genutzt werden. Es gibt zwei Syntaxe zum Abfragen einer Variable: |
<source lang="xml"> | <source lang="xml"> | ||
<wb:field name="title">$news_archive_title</wb:field> | <wb:field name="title">$news_archive_title</wb:field> | ||
Zeile 62: | Zeile 57: | ||
==Variablen durch Funktionen modifizieren== | ==Variablen durch Funktionen modifizieren== | ||
− | Variablen können durch Funktionen modifiziert werden. Objekt-Methoden werden nicht unterstützt! | + | Variablen können durch Funktionen modifiziert werden. Objekt-Methoden werden nicht unterstützt!<br /> |
Dazu muss nach Smarty Manier einfach mit | (Pipe) getrennt die Filterfunktion angefügt werden: | Dazu muss nach Smarty Manier einfach mit | (Pipe) getrennt die Filterfunktion angefügt werden: | ||
<source lang="xml"> | <source lang="xml"> | ||
Zeile 84: | Zeile 79: | ||
</source> | </source> | ||
− | Um das Feld | + | Um das Feld ''id'' abzufragen, ist eine absolute Referenzierung nicht notwendig. Variablen werden immer auf einen primitiven Typ aufgelöst. Sollte der Wert einem Array oder Objekt entsprechen, wird der Wert ''id'' abgefragt, d.h. die folgenden Ausdrücke sind equivalent: |
<source lang="xml"> | <source lang="xml"> | ||
<wb:field name="user">$this.User</wb:field> | <wb:field name="user">$this.User</wb:field> | ||
Zeile 100: | Zeile 95: | ||
=Datenzeilen= | =Datenzeilen= | ||
− | Daten-Zeilen entsprechen einzelnen Datensätzen in der | + | Daten-Zeilen entsprechen einzelnen Datensätzen in der Datenbank. Angegeben werden muss die Tabelle und mehrere zu setzende Felder. Dabei muss der Entwickler des ''@datasets@'' über die Datenbankstruktur bescheid wissen, da die Daten "einfach" in die Datenbank geschrieben werden. Außerdem ist es möglich, Kind-Daten-Zeilen zu definieren, bei denen automatisch die ''@pid@'' gesetzt wird. |
<source lang="xml"> | <source lang="xml"> | ||
Zeile 125: | Zeile 120: | ||
==Vererbung und abstrakte Datensätze und Platzhalter== | ==Vererbung und abstrakte Datensätze und Platzhalter== | ||
− | Ab Version 1.1 lassen sich Datensätze mit dem Attribut abstract als | + | Ab Version 1.1 lassen sich Datensätze mit dem Attribut ''abstract'' als abstrakt definieren, sie werden dann nicht mehr in der Auswahlliste angezeigt. Man kann aber abstrakte Datensätze mit ''extends'' erweitern. Hinzu kommen Platzhalter, die in diesem Zusammenhang verwendet werden können. |
<source lang="xml"> | <source lang="xml"> | ||
Zeile 131: | Zeile 126: | ||
<wb:row table="tl_page"> | <wb:row table="tl_page"> | ||
<wb:placeholder name="page" /> | <wb:placeholder name="page" /> | ||
+ | </wb:row> | ||
+ | <wb:row table="tl_page"> | ||
+ | <wb:field name="title">Abstrakter Datensatz</wb:field> | ||
</wb:row> | </wb:row> | ||
</wb:dataset> | </wb:dataset> | ||
</source> | </source> | ||
− | Damit | + | Damit hat man einen primitiven abstrakten Datensatz, und hier der erweiternde: |
<source lang="xml"> | <source lang="xml"> | ||
<wb:dataset extends="mein-datenset"> | <wb:dataset extends="mein-datenset"> | ||
<wb:data place="page"> | <wb:data place="page"> | ||
− | <wb:field name="title"> | + | <wb:field name="title">Platzhalter</wb:field> |
</wb:data> | </wb:data> | ||
+ | <wb:row table="tl_page"> | ||
+ | <wb:field name="title">Erweiternder Datensatz</wb:field> | ||
+ | </wb:row> | ||
</wb:dataset> | </wb:dataset> | ||
</source> | </source> | ||
− | Da Platzhalter nicht zwangsläufig definiert sein müssen, müssen Datensätze auch nicht zwangsläufig als abstrakt definiert werden, wenn | + | Intern werden die Datensätze "vermischt"; beim Erweitern entsteht systemintern also ein neuer Datensatz: |
+ | |||
+ | <source lang="xml"> | ||
+ | <wb:dataset> | ||
+ | <wb:data place="page"> | ||
+ | <wb:field name="title">Platzhalter</wb:field> | ||
+ | </wb:data> | ||
+ | <wb:row table="tl_page"> | ||
+ | <wb:field name="title">Erweiternder Datensatz</wb:field> | ||
+ | </wb:row> | ||
+ | <wb:row table="tl_page"> | ||
+ | <wb:placeholder name="page" /> | ||
+ | </wb:row> | ||
+ | <wb:row table="tl_page"> | ||
+ | <wb:field name="title">Abstrakter Datensatz</wb:field> | ||
+ | </wb:row> | ||
+ | </wb:dataset> | ||
+ | </source> | ||
+ | |||
+ | Wichtig zu wissen ist auch, dass der erweiternde Datensatz immer zuerst kommt. Das hat einerseits für die Datenzeilen einen Einfluss auf ihre Reihenfolge, aber auch für die Datendefinitionen wb:data. Jedoch muss man wissen, dass wb:data von der ersten zur letzten verarbeitet wird. D.h. nicht die letzte wb:data ist höher priorisiert, sondern die erste! Bei zwei wb:data Element mit gleichem Platznamen ist also immer die ausschlaggebend, die zuerst kommt! | ||
+ | |||
+ | Da Platzhalter nicht zwangsläufig definiert sein müssen, müssen Datensätze auch nicht zwangsläufig als abstrakt definiert werden, wenn sie selbst den Platzhalter nicht belegen. | ||
==Spezialfälle für wb:field== | ==Spezialfälle für wb:field== | ||
Zeile 151: | Zeile 173: | ||
Wenn der Wert für das Feld ein Array ist, wird dieses automatisch serialisiert. | Wenn der Wert für das Feld ein Array ist, wird dieses automatisch serialisiert. | ||
− | Wird ein DCA zu der Tabelle und dem Feld gefunden, wird dessen @default@ Wert übernommen. | + | Wird ein DCA zu der Tabelle und dem Feld gefunden, wird dessen ''@default@'' Wert übernommen. |
===eval=== | ===eval=== | ||
<source lang="xml"><wb:field eval="true" /></source> | <source lang="xml"><wb:field eval="true" /></source> | ||
− | Der Wert wird als PHP Code ausgewertet und einer Zielvariable zugewiesen, es kann also nur begrenzt Logik untegebracht werden. Diese Auswertung ist vorwiegend dazu gedacht, | + | Der Wert wird als PHP Code ausgewertet und einer Zielvariable zugewiesen, es kann also nur begrenzt Logik untegebracht werden. Diese Auswertung ist vorwiegend dazu gedacht, Arrays aufzubauen z.B. |
<source lang="xml"><wb:field name="groups" eval="true">array('1')</wb:field></source> | <source lang="xml"><wb:field name="groups" eval="true">array('1')</wb:field></source> | ||
Daraus wird folgender PHP Code ausgewertet: | Daraus wird folgender PHP Code ausgewertet: | ||
Zeile 162: | Zeile 184: | ||
===eval-user=== | ===eval-user=== | ||
<source lang="xml"><wb:field eval-user="true" /></source> | <source lang="xml"><wb:field eval-user="true" /></source> | ||
− | Der Wert wird als PHP Code ausgewertet, anders als eval="true" muss die Zielvariable vom Code zugewiesen werden. Dies ist für | + | Der Wert wird als PHP Code ausgewertet, anders als eval="true" muss die Zielvariable vom Code zugewiesen werden. Dies ist für komplexe Logik interessant. |
<source lang="xml"><wb:field name="groups" eval-user="true" novar="true"> | <source lang="xml"><wb:field name="groups" eval-user="true" novar="true"> | ||
$varEvaluatedValue = array(); | $varEvaluatedValue = array(); | ||
Zeile 174: | Zeile 196: | ||
} | } | ||
</wb:field></source> | </wb:field></source> | ||
− | Wie man sieht wird die Variable $varEvaluatedValue im PHP Code zugewiesen | + | Wie man sieht, wird die Variable ''$varEvaluatedValue'' im PHP Code zugewiesen. Dies muss unbedingt geschehen, sonst wird die Auswertung des PHP Code als fehlerhaft angesehen! |
===force-array=== | ===force-array=== |
Aktuelle Version vom 2. April 2013, 06:28 Uhr
Der WebsiteBuilder ist ein XML-konfigurierbarer Datensatzgenerator. In der XML werden @datasets@ konfiguriert, die aus Variablen, Datenzeilen und Dateien bestehen können.
Erweiterungs-Übersicht | |
---|---|
Name des Entwicklers | Tristan Lins (tril) |
Entwickler Webseite | http://dev.typolight-forge.org/projects/show/websitebuilder |
Version der Erweiterung | 1.0 |
Kompatibilität mit Contao Version | 2.9.0 - 2.9.1 |
Link zum Extension Repository | http://www.contao.org/erweiterungsliste/view/WebsiteBuilder.de.html |
Link zum Tracker | http://dev.typolight-forge.org/projects/websitebuilder/issues |
Abhängig von ff. Erweiterungen | 3CFramework, DC_Memory |
Inhaltsverzeichnis
Die XML Konfiguration
Die XML Dateien können sowohl lokal, als auch von extern (http://-URLs) bezogen werden. Es ist möglich, mehrere @datasets@ in einer XML einzutragen, der WebsiteBuilder ist aber in der Lage, mehrere XML Dateien zu laden. Konfiguriert werden diese über die Systemeinstellungen, dort werden die Pfade zu den XML Dateien eingetragen.
Eine Beispiel XML zum Erstellen eines Nachrichtenarchives, der notwendigen Module und einer Teaser-, Archiv- und Leser-Seite befindet sich im Anhang.
Variablen
Es können mehrere Variablen festgelegt werden, die vom Benutzer beim Einspielen der Datensätze eingegeben werden können. Außerdem können auch einzelne Daten-Zeilen als Runtime-Variablen festgelegt werden und so zwischen den einzelnen Daten-Zeilen referenziert werden. Die Konfiguration entspricht in weiten Teilen einer DCA-Feld-Konfiguration:
<wb:variable name="root_page"> <wb:label>Basisseite</wb:label> <wb:description>Die Basisseite, in der die neuen Seiten eingefügt werden.</wb:description> <wb:inputType>pageTree</wb:inputType> <wb:eval> <wb:fieldType>radio</wb:fieldType> </wb:eval> </wb:variable> <wb:variable name="theme"> <wb:label>Theme</wb:label> <wb:description>Das Theme, dem die Module hinzugefügt werden sollen.</wb:description> <wb:inputType>select</wb:inputType> <wb:foreignKey>tl_theme.name</wb:foreignKey> </wb:variable> <wb:variable name="news_archive_title"> <wb:label>Nachrichtenarchiv</wb:label> <wb:description>Der Name des Nachrichtenarchiv.</wb:description> </wb:variable>
Variablen einbinden
Variablen können bei jedem Feld-Wert genutzt werden. Es gibt zwei Syntaxe zum Abfragen einer Variable:
<wb:field name="title">$news_archive_title</wb:field>
Alternativ kann der Variablenschlüssel auch in geschweifte Klammern gepackt werden:
<wb:field name="title">${news_archive_title}</wb:field>
Variablen durch Funktionen modifizieren
Variablen können durch Funktionen modifiziert werden. Objekt-Methoden werden nicht unterstützt!
Dazu muss nach Smarty Manier einfach mit | (Pipe) getrennt die Filterfunktion angefügt werden:
<wb:field name="title">$news_archive_title|strtoupper</wb:field>
Oder mit geschweiften Klammern:
<wb:field name="title">${news_archive_title|strtoupper}</wb:field>
Jede PHP Funktion (strtoupper, intval, ucwords) oder benutzerdefinierte Funktion (z.B. standardize, deserialize) kann angewendet werden.
Komplexe Variablen, Zugriff auf Array Felder und Objekt Eigenschaften
Wird eine Datenzeile oder ein Objekt verwendet, kann ebenfalls mit zwei unterschiedlichen Varianten auf Felder zugegriffen werden.
<wb:field name="user">$this.User.id</wb:field>
Alternativ mit PHP Objektnotation:
<wb:field name="user">$this->User->id</wb:field>
Um das Feld id abzufragen, ist eine absolute Referenzierung nicht notwendig. Variablen werden immer auf einen primitiven Typ aufgelöst. Sollte der Wert einem Array oder Objekt entsprechen, wird der Wert id abgefragt, d.h. die folgenden Ausdrücke sind equivalent:
<wb:field name="user">$this.User</wb:field> <wb:field name="user">$this->User</wb:field> <wb:field name="user">$this.User.id</wb:field> <wb:field name="user">$this->User->id</wb:field>
Spezielle Variablen
Die Variable $this ist das BackendModul, worüber sich z.B. der Backend Benutzer abfragen lässt.
Die Systemeinstellungen $GLOBALS['TL_CONFIG'] sind ebenfalls immer als Variablen verfügbar, z.B. ist $GLOBALS['TL_CONFIG']['uploadPath'] mit der Variable $uploadPath verfügbar.
Datenzeilen
Daten-Zeilen entsprechen einzelnen Datensätzen in der Datenbank. Angegeben werden muss die Tabelle und mehrere zu setzende Felder. Dabei muss der Entwickler des @datasets@ über die Datenbankstruktur bescheid wissen, da die Daten "einfach" in die Datenbank geschrieben werden. Außerdem ist es möglich, Kind-Daten-Zeilen zu definieren, bei denen automatisch die @pid@ gesetzt wird.
<wb:row table="tl_page" var="page_listing"> <wb:field name="pid">$root_page</wb:field> <wb:field name="title">$news_archive_title</wb:field> <wb:field name="type">regular</wb:field> <wb:field name="language" inherit="true" /> <wb:field name="published">1</wb:field> <!-- Artikel --> <wb:child table="tl_article"> <wb:field name="title">$news_archive_title</wb:field> <wb:field name="inColumn">main</wb:field> <wb:field name="published">1</wb:field> <!-- Inhaltselement --> <wb:child table="tl_content"> <wb:field name="type">module</wb:field> <wb:field name="module">$module_teaser.id</wb:field> </wb:child> </wb:child> </wb:row>
Vererbung und abstrakte Datensätze und Platzhalter
Ab Version 1.1 lassen sich Datensätze mit dem Attribut abstract als abstrakt definieren, sie werden dann nicht mehr in der Auswahlliste angezeigt. Man kann aber abstrakte Datensätze mit extends erweitern. Hinzu kommen Platzhalter, die in diesem Zusammenhang verwendet werden können.
<wb:dataset id="mein-datenset" abstract="true"> <wb:row table="tl_page"> <wb:placeholder name="page" /> </wb:row> <wb:row table="tl_page"> <wb:field name="title">Abstrakter Datensatz</wb:field> </wb:row> </wb:dataset>
Damit hat man einen primitiven abstrakten Datensatz, und hier der erweiternde:
<wb:dataset extends="mein-datenset"> <wb:data place="page"> <wb:field name="title">Platzhalter</wb:field> </wb:data> <wb:row table="tl_page"> <wb:field name="title">Erweiternder Datensatz</wb:field> </wb:row> </wb:dataset>
Intern werden die Datensätze "vermischt"; beim Erweitern entsteht systemintern also ein neuer Datensatz:
<wb:dataset> <wb:data place="page"> <wb:field name="title">Platzhalter</wb:field> </wb:data> <wb:row table="tl_page"> <wb:field name="title">Erweiternder Datensatz</wb:field> </wb:row> <wb:row table="tl_page"> <wb:placeholder name="page" /> </wb:row> <wb:row table="tl_page"> <wb:field name="title">Abstrakter Datensatz</wb:field> </wb:row> </wb:dataset>
Wichtig zu wissen ist auch, dass der erweiternde Datensatz immer zuerst kommt. Das hat einerseits für die Datenzeilen einen Einfluss auf ihre Reihenfolge, aber auch für die Datendefinitionen wb:data. Jedoch muss man wissen, dass wb:data von der ersten zur letzten verarbeitet wird. D.h. nicht die letzte wb:data ist höher priorisiert, sondern die erste! Bei zwei wb:data Element mit gleichem Platznamen ist also immer die ausschlaggebend, die zuerst kommt!
Da Platzhalter nicht zwangsläufig definiert sein müssen, müssen Datensätze auch nicht zwangsläufig als abstrakt definiert werden, wenn sie selbst den Platzhalter nicht belegen.
Spezialfälle für wb:field
Wenn der Wert für das Feld ein Array ist, wird dieses automatisch serialisiert.
Wird ein DCA zu der Tabelle und dem Feld gefunden, wird dessen @default@ Wert übernommen.
eval
<wb:field eval="true" />
Der Wert wird als PHP Code ausgewertet und einer Zielvariable zugewiesen, es kann also nur begrenzt Logik untegebracht werden. Diese Auswertung ist vorwiegend dazu gedacht, Arrays aufzubauen z.B.
<wb:field name="groups" eval="true">array('1')</wb:field>
Daraus wird folgender PHP Code ausgewertet:
$varEvaluatedValue = array('1');
eval-user
<wb:field eval-user="true" />
Der Wert wird als PHP Code ausgewertet, anders als eval="true" muss die Zielvariable vom Code zugewiesen werden. Dies ist für komplexe Logik interessant.
<wb:field name="groups" eval-user="true" novar="true"> $varEvaluatedValue = array(); $objGroup = $this->Database->execute("SELECT * FROM tl_member_group"); while ($objGroup->next()) { if (!$objGroup->disable) { $varEvaluatedValue[] = $objGroup->id; } } </wb:field>
Wie man sieht, wird die Variable $varEvaluatedValue im PHP Code zugewiesen. Dies muss unbedingt geschehen, sonst wird die Auswertung des PHP Code als fehlerhaft angesehen!
force-array
<wb:field force-array="true" />
Der Wert wird in ein Array umgewandelt und serialisiert, z.B. @<wb:field name="groups" force-array="true">1</wb:field>@
inherit
<wb:field inherit="true" />
Der Wert wird vom Elterndatensatz innerhalb der gleichen Tabelle geerbt, z.B. @<wb:field name="language" inherit="true" />@
novar
<wb:field novar="true" />
Auf dem Feld werden keine Variablen ausgewertet, z.B. in Verbindung mit eval oder eval-user oft notwendig.
Dateihandling
Außerdem ist es möglich, Verzeichnisse und Dateien zu erstellen und externe Dateien zu laden und wenn es sich um ZIP Archive handelt, diese im Zielverzeichnis zu entpacken (das Archiv wird danach wieder gelöscht).
<wb:mkdir>$uploadPath/Neues Verzeichnis</wb:mkdir> <wb:mkfile>$uploadPath/Neues Verzeichnis/Leere Datei.txt</wb:mkdir> <wb:load target="$uploadPath/Neues Verzeichnis" unzip="true">http://www.example.com/mydata.zip</wb:load>