TYPO3weblog.de

Das Blog zu TYPO3, JavaScript und openSource

t3n Magazin - Jetzt im Abo bestellen

Entries Tagged ‘Adventskalender 2008’

Adventskalender 2008: Türchen 23

Nachdem Tim Euch gestern in Türchen 22 erklärt hat, wie man kommaseparierte Listen in Extensions abfragen kann, stelle ich Euch heute drei interessante Funktionen aus der Klasse t3lib_div vor.

1. t3lib_div::array2json($data)
Mit dieser Funktion kann man sehr einfach seine Daten in ein JSON Objekt konvertieren. Die Funktion erwartet ein Array mit den Daten, dieses kann beliebig verschachtelt sein. Natürlich gibt es auch noch die PHP native Funktion json_encode, jedoch muss dies von der installierten PHP Installation unterstüzt werden.

2. t3lib_div::convUmlauts($str)
Eine sehr nützliche Funktion ist convUmlauts, welche die deutschen Umlaute konvertiert, dabei wird aus einem Ä eine Ae oder aus einem ü ein ue. Groß und Klein-Schreibung wird also berücksichtigt.

3. t3lib_div::rmFromList($element, $list)
Auch diese Funktion ist sehr nützlich. Möchte man aus einer kommaseparierten Liste ein Element entfernen, ist dies mit einem Funktionsaufruf getan. Gerade bei TYPO3 ist diese Funktion sehr hilfreich, wenn man z.B. eine Benutzergruppe eines FE-Users entfernen möchte.

Das war es dann auch schon wieder von mir für diesen Adventskalender. Das letzte Türchen und somit das große Finale kommt dann morgen von Tim. Ich hoffe wir konnten Euch ein paar neue und interessante Dinge zu TYPO3 verraten. Ich wünsche allen Lesern ein paar besinnliche Weihnachtstage und natürlich auch einen guten Rutsch in das Jahr 2009.

Comments (3)

Adventskalender 2008: Türchen 21

Die Zeit verfliegt, der heilige Abend rückt immer näher und der Streß-Faktor was die Geschenke angeht steigt. Dennoch gibt es heute wieder einmal etwas TypoScript bzw. eine Erklärung zu TypoScript.

Erst vor wenigen Tagen habe ich einem Kollegen erklärt, worin eigentlich der Unterschied zwischen Objekten besteht, die mit temp. und lib. beginnen.

Dazu mal ein Beispiel TypoScript:

temp.meinObject = TEXT
temp.meinObject.value = Text1

lib.meinObject = TEXT
lib.meinObject.value = Text2

Bis hierhin gibt es keinen großen Unterschied, wir haben zwei Objekte, welche einen Text enthalten. Was passiert jedoch, wenn wir diese beiden Objekte nun als Referenz an einer anderen Stelle verwenden wollen:

page = PAGE
page.10 < = temp.meinObject
page.20 <= lib.meinObject

Hier zeigt sich, dass lediglich page.20 mit dem Text befüllt wird. Aber warum ist das so? Das ist sehr schnell und einfach erklärt. Objekte die mit temp. eingeleitet werden, werden nicht gecached. Wie der Prefix es selbst schon aussagt, es sind temporäre Objekte. Alles was hingeben mit lib. beginnt kann auch bei einer Referenz verwendet werden.

Arbeitet man nicht mit dem Referenz-Operator (<=) sondern mit dem Kopier-Operator (<), spielt es keine Rolle ob man temp. oder lib. verwenden.


Comments (4)

Adventskalender 2008: Türchen 19

Eine Weihnachtsfeier jagt die nächste, auf der einen Seite ist es immer sehr nett, auf der anderen Seite gerät man schnell in Streß. Naja, heute ein wenig verspätet nun das Türchen 19. Tim hat Euch gestern im Türchen 18 gezeigt, wie man mit TypoScript schicke GMENUs erzeugt. Heute möchte ich wieder ein wenig PHP Code zeigen.

Diesmal geht es um die Benutzung der Session in TYPO3. In der Regel genügt nur eine Zeile Code um einen Wert in die Session zu schreiben oder wieder heraus zu holen. Schauen wir uns erstmal an, wie man etwas in die Session schreibt:

$GLOBALS["TSFE"]->fe_user->setKey("ses", "tx_myext", $data);

Die Funktion setKey() erwartet drei Parameter:

  1. Type: Dieser kann “ses” oder “user” sein.
  2. Key: Eindeutiger Ident für eine Session Variable
  3. Data: Die Daten die gespeichert werden sollen.

Die beiden Typen “ses” und “user” unterscheiden sich wesentlich. Während der Typ “ses” nur temporär die Daten speichert, also genau so lange, wie die Session besteht (Session-Cookie), ist es mit dem Key “user” möglich, die Daten auch über mehrere Sessions hinweg zu speichern, wobei diese an den FE-User gekoppelt werden.

Der Key sollte so gewählt werden, dass man nicht in Konflikt mit anderen Extensions kommt. Am besten benutzt man seinen Extension-Key dafür.

Die Daten die man speichern will kann jede beliebige PHP Variable sein, sogar komplette Objekte kann man ablegen.

So, nun wollen wir uns den Wert mal wieder raus holen, auch dies geht sehr schnell und einfach:

$data = $GLOBALS["TSFE"]->fe_user->getKey("ses", "tx_myext");

Die Methode getKey erwartet nur zwei Parameter, die Bedeutung ist die gleiche wie bei setKey().

Das Leben kann so einfach sein, wenn es nicht ab und an diese kleinen fiesen Sonderfälle gibt ;)

