blog.bartlweb - a technologist's external brain

Thema: Webentwicklung

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;
        }
    }
}

Website als iPhone bzw. iPad-App

Damit unter iOS eine Website am Dashboard als Icon angelegt werden kann bedarf es nur ergänzenden Meta-Informationen im HTML-Header.

Website als App definieren

Des folgenden Meta-Attribut gibt iOS die Anweisung die Website als App behandeln zu können. Dadurch wird dem Nutzer innerhalb von Safari die Option eine Verknüpfung der Website auf das Dashboard zu erstellen angezeigt.

<meta name="apple-mobile-web-app-capable" content="yes" />

Icon für das Dashboard

Damit wir alle Auflösungsdichten der unterschiedlichen iPhone und iPad-Modelle abdecken muss das Logo in 3 verschiedenen Auflösungen eingebunden werden.

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 |

Apache mittels PHP reloaden

Die folgende Lösung ist definitiv eine Bastellösung und daher nur für interne und gut abgesicherte PHP-Anwendung gedacht. Die folgende Anleitung ermöglicht es den Apache Webserver mit Hilfe eines PHP-Skriptes neu zu laden. Erforderlich ist dies wenn die Apache-Konfiguration mittels PHP geändert werden kann (z.B. hinzufügen eines neuen virtuellen Hosts). Zu beachten ist das nach ausführen des Skripts 2-5 Sekunden vergehen können bevor der Server wirklich "reloaded" wurde.

Da unsere PHP-Umgebung mit den eingeschränkten Rechten des Webserver-Benutzers läuft und der Apache-Server nur mit Hilfe von Root-Rechten "reloaded" werden kann bedient man sich der Hilfe von visudo um dem Benutzer das Ausführen des Befehls mit sudo ohne Eingabe des Passworts zu ermöglichen.

Timestamp via SQL erhöhen

Werden veränderte Datensätze anhand einer Timestamp erkannt hilft es oft diese bei manuellen Eingriffen in die Datenbank um 1 zu erhöhen. Dies ändert für den Benutzer nicht viel, veranlasst das System allerdings die Änderung am Datensatz zu erkennen.

Der folgende SQL-Befehl ermöglich die Erhöhung eines Zahlen-Wertes:

UPDATE mytable SET tstamp=tstamp+1 WHERE uid = 5;