Dez 31

Wir wünschen Euch allen einen guten Rutsch und einen ganz tollen Start ins neue Jahr 2008! Wir hoffen Ihr feiert schön und lasst es Euch gut gehen!

Ich habe gerade gesehen, dass wir beim TYPO3-Blog des Jahres Voting gar nicht so schlecht aussehen – immerhin der zweite Platz momentan. Damit haben wir gar nicht gerechnet und freuen uns daher umso mehr. Wer noch nicht für uns gevotet hat, darf das natürlich gerne nachholen – vielen Dank auch schon mal für die Unterstützung bisher.  Ich persönlich werde auch voten, allerdings erst am letzten Tag – dann natürlich nicht für uns, das wäre ja unfair – sondern für einen der Kandidaten, bei deren/dessen Blog ich im letzten Jahr sehr viele nützliche Dinge erfahren habe, die ich auch direkt für meine Arbeit mit TYPO3 verwenden konnte. Details am 01. Februar :-)

Dez 30
TYPO3 Firefox Plugin
icon1 alex | icon2 TYPO3, Tools | icon4 12 30th, 2007| icon35 Comments »

Auf der Firefox Plugin Seite gibt es das Plugin “TYPO3 Workbench” von Markus Söth. Folgend ePlugins bringt es mit:

1.) TYPO3 Login
Natürlich haben wir in der TYPO3 Workbench auch das bewährte “TYPO3 Backend” integriert. Neu hinzugekommen ist die Möglichkeit, das die Workbench nach einer “/typo3/index.php” prüft und nur den Loginbutton anzeigt, sofern eine TYPO3 installation vorliegt.

2.) Meine Projekte
Um noch schneller auf aktuelle Projekte zugreifen zu können, kann nun mit Hilfe der bookmarksfunktion ein Ordner hierfür angelegt und in der Konfiguration von TYPO3 Workbench ausgewählt werden. Die in diesem Ordner angelegten Bookmarks können dann schnell über TYPO3 Workbench aufgerufen werden. Optional wird beim Aufruf auch gleich die Login Seite in einem neuen Tab geöffnet.

3.) Referenzen
Da die TYPO3 Referenzen “TSREF” und TSconfig” auch im Docbook Format vorlagen, wurden diese als Hilfe-Dateien integriert. Über das Inhaltsverzeichnis und eine integrierte Suche können diese nun durchsucht werden. Textelemente können hieraus kopiert und in das TYPO3 Template eingefügt werden.

4.) Extensions finden
Über eine kurze Sucheingabe wird diese direkt an das Extension Repository von TYPO3 gesendet. Das Ergebnis öffnet in einem neuen Tab.

5.) Foren durchsuchen
Nach TYPO3 Hilfen in Google zu suchen ist mitlerweile recht unkomfortabel. Hierzu wurde eine Suche über verschiedenste Foren integriert. Welche Foren mit durchsucht werden sollen, kann der Benutzer in den Konfigurationseinstellungen definieren.

Der Download lohnt sich.

Dez 27
T3X-Archive entpacken
icon1 patrick | icon2 TYPO3 | icon4 12 27th, 2007| icon32 Comments »

Während der Arbeit mit TYPO3 stösst man hin und wieder auf T3X-Archive – dem nativen Datenformat von TYPO3 – meist verwendet für Backups und Extensions. Diese enthalten Dateien und Verzeichnis-Strukturen und können direkt nicht eingesehen werden.

Dies ist aber hin und wieder wichtig, beispielweise wenn man:

  • unterschiedliche Versionen einer Extension mittels diff vergleichen will
  • in der originalen Extension etwas verändert hat und nun nicht mehr weiss, was genau (Schande über mich :-) )
  • im Internet irgendwo ein Archiv findet und vor dem Installieren auf dem Server wissen will, was sich darin befindet
  • eine einzelne Datei aus einem Backup benötigt

