Typo3 Extensions programmieren - Snippets
Templates
Template Code holen
function getTemplateCode($mySubpart){
$tsTemplateFile = $this->conf['templateFile'];
// Wenn Flextemplate dann code aus diesem, sonst aus TS
$this->flexConf['template'] ? $templateCode = this->cObj->fileResource("uploads/tx_".$this->extKey."/".$this->flexConf['template']) : $templateCode=$this->cObj->fileResource($tsTemplateFile);
return $templateCode;
}
Saubere Links in Extensions erzeugen
Kommentar von Elmar Hinz:
Die Linkfunktionen der tslib_pibase sind nicht garade eine Hilfe. 2/3 davon streichen und die Extension wird 1/3 besser. Wenn Du Dich allein auf die Funktion pi_linkTP_keepPIvars konzentrierst, kannst du damit aber fast alles stemmen. Noch konsequenter wendest du gleich selbst die zugrundeliegende typolink Funktion an.
Das Thema mit dem Fokus auf ein sauberes Caching hier:
Session Variablen in Typo3
Mit Hilfe von Sessions kann man Benutzerbezogene Daten speichern, ohne daß Parameter per Get oder Post übertragenwerden müssen. Auch Seiten über Links etc. neu geladen werden.
Im Prinzip kann man Session Variablen folgendermaßen spreichern.
$GLOBALS["TSFE"]->fe_user->setKey("ses","$data", "$zustand");
$GLOBALS["TSFE"]->fe_user->storeSessionData();
Benutzer-Session oder Browser-Session
In Typo3 gibt es Standardmäßig 2 Sessions die man nutzen kann.
User data => Eingeloggter User. Kein Zugriff mehr wenn ausgeloggt.
Session data => Jeder User. Eingeloggt oder nicht. Daten sind an die "browsing-session" gebunden und nicht an die user-id. Bleibt erhalten bis der Browser geschlossen wird.
Default expire-time: 24h
Funktionen
$GLOBALS["TSFE"]->fe_user->getKey(type, key)
"type" Entweder "user" or "ses", definiert den Namensraum (data-space), user-session oder browsing-session (siehe oben)
"key" der "name" unter dem die Daten gespeichert werden. Arrays oder Scalars.
Note that the key "recs" is reserved for the built-in "shopping-basket". As is "sys" (for TYPO3 standard modules and code)
Example:
if ($GLOBALS["TSFE"]->loginUser){
$myData = $GLOBALS["TSFE"]->fe_user->getKey("user","myData");
} else {
$myData = $GLOBALS["TSFE"]->fe_user->getKey("ses","myData");
}
Liest die Benutzerdaten (user) mit dem Schlüssel "myData". Wenn kein Benutzer eingeloggt ist werden die Daten aus der Browser Session verwendet.
Daten Speichern
$GLOBALS["TSFE"]->fe_user->setKey(type, key, data)
"type" ist wieder "user" oder "ses".
"key" ist der Name oder auch Schlüssel unter dem die Daten gespeichert werden.
Note that the key "recs" is reserved for the built-in "shopping-basket". As is "sys" (for TYPO3 standard modules and code)
"data" ist der Wert der Variablen die gespeichert werden sollen. Arrays oder normale Skalare (einfache Variablen).
Example:
$myConfig["name"] = "paul";
$myConfig["address"] = "Main street";
$GLOBALS["TSFE"]->fe_user->setKey("ses","myData", $myConfig);
This stores the array $myConfig under the key "myData" in the session-data. This lasts as long as "paul" is surfing the site!
Beispiel Prüfen ob Seite aktualisiert wurde
Manchmal ist es notwendig zu prüfen ob eine Seite mit einem Formular mit dem Submit-Button abgesendet wurde, oder ob die Daten durch Klick auf den Reload Button des Browsers nochmal aufgerufen wurde. In diesem Fall sollten etwa Berechnungen mit den Formulardaten nicht noch einmal ausgeführt werden. Mit einer Session läßt sich das lösen:
Session initialisieren
// User Session (bei Login) oder "normale" Session nutzen
$this->sesData = array();
($GLOBALS["TSFE"]->loginUser)?{$this->sesType = "user":$this->sesType = "ses";
$this->sesData = $GLOBALS["TSFE"]->fe_user->getKey($this->sesType,"sesData");
Wenn ein Formular abgeschickt wird, dann senden wir einen Wert mit, der sich immer verändert.
$content .= '<input type="hidden" name="'.$this->prefixId.'[token]" value="'.hash("md5",time()).'" />!;
Mit dieser Funktion wird bei jedem Abruf festgestellt, ob der im Formular übermittelte Wert in der Session existiert. Falls nicht wird er in der Session gespeichert, die Seite wurde nicht durch klicken auf Reload generiert. Klickt der User hingegen auf Reload, wird der alte Formular Wert noch einmal übermittelt. In diesem Fall stimmt er mit dem beim ersten Aufruf gespeicherten "Token" Wert überein.
function is_reloaded(){
if(!empty($this->piVars['token'])){
if($this->piVars['token'] == $this->sesData['token']){
$reloaded = 1;
$this->piVars = array();
}else{
$reloaded = 0;
$this->sesData['token'] = $this->piVars['token'];
$GLOBALS["TSFE"]->fe_user->setKey($this->sesType,"sesData", $this->sesData);
}
} else $reloaded = 1;
return $reloaded;
}
Größe von Dateien lesbar ausgeben
Aus Typo3 Adventskalender 2008 von Tim Lochmüller röße von Dateien ausgeben, jedoch speichert TYPO3 diese Dateigrößen in der Regel in Bytes. Um nun eine für den normalen Menschen lesbare Ausgabe zu bekommen, bietet die Klasse t3lib_div eine nette Funktion zur Formatierung:
t3lib_div::formatSize($sizeInBytes, $labels=);
Während sich der erste Parameter wie ich denke von selbst erklärt, bedarf der zweite eine kurze Erläuterung. Der zweite Parameter ist eine durch "|"-Zeichen separierte Liste von Labels für Bytes, Kilobytes, Megabytes und Gigabytes. Der Standard ist " | K| M| G". In Deutschland zumindest ist man eine andere Schreibweise gewohnt, also gleich mal ein Beispiel:
$fileSize1 = 370
$fileSize2 = 378880
$fileSize3 = 387973120
$fileSize4 = 397284474880
echo t3lib_div::formatSize($fileSize1, $labels=' Bytes | KB | MB | GB');
// Ausgabe: 370 Bytes
echo t3lib_div::formatSize($fileSize2, $labels=' Bytes | KB | MB | GB');
// Ausgabe: 370 KB
echo t3lib_div::formatSize($fileSize3, $labels=' Bytes | KB | MB | GB');
// Ausgabe: 370 MB
echo t3lib_div::formatSize($fileSize4, $labels=' Bytes | KB | MB | GB');
// Ausgabe: 370 GB
Auf die TypoScript Konfiguration einer anderen Extension zugreifen
Auf TSconf einer anderen Extension zugreifen
Wenn man in einer Extension auf den TypoScript-Setupteil einer anderen Extension zugreifen möchte und im TypoScript-Code die Variablen nicht mehrfach aufführen möchte, kann man dies mit folgender Zeile machen:
$extConf = $GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_MYEXT_pi1.']
Dadurch erhält man den kompletten conf-Teil der Extension. Einzelne Variablen bzw. Bereiche erhält man, wenn man die Variable mit [VAR] anhängt.
(Quelle: Typo3 Snippets Juni 2009) siehe auch: http://www.lisardo.biz/wiki/GLOBALS-TSFE/
Wo finde ich was
Das Globale TSFE Objekt
- Sessions
- Datenbankabfragen