WebsiteBuilder: Unterschied zwischen den Versionen

Aus Contao Community Documentation

(Vererbung und abstrakte Datensätze und Platzhalter)
K (div. Korrekturen)
Zeile 1: Zeile 1:
Der WebsiteBuilder ist ein XML Konfigurierbarer Datensatzgenerator. In der XML werden @datasets@ konfiguriert, die aus Variablen, Datenzeilen und Dateien bestehen können.
+
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 19: Zeile 19:
 
=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 erstellen eines Nachrichtenarchives, der notwendigen Module und einer Teaser-, Archiv- und Leser-Seite befindet sich im Anhang.
+
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 51:
 
==Variablen einbinden==
 
==Variablen einbinden==
  
Variablen können bei jedem Feld-Wert genutzt werden, es gibt zwei Syntaxe zum abfragen einer Variable:
+
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 62:
 
==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 84:
 
</source>
 
</source>
  
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:
+
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 100:
 
=Datenzeilen=
 
=Datenzeilen=
  
Daten-Zeilen entsprechen einzelnen Datensätzen in der Datenbank 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.
+
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 125:
 
==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 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.
+
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 138: Zeile 138:
 
</source>
 
</source>
  
Damit haben wir einen primitiven abstrakten Datensatz, und hier der erweiternde:
+
Damit hat man einen primitiven abstrakten Datensatz, und hier der erweiternde:
  
 
<source lang="xml">
 
<source lang="xml">
Zeile 151: Zeile 151:
 
</source>
 
</source>
  
Intern werden die Datensätze "vermischt" beim erweitern entsteht Systemintern also ein neuer Datensatz:
+
Intern werden die Datensätze "vermischt"; beim Erweitern entsteht systemintern also ein neuer Datensatz:
  
 
<source lang="xml">
 
<source lang="xml">
Zeile 170: Zeile 170:
 
</source>
 
</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!
+
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.
+
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 178: Zeile 178:
 
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, arrays aufzubauen z.B.
+
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 189: Zeile 189:
 
===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 Komplexe Logik interessant.
+
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 201: Zeile 201:
 
}
 
}
 
</wb:field></source>
 
</wb:field></source>
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!
+
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===

Version vom 1. Mai 2011, 12:00 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

Abhängigkeiten

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>
Ansichten
Meine Werkzeuge

Contao Community Documentation

Toflar hat mich gestern entjungfert! ... er hat meinen ersten PR gemerged.

Kim Wormer
In anderen Sprachen
Navigation
Verstehen
Verwenden
Entwickeln
Verschiedenes
Werkzeuge