blog.bartlweb - a technologist's external brain

Thema: TYPO3

Besonderheiten beim Betrieb von TYPO3 auf einem Webhost von DomainFactory

Wer TYPO3 auf einem Webhosting-Paket von DomainFactory per Hand installieren möchte, wird eventuell auf die eine oder andere Hürde stoßen, die ich hier kurz erläutern möchte.

Leeres Fronted - Fehler 500

DomainFactory erlaubt auf seinen Hostingpaketen zwar Symlinks auf Ordner aber nicht auf einzelne Dateien. Wer TYPO3 laut den Empfehlungen so installiert, dass der Ordner typo3 und die Datei index.php per Symlink auf den Ordner typo3_src zeigen, wird mit einem leeren Frontend konfiguriert. Die Server-Logs zeigen dazu ebenfalls nur einen nichtssagenden HTTP 500-Fehler an.

Kopieren Sie die Datei index.php direkt in das Root-Verzeichnis (nicht als Symlink anlegen) um das Problem zu lösen.

HTML-Emails mit Plaintext-Alternative aus TYPO3-Extensions verschicken

TYPO3 setzt seit geraumer Zeit beim E-Mail-Versand auf die mächtige Library Swift Mailer, die es sehr komfortabel erlaubt Multipart-E-Mails zu erstellen. Der folgende Code erlaubt es, aus einer TYPO3-Extension heraus HTML-Mails mit einer Nur-Text-Variante als Fallback zu versenden.

$html enthält dabei den kompletten HTML-Quelltext inclusive html-Tag, header und body. $text enthält die durch \n mit Zeilenumbrüchen versehene Textvariante.

$mail = t3lib_div::makeInstance('t3lib_mail_Message');
$mail->setFrom(array('absender@bartlweb.net' => 'angezeigter Absendername'));
$mail->setTo(array('empfänger@mail.com' => 'empfänger@mail.com'));
$mail->setSubject('Betreff der E-Mail');
$mail->setBody($html, 'text/html');
$mail->addPart($text, 'text/plain');
$mail->send();

Mehr Optionen und Möglichkeiten (z.B. für Anhänge) finden Sie in der Dokumentation von Swift Mailer unter http://swiftmailer.org/docs/introduction.html.

Feldeingaben bei Flexible Content Elements von TemplaVoila per TypoScript verarbeiten

Mithilfe der Flexble Content Elements von TemplaVoila lassen sich schnell und unkompliziert eigene Content-Elemente, wie z.B. Toggleboxen, erstellen. Dabei können einzelne Tags direkt als Felder gemappt werden. Will man jetzt, wenn wir beim Beispiel der Toggleboxen bleiben, die Header-Tags der Headline nur ausgeben, wenn auch wirklich eine Headline im Content Element angegeben wurde, kann man die Feldausgabe per TypoScript modifizieren.

Dazu wird im XML der Data Structure des Flexible Content Elements die Feldausgabe modifiziert. In unserem Beispiel muss bei unserem Feld headline der XML-Knoten TypoScript ergänzt werden.

Auswahllisten im TYPO3-Backend optimieren

TYPO3 bietet ein mächtiges und simples Formularsystem für sein Backend. Gerade bei umfangreichen Auswahllisten (Selectboxen) werden die Standardelemente aber nicht immer den gewachsenen Anforderungen von komplexen Extensions und Webanwendungen gerecht. Der folgende Ansatz ermöglicht es, die Elemente von Auswahllisten innerhalb einer TCA- oder Flexform-Definition dynamisch mittels einer PHP-Funktion zu generieren. So ist es z.B. möglich weitere Informationen als nur ein Datenbankfeld als Titel anzuzeigen oder den zu speichernden Wert der Auswahl von der UID auf ein anderes Datenbankfeld zu ändern.

TYPO3 Scheduler Cronjob ohne php_cli einrichten

Nicht alle Hosting-Umgebungen bieten die PHP Kommandozeilen Variante php_cli an. Damit wir dennoch Cronjobs für PHP-Shell-Skripte anlegen können kann man diese über einen Umweg mit dem normalen PHP-Interpreter ausführen.

Das folgende Beispiel zeigt den Aufruf des TYPO3 Scheduler-Skriptes.

env -i /usr/local/bin/php -f /<typo3root>/typo3/cli_dispatch.phpsh scheduler

Den genauen Pfad zum PHP-Interpreter ermitteln sie mittels:

which php

TYPO3-Sprachdateien mit PHP und SimpleXML einlesen

