WebsiteBuilder

Aus Contao Community Documentation

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

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

Nein, der Hangout ist noch nicht vorbei, wir schweigen nur. Es heisst ja auch hangout und nicht bryll out.

Christian Schiffler
In anderen Sprachen
Navigation
Verstehen
Verwenden
Entwickeln
Verschiedenes
Werkzeuge