Typo3 Extensions programmieren - Snippets

Aus Wikizone
Wechseln zu: Navigation, Suche

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:

http://t3flyers.wordpress.com/2006/09/11/a-quick-guide-to-proper-caching-with-tslib_pibase-episode-1/

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

Über GLOBAL[‘TSFE’] kann man bei der Extension-Programmierung mehr oder weniger auf das gesamte TypoScript-Setup von Typo3 zugreifen. Man kann aktuelle Konfigurationen abfragen oder auch ändern, so dass sich die Ausgabe ins Frontend abhängig vom installierten Plugin auf jeder Seite ändern kann.

Zum Beispiel können damit zusätzliche JavaScript- oder CSS-Definitionen im Kopfbereich ausgegeben werden (siehe CSS und JavaScript im Kopfbereich ausgeben) oder der Bodytag erweitert werden. Folgende Zeile fügt z. B. auf jeder Seite, auf der das Plugin installiert wirde, dem Body-Tag einen onload-Befehl hinzu, wie er für Google-Maps benötigt wird:

  • Sessions
  • Datenbankabfragen
  • Zusätzliche Header Daten
  • vieles Mehr

TYPO3 - TSFE Objekt