Wer TYPO3-Sprachdateien unabhängig der TYPO3-API mit PHP verarbeiten möchte kann diese mittels SimpleXML in PHP einlesen. Der folgende Code liefert die Werte der angegebenen Sprache als Array zurück. Vergessen Sie nicht das die Sprache Englisch nicht als en sondern als default angegeben werden muss.

$langFile = 'typo3conf/ext/myext/pi2/locallang.xml';
$language = 'de';
 
xml = @simplexml_load_file(PATH_site . $langFile);
 
if($xml ===  FALSE) {
  echo 'Error: Could not read xml file.';
}
 
$labels = array();
foreach($xml->data->languageKey as $xmllanguage) {
    if($xmllanguage->attributes()->index == $language) {
        foreach($xmllanguage as $value) {
            $labels[(string) $value->attributes()->index] = (string) $value;
        }
    }
}

TYPO3 Benutzer aus einer Extension heraus anmelden

Um alternative Login-Methoden zu basteln kann es hilfreich sein zu wissen wie ein bestehender TYPO3-Benutzer aus einer Extension heraus im Frontend angemeldet werden kann. Sobald der Benutzer angemeldet ist greifen damit sämtliche Seiten und Inhaltsberechtigungen.

$loginData=array(
    'uname' => $this->config['dummyUsername'],
    'uident'=> $this->config['dummyPassword'],
    'status' =>'login'
);
$GLOBALS['TSFE']->fe_user->checkPid=0;
$info= $GLOBALS['TSFE']->fe_user->getAuthInfoArray();
$user=$GLOBALS['TSFE']->fe_user->fetchUserRecord($info['db_user'],$loginData['uname']);
 
$ok=$GLOBALS['TSFE']->fe_user->compareUident($user,$loginData);
if($ok) {
  //t3lib_div::debug("login success");
  $GLOBALS['TSFE']->fe_user->createUserSession($user);
} else {
  //t3lib_div::debug("login failed");
}
 
$GLOBALS['TSFE']->fe_user->user = $GLOBALS['TSFE']->fe_user->fetchUserSession();
$GLOBALS['TSFE']->fe_user->fetchGroupData();

Sichtbarkeit von Eingabefeldern im TYPO3-Backend steuern

Es wäre nicht TYPO3 wenn nicht auch Eingabeformulare im Backend flexibel gestaltbar sind. Dabei lassen sich sowohl in normale TCA-Formulare als auch in Flexform-Formularen einzelne Eingabefelder in Abhängigkeit von Werten in anderen Feldern ein- bzw. ausblenden.

TCA

Um Felder abhängig von der Auswahl eines anderen Feldes ein- bzw. auszublenden müssen in 2 Dateien Änderungen vorgenommen werden.

ext_tables.php

Ergänzen Sie im Konfigurations-Array der Tabelle die Eigenschaft 'requestUpdate' => 'hidecontent'. Dadurch veranlassen Sie das Backend zum Neuladen, sobald der Wert in einem Trigger-Feld geändert wird. Keine Sorge alle bis dahin vorgenommenen Änderungen werden beim Neuladen automatisch gespeichert.

Pipe-Symbol und Leerzeichen in Typoscript-stdWrap verwenden

TYPO3 bietet in Typoscript die auf dem Trennzeichen Pipe basierende Funktion stdWrap an. Um das Pipe-Symbol selbst auf der Website auszugeben kann man dieses als HTML-Zeichen kodieren.

| = &#124;

stdWrap entfernt Leerzeichen vor und nach dem Trennzeichen. Um Leerzeichen auszugeben kann man entweder die Funktion noTrimWrap nutzen oder das Leerzeichen, wenn möglich, als geschütztes Leerzeichen mittel &nbsp; ausgeben.

Beispiel

10 = TEXT
10.value = Wert1
10.wrap = Wert0 &#124;&nbsp; | &nbsp;&#124; Wert 2
10.noTrimWrap = | Wert0 &#124; | &#124; Wert2 |

Realurl-Pfade funktionieren mit einem Slash aber nicht mit .html am Ende

Wenn Realurl unter TYPO3 zwar korrekte Pfade generiert, sich einzelne Seiten allerdings nur mit einem Slash am Ende (also als Verzeichnis) anstelle der Dateiendung .html aufrufen lassen, liegt das meist an der zusätzlich installieren Extension Simulate Static URLs (simulatestatic).

Diese Extension wird aber in Verbinung mit Realurl nicht benötigt bzw. erzeugt ungewollte Nebeneffekte und sollte deshalb umgehen deinstalliert werden.

Gerade bei Updates auf neue Versionen werden mit dem Update-Tool aus dem Install-Tool oft neue bzw. nicht installierte Systemextensions installiert, so auch Simulate Static URLs .