blog.bartlweb - a technologist's external brain

Thema: TYPO3

Typoscript Operatoren

Typoscript hat eine einfache Syntax mit diversen Operatoren und Kniffen die hier kurz erläutert werden.

Strukturierung

Generel handelt es sich bei Typoscript-Konfigurationen um PHP-Arrays und daher gibt es mehrere Ebenen und Strukturierungen. Der Punkt trennt verschiedenen Ebenen und geschwungene Klammern fassen diese zusammen.

Daher sind die beiden unteren Schreibweisen equivalent:

page = PAGE
page.typeNum = 0
page.10 = TEXT
page.10.value = Hello World!
page.10.wrap = -- | --
page.10.case = upper
page = PAGE
page {
  typeNum = 0
  10 = TEXT
  10 {
    value = Hello World!
    wrap = -- | --
  }
  10.case = upper
}

Kommentare

Wie auch in PHP gibt es in Typoscript Kommentare.

Technologie-Messages per Typoscript

Bei vielen Webanwendungen gibt es Anforderungen an die Browser und Verbindungen. So muss oft JavaScript aktiviert sein, es sollte die Verbindung verschlüsselt erfolgen und manchmal werden auch diverse Browser nicht unterstützt. Um den Nutzer darüber zu informieren hilft das folgende Typoscript-Snippet, dass je nach Status und Anforderung den Benutzer benachrichtigt.

lib.login_message = COA
lib.login_message.stdWrap {
  wrap = <div class="message">|</div>
  required = 1
}
 
# nojs message
lib.login_message.10 = HTML
lib.login_message.10.value (
  <noscript><h1>Bitte JS aktivieren!</h1></noscript>
)
 
# unsuported browser
lib.login_message.20 = HTML
lib.login_message.20.value (
  <h1>Nicht unterstützter Browser!</h1>
)
 
[browser = firefox]
  lib.login_message.20.value =
[global]
 
# nossl message
lib.login_message.30 = HTML
lib.login_message.30.value (
  <h1>Unverschlüsselte Verbindung!</h1>
)
 
[globalString = IENV:TYPO3_SSL=1]
  lib.login_message.30.value =
[global]

Typoscript in externe Dateien auslagern

Für alle die Ihre Typo3-Projekte gerne ins SVN einchecken stellt sich immer schon die Frage wie das zugehörige TypoScript in das Repository kommt. Die Möglichkeit Typoscript in externe Dateien auszulagern macht es nun möglich. Auch das Inkludieren von Dateien in bereits inkludierten Dateien ist möglich und Conditions funktionieren in externem Typoscript mittlerweile auch.

einbinden von externen Typoscript-Dateien

Das folgende Typoscript bindet externe Dateien die weiteren Typoscript-Code beinhalten ein. Die Dateiendung darf dabei beliebig gewählt werden (zu empfehlen ist entweder .txt oder .ts).

<INCLUDE_TYPOSCRIPT: source="FILE: fileadmin/typoscript/filename.txt">

Ein besonderes Augenmerk bei dieser Methode sollte auf die Reihenfolge beim inkludieren der Dateien gelegt werden.

DirectMail Wizard konfigurieren

Gerade für nicht so versierte Redakteure ist es hilfreich den Assistenten der Typo3-Extension DirectMail einzuschränken und nicht benötigte Funktionen auszublenden, das folgende Typoscript-Snippet für das User-TS macht es möglich

#
# configure direct_mail wizard
#
tx_directmail.hideTabs = ext,dmail
tx_directmail.defaultTab = int
tx_directmail.hideSteps = cat

Optionen

  • hideTabs: blendet die Toggle-Boxen im Versandhauptmodul aus (int - Interne Seiten versenden, ext - Externe Seite versenden, dmail - bereits versendete Mails, quick - Quickmail)
  • defaultTab: öffnet die definierte Toggle-Box beim Aufruf des Assistenten
  • hideSteps: bietet die Möglichkeit den Schritt "categorized content" im Wizard auszublenden

Contentelemente in Typo3-Extension rendern

Die unteren zwei Zeilen PHP-Code ermöglichen es Content-Elemente aus einer Typo3-Extension heraus zu rendern und somit in die eigenen Extension einzubinden. Bekannt muss einem dabei lediglich die ID des Content-Elementes sein.

$tt_content_conf = array('tables' => 'tt_content','source' => "45",'dontCheckPid' => 1);
$content .= $this->cObj->RECORDS($tt_content_conf);

E-Mail-Adressen in Typo3-Extensions auf Gültigkeit prüfen

Des öfteren steht man vor der Aufgabe in selbstgeschriebenen Typo3-Extensions E-Mail-Adressen bei der Eingabe auf deren Gültigkeit zu prüfen. Das Typo3-Framework bietet für diese Aufgabe bereits eine fertige Funktion an.

if (t3lib_div::validEmail($email)) {
  echo "valid E-Mail!";
}

dynamisch erzeugtes CSS und JS aus Typo3-Extension heraus einbinden

Gerade bei GoogleMaps-Extensions wird oft dynamisch erzeugtes JavaScript oder CSS benötigt. Um dieses aus einer Extension heraus in den Head-Bereich der Webseite einzubinden, liefert Typo3 zwei Funktionen:

$GLOBALS['TSFE']->setJS($this->extKey, 'alert("dynamisches JS");');
$GLOBALS['TSFE']->setCSS($this->extKey, '.dynamisch {margin: 1em}');

einfaches auslesen von ganzen Datensätzen aus der Datenbank anhand der UID in Typo3-Extensions

Um einen ganzen Datensatz eines Elementes aus einer Datenbank-Tabelle (Vorraussetzung ist das existieren der Spalte uid) in Typo3 auszulesen, bedarf es keiner komplexen Datenbankabfragen. Ein einfacher Befehl der als Parameter den Tabellennamen und die UID des Datensatzes annimmt genügt.

$row = $this->pi_getRecord(<Tabellenname>, <UID>); 

Flexform-Daten in Typo3-Extension auslesen

Um die Flexform-Daten eines Plugins zu nutzen benötigt man in seiner eigenen Extension etwas PHP-Code. Dabei kann nicht nur auf Flexform-Daten des aktuellen Plugins sondern auch auf jene jedes beliebigen (soweit der Datensatz bekannt ist) zugegriffen werden.

Flexform-Daten des aktuellen Plugins

$this->pi_initPIflexForm();
$this->flexform = array();
 
// get flexform data
$piFlexForm = $this->cObj->data['pi_flexform'];
$sDef = current($piFlexForm['data']);
foreach ( $piFlexForm['data'] as $sheet => $data ) {
    foreach ($data['lDEF'] as $key => $val ) {
        $this->flexform[$key] = $this->pi_getFFvalue($piFlexForm, $key, $sheet, 'lDEF');
    }
}

fremde Flexform-Daten

$row=$this->pi_getRecord(tt_content, $this->conf['foreignFlexformContentElementID']); 
$flexformData = t3lib_div::xml2array($row['pi_flexform']);
 
$foreignFlexform = array();
 
$piFlexForm = $flexformData;
$sysLanguage = $GLOBALS['TSFE']->sys_language_uid;
$sDef = current($piFlexForm['data']);
$lDef = array_keys($sDef);
foreach ( $piFlexForm['data'] as $sheet => $data ) {
    foreach ( $data as $lang => $value ) {
        foreach ( $value as $key => $val ) {
            $foreignFlexform[$key] = $this->pi_getFFvalue($piFlexForm, $key, $sheet);
        }
    }
}