Sicherlich befinden sich alle notwenigen Klassen im TYPO3-Framework, allerdings kann es gut sein, dass man das Framework gerade nicht zur Hand hat oder nicht verwenden will, daher habe ich eine davon unabhängige Klasse geschrieben.

Die Klasse selbst ist alles andere als der Olymp der OO-Programmierung, sondern recht schnell zusammengebaut.

Der Konstruktor nimmt zwei Argumente auf, das erste Argument ist der Pfad zur T3X-datei und das zweite Argument ist der Pfad zu der Stelle im Dateisystem, in welche die Dateien entpackt werden sollen.

ACHTUNG: Das Programm entpackt ohne Vorwarnung – unabhängig davon, ob schon Inhalt vorhanden ist (wird überschrieben) oder ob überhaupt genug oder die richtigen Benutzerrechte vorhanden sind, um die Dateien anzulegen. Zudem ist die Klasse unter Linux lauffähig – ich habe keine Ahnung, ob es unter Windows zu Problemen kommt.

<?php

class unpackT3X {

  var $filename;
  var $destination;

  function __construct($filename,$destination) {
    $this->filename = $filename;
    $this->destination = $destination;
  }

  function decodeT3XData($str) {
    $parts = explode(':',$str,3);
    if ($parts[1]=='gzcompress') {
      if (function_exists('gzuncompress'))    {
        $parts[2] = gzuncompress($parts[2]);
      } else {
        echo('Fehler beim Dekodieren: Es wurde kein')
	echo('Decompressor (gzuncompress) gefunden!');
	die();
      }
    }
    $output = unserialize($parts[2]);
    if (is_array($output)) {
      return array($output,'');
    } else {
      echo('Fehler: Inhalt konnte nicht');
      echo('deserialisert werden.');
    }
  }

  function readT3X() {
    $handle = fopen ($this->filename, "rb");
    $contents = fread ($handle,
	  	  filesize($this->filename));
    fclose ($handle);
    $fetchData = $this->decodeT3XData($contents);

    foreach ($fetchData[0][FILES] as $key => $elem) {
      $dirs = split("/",$key);
      if (count($dirs) > 1) {
        $dirs = array_slice($dirs, 0, count($dirs)-1);
        $dirs = implode("/",$dirs);
        if (!is_dir($this->destination."/".$dirs)) {
          mkdir($this->destination."/".$dirs);
        }
      }

      $handle = fopen ($this->destination."/".$key, "wb");
      fwrite($handle,$fetchData[0][FILES][$key][content]);
      fclose($handle);
    }
    echo "Unpacking von <strong>".$this->filename.
         "</strong> nach <strong>".$this->destination.
         "</strong> war erfolgreich!";
  }

}

$t3x = new unpackT3X(
	"./typo3temp/t3x_unpack/seminars_0.4.8.t3x",
        "./typo3temp/t3x_unpack/destination"
       );
$t3x->readT3X();
Dez 27

Im Fachinformatiker SEO TYPO3 Blog läuft seit ein paar Tagen eine Wahl zum TYPO3-Blog des Jahres 2007. Wer gewinnt, darf die eine Preisträger-Plakette auf seinem Blog präsentieren.

Auch wenn wir noch recht neu sind, fänden wir das schon sehr schick :-)

Also Leute – wenn Ihr unser Blog gut findet, dann nix wie ab zum voten für t3blog.de.

Dez 20
Es ist da …
icon1 patrick | icon2 TYPO3, TypoScript | icon4 12 20th, 2007| icon35 Comments »

Hurra – es ist endlich da… wochenlanges warten und zittern, ob es sich der ganze Aufwand gelohnt hat und ob es so geworden ist, wie man es sich erhofft hat … und – ja – ich bin zufrieden, sehr sogar (*stolz*):

ACHTUNG WIEDER EINMAL UNVERSCHÄMTE EIGENWERBUNG!