Nehmen wir mal an, man erzeugt ein PDF oder eine AJAX-Antwort, dann gibt man das PDF aus und steigt mit einem exit() oder die() aus. In diesen Fällen, reicht ein einfacher Aufruf von setKey() nicht aus. Denn TYPO3 kann dann die Daten nicht automatisch speichern. Aber hier schafft der folgende Code Abhilfe:

$GLOBALS["TSFE"]->fe_user->setKey("ses", "tx_myext", $data);
$GLOBALS["TSFE"]->fe_user->storeSessionData();

Mit storeSessionData() sorgen wir dafür, dass TYPO3 umgehend die Werte speichert. Sehr häufig wird gerade auf die letzte Zeile verzichtet, was in der Regel auch funktioniert, jedoch nur so lange, wie kein Fehler auftritt oder das Script vorzeitig beendet wird.

Fröhliches Session-Handling Euch allen :)

Kommentare deaktiviert

Adventskalender 2008: Türchen 17

Tim Georg hat Euch gestern im Türchen 16 gezeigt, wie man mit TypoScript und einem cObj einen Login erzeugt. Mein heutiges Türchen ist sehr kurz, aber sehr interessant wie ich finde.

In letzter Zeit habe ich sehr oft mit AJAX und JSON gearbeitet. Leider gibt es dabei immer ein Problem mit cc_debug, weil sich dieser immer hinter die Ausgabe des JSON Codes klemmt und damit ein kaputtes JSON erzeugt. Nachdem ich heute mit meinem Kollegen Michael zusammen gesessen habe um dieses Problem zu lösen, sind wir auf eine sehr einfache Lösung gestoßen:

$GLOBALS['errorList']->clear();
die(json_encode($result));

Die Zeile 1 direkt vor der Ausgabe des JSON Codes eingebaut, verhindert, dass cc_debug noch seinen JavaScript-Code hinter her ausgibt. Und wer jetzt sagt: naje, ein die() oder exit() sollte es auch tun, der irrt sich. Versucht es gerne selber mal ;)

Comments (6)

Adventskalender 2008: Türchen 15

Nachdem das Türchen 13 aus persönlichen Grunden leider ausfallen musste, hat Tim gestern im Türchen 14 erklärt, wie man im Backend die Framebreite anpassen kann.

Heute im Türchen 15 möchte ich Euch die Verwendung des Command Line Interface (CLI) von TYPO3 näher bringen. Das CLI bietet sich immer an, wenn man Prozesse automatisieren möchte. Dies gilt z.B. für tägliche Erinnerungsmails, welche jeden morgen um 9 Uhr versendet werden sollen. Genau an diesem Beispiel möchte ich Euch nun zeigen, wie sowas geht:

Es sind nur 5 einfach Schritte nötig:

1. Backend User
Wir benötigen einen Backend-User, welcher für die Ausführung benötigt wird. Dieser sollte mit “_cli_” beginnen. Wir nennen ihn mal “_cli_myext”, das Passwort ist eigentlich egal, da das CLI sich nicht ins Backend einloggt, jedoch könnte dieser User bei einem schwachen Passwort böswillig verwendet werden. Aus diesem Grund sollten ein sehr kryptisches Passwort gewählt werden.

2. Registrierung des CLI Scripts
Um das CLI nutzen zu können, müssen wir nun unser Script registrieren, dazu ist folgender Eintrag in der Datei ext_localconf.php notwendig:

if (TYPO3_MODE=='BE') {
  $TYPO3_CONF_VARS['SC_OPTIONS']['GLOBAL']['cliKeys'][$_EXTKEY] = array(
    'EXT:'.$_EXTKEY.'/class.tx_myext_cli.php',
    '_cli_myext'
  );
}

Hierbei ist zu beachten, dass der Backend-User mit angeben wird.

3. Das CLI Script selbst
Als nächstes benötigen wir das CLI Script selbst:

< ?php
if (!defined('TYPO3_cliMode'))  die('You cannot run this script directly, only from the command line!');

require_once(PATH_t3lib.'class.t3lib_cli.php'); 

class tx_myext_cli extends t3lib_cli {
    function tx_myext_cli() {
      parent::t3lib_cli(); 
      $this->cli_help['name'] = 'Reminder-Mailings';
      $this->cli_help['synopsis'] = '###OPTIONS###';
      $this->cli_help['description'] = 'send reminder mailings';
      $this->cli_help['examples'] = '/.../cli_dispatch.phpsh myext sendMails';
      $this->cli_help['author'] = 'Frank Nägler, (c) 2008';
    }

    function cli_main($args) {
      // extract task
      $task = (string) $this->cli_args['_DEFAULT'][1];
      switch ($task) {
        case 'sendMails':
            $this->sendMails();
        break;
        default:
          $this->cli_validateArgs();
          $this->cli_help();
          exit;
        break;
      }
    }

    function sendMails() {
    	// send some mails
    }
}

// Call the functionality
$cliObj = t3lib_div::makeInstance('tx_myext_cli');
$cliObj->cli_main($_SERVER['argv']);

?>

4. Der Aufruf
Möchte man das CLI jetzt testen, dann brauchen wir nur die folgende Zeile in einer Shell aufrufen:

/path/to/typo3/cli_dispatch.phpsh myext sendMails

5. Der cronJob
Da wir die Mails ja jeden morgen um 9 Uhr versenden möchte, brauchen wir noch einen Eintrag in der cronTab:

0 9 * * * /path/to/typo3/cli_dispatch.phpsh myext sendMails

Das war es schon, die Möglichkeiten sind quasi unerschöpflich. Viel Spaß und viel Erfolg mit dem nächsten cronJob ;)

Comments (12)

t3n Magazin - Jetzt im Abo bestellen