Leider etwas unscharfes Bild vom neuen TypoScript kurz&gut Buch
Heute habe ich das erste Exemplar des brandneuen “TypoScript kurz&gut” aus dem O’Reilly Verlag erhalten. Mit 270 Seiten halte ich nun den Rekord in der Reihe “kurz&gut” und das sogar international :-) Aber auf weniger Seiten war die TSref, TSconfig und die beschriebenen TypoScript-Optionen der gängigen Extensions nicht zu komprimieren.

Im Handel wird’s in ein paar Tagen sein – bei Amazon vielleicht schon etwas früher…

Und bitte – haltet Euch mit Kritik (aber natürlich auch Lob) nicht zurück – gerade das Feedback der Community ist mir sehr wichtig, da es ja auch für Euch geschrieben wurde (und endlich kann ich meinen Ordner mit der ausgedruckten TSref/TSconfig wegschmeissen – puhhhh).

Ich hoffe Euch gefällt’s auch so gut wie mir :-)

Dez 15

Kurz nach Erscheinen der Version 4.1.4 wurde eine Bugfix-Version 4.1.5 veröffentlicht, die ausschließlich einen Fehler behebt, der erst mit 4.1.4 eingeführt wurde. Es handelt sich dabei um ein neu eingeführtes Feature, welches Lokalisierungsdaten in eine extra Datei auslagert (mit Ausnahme der Default-Sprache). Fehlt diese Datei allerdings, wird der Lokalisierungsteil komplett auf ein leeres Array gesetzt. Die Bugfix-Version 4.1.5 behebt diesen Umstand.

Man kann nun entweder die neue Version laden und installieren oder sich schlicht den Patch herunterladen und die Sourcen patchen (siehe voriges Posting) – sinnvoll nur, wenn man bereits die Version 4.1.4 hat.

Patch der Version 4.1.5: Download vom TYPO3-Bugtracker

(Es werden lediglich 2 Zeilen in der Datei t3lib/class.t3lib_div.php geändert und eine neue Zeile dort hinzugefügt)

Dez 14

Es gibt zahlreiche Gründe, warum man hin und wieder am TYPO3-Core herumschrauben muss.

Meist sind es Kleinigkeiten, die den Kunden stören und die nur so zu beseitigen sind. Allerdings läuft man immer die Gefahr, seine Änderungen zu verlieren, wenn man neue Sourcen einspielt. Da wäre es also sinnvoll und praktisch Aufzeichnung über seine Änderungen zu haben – am besten in einer Form, mit der sich diese sofort wieder in die aktualisierten Sourcen einspielen lassen.

Aber auch für einen anderen Zweck ist das ganze gut: Wenn man beispielsweise einen Fehler im TYPO3-System findet und diesen behebt, kann man seine Veränderung als patch-File im Bugtracker hinterlegen.

Um einen Patch zu erstellen gehen wir wie folgt vor (die Anleitung ist für Linux-Systeme):

  1. Wir speichern die zu ändernde Datei mit einem neuen Namen im selben Verzeichnis ab, in meinem Fall war dies die Datei class.t3lib_page.php im Verzeichnis typo3_src-4.1.4/t3lib/ Die Kopie der Datei habe ich beispielsweise class.t3lib_page_orig.php genannt.
  2. Nun wird die usprüngliche Datei geändert (Fehler behoben, Feauture zugefügt, …)
  3. Wenn wir mit der Änderung fertig sind, wechseln wir ins Rootverzeichnis der TYPO3-Installation.
  4. Dort setzen wir folgenden Befehl ab (alles in eine Zeile schreiben!) – die Pfade und Dateinamen müssen natürlich angepasst werden:
    diff -ruN typo3_src-4.1.4/t3lib/class.t3lib_page.php
    typo3_src-4.1.4/t3lib/class.t3lib_page_orig.php
    > patch_20071214_1.diff
  5. Das nun erstellte Patch-File heben wir an geeigneter Stelle auf.
  6. Wir können nun die Kopie der Datei wieder löschen.
  7. Wenn wir später die Änderung wieder einspielen wollen, wechseln wir wieder ins Rootverzeichnis der TYPO3-Installation und geben den folgenden Befehl ein:
    patch -p1 < patch_20071214_1.diff
  8. Gegebenenfalls muss dann das File angegeben werden, welches den Patch abbekommen soll – wenn sich die Pfade nicht verändert haben, ist dies allerdings nicht notwendig.
  9. Um den Patch nicht direkt einzuspielen, sondern einen sogenannten Trockenlauf zu machen, um zu sehen, was sich ändern würde, kann man den Parameter –dry-run verwenden.

Der Vorteil dabei ist, dass man sich die Patch-Files auch so manuell durchsehen kann, um schnell herauszubekommen, was für Änderung man im Laufe der Zeit durchgeführt hat. Wenn man wie oben das Datum in den Filenamen schreibt, hat man auch eine visuelle Kontrolle über den Zeitpunkt der Änderungen.

Dez 12

Wie lautet der schnellste Weg zur TSref? …… na? http://www.tsref.deUnser Kommentator “MaBa” hat dann noch einen Weg zur TSconfig “gefunden” (naja nicht direkt gefunden, sondern er sponsort die Domain):http://www.tsconfig.de(Danke dafür :-) )—*** ACHTUNG UNVERSCHÄMTE EIGENWERBUNG: ***Oder in die neue Referenz “TypoScript kurz&gut” aus dem O’Reilly-Verlag schauen – die braucht allerdings noch ein paar Tage von der Druckerei in die Buchläden :-) Schätzungsweise nächste Woche wird es soweit sein…

Dez 12

Durch eine Sicherheitslücke in der indexed_search, ist es theoretisch möglich, mittels SQL-Injektion auf die Datenbank zuzugreifen und somit letztendlich Kontrolle über das System zu erlangen. Allerdings ist hierfür ein angemeldeter Backend-User notwendig. Sofern man also nicht alleine auf seinem System arbeitet, sollte man dringend die Updates einspielen.

Das offizielle Bulletin findet sich hier:

http://typo3.org/teams/security/security-bulletins/typo3-20071210-1/

Daneben wurden auch einige kleinere Dinge gefixed – die Changelogs finden sich hier:

http://wiki.typo3.org/index.php/TYPO3_4.1.4

http://wiki.typo3.org/index.php/TYPO3_4.0.8 

Dez 4

Der Titel hört sich etwas merkwürdig an, aber ich wusste nicht, wie man es anders bezeichnen soll.

Folgende Aufgabenstellung bekam ich vom Kunden:

Aus 20 zufälligen Bildern von Mitarbeitern die über das LDAP in TYPO3 eingebunden wurden, soll eine Collage erstellt werden, die aus 5 Reihen und vier Spalten besteht.

Also machen wir uns ans Werk:

Generell habe ich folgende Vorgehensweise gewählt:

  1. Einen Query über die fe_user-Tabelle, der zufällig 20 User ausliest
  2. Ein leeres Bild erzeugen, welches die Collage aufnehmen kann
  3. Durch alle zurückgelieferten Datensätze iterieren und jeweils die URL des Bildes auslesen.
  4. Dieses Bild an die entsprechende Stelle in der Collage schreiben
  5. Das fertige Bild ausgeben

Dafür bietet sich die postUserFunc aus dem stdWrap-Baukasten an, da eine Extension viel zu überdimensioniert wäre. Ich gehe davon aus, dass es einen Marker COLLAGE gibt. Wir erzeugen also auf der Seite, die die Collage bekommen soll, ein Extension-Template mit dem folgenden Inhalt:

includeLibs.something = fileadmin/scripts/collage.php

page.10.marks.COLLAGE = TEXT
page.10.marks.COLLAGE {
   postUserFunc = user_generateCollage
}

Zunächst laden wir also die Datei collage.php, die sich im Verzeichnis fileadmin/scripts befindet. Anschließend erzeugen wir am Marker COLLAGE ein TEXT-cObject, dessen Inhalt wir über die Funktion user_generateCollage bestimmen. Die Funktion (deren Name immer mit user_ anfangen muss) wiederum befindet sich in der Datei collage.php. Ich habe die Kommentare direkt in die Datei geschrieben um die jeweiligen Arbeitsschritte zu kennzeichnen. Bitte beachtet ausserdem, dass dies eine ganz speziell angepasste Auftragsarbeit war – manche Stellen hätte man sicherlich generischer anpacken können.

Inhalt der Datei: collage.php

<?php

function user_generateCollage($one,$two) {
   // nur die fe_user nehmen, die sich auf der Seite mit der
   //pid = 170 befinden
   $where .= " pid = 170";
   // eine Usergruppe (hier 27) soll ausgeblendet werden -
   // der Vorstand mag nicht auf's Bild :-)
   $where .= " AND usergroup !='27'";
   // nur Datensätze auswählen die auch ein Bild haben
   $where .= " AND image != ''";
   // stellt sicher, dass keine verstecken o. ausgeblendeten
   // Daten erfasst werden
   $enableFields = $GLOBALS['TSFE']->cObj->
                                     enableFields('fe_users');
   $where .= " ".$enableFields;
   // Zufallsgenerator an...
   $order_by = " RAND() " ;
   // ... und genau 20 Ergebnisse mitnehmen
   $limit = 20;

   // Datenbank-Query absetzen
   $res = $GLOBALS["TYPO3_DB"]->exec_SELECTquery( ' * ',
                    'fe_users', $where, '',$order_by, $limit);

   // img-Objekt aufbauen, zunächst als GIFBUILDER
   $img["file"] = 'GIFBUILDER';
   // Größe der Collage festlegen
   $img['file.']["XY"] = '228,389';
   // als Format wird PNG verwendet
   $img['file.']["format"] = 'png';
   // Die Qualität der auszugebenden Collage soll maximal sein
   $img['file.']["quality"] = '100';

   // Nun gehen wir durch alle Zeilen (aeussere Schleife)
   // und alle Spalten (innere Schleife)
   for ($y = 0; $y < 5; $y++) {
      for ($x = 0; $x < 4; $x++) {
         // zaehler fuer die verschiedenen GifBuilderObj
         $counter = $y*100 + $x*10 + 5;
         // Ergebnis holen
         $row = $GLOBALS["TYPO3_DB"]->sql_fetch_assoc($res);
         // als GifBuilderObj das Objekt IMAGE auswaehlen
         $img['file.'][$counter] = 'IMAGE';
         // sollten mehrere Bilder hinterlegt worden sein,
         // dann nimm das erste
         $image = split(",",$row['image']);
         $image = (is_array($image)) ? $image[0] : $image;
         // Pfad zur Bilddatei
         $img['file.'][$counter."."]["file"] =
                                        'uploads/pics/'.$image;
         // Format festlegen
         $img['file.'][$counter."."]["file."]['format'] = 'jpg';
         // Breite des Bildes
         $img['file.'][$counter."."]["file."]['width'] = '57';
         // Hoehe des Bildes
         $img['file.'][$counter."."]["file."]['height'] = '78';
         // Nun wird das Bild positioniert:
         //Hier ersteinmal die x-Position
         $offx = (int)($x*57)+1;
         // ... und hier die Y-Position
         $offy = (int)($y*78)+1;
         // Offset setzen
         $img['file.'][$counter."."]['offset'] = "$offx,$offy";
      }
   }
   // * Magic!! * Nun wird die Collage gerendert :-)
   $imgResource = $GLOBALS['TSFE']->cObj->IMAGE($img);
   // und zurückgegeben
   return $imgResource;
}
?>

Voilá – that’s it – und so sieht’s aus:

Die fertige Collage (Symboldarstellung)

Die “Magie” letztlich steckt darin, ein durch PHP erzeugtes TS-Array mit dem GIFBUILDER-Objekt durch die Funktion cObj->IMAGE rendern zu lassen.