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:
- Einen Query über die fe_user-Tabelle, der zufällig 20 User ausliest
- Ein leeres Bild erzeugen, welches die Collage aufnehmen kann
- Durch alle zurückgelieferten Datensätze iterieren und jeweils die URL des Bildes auslesen.
- Dieses Bild an die entsprechende Stelle in der Collage schreiben
- 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 “Magie” letztlich steckt darin, ein durch PHP erzeugtes TS-Array mit dem GIFBUILDER-Objekt durch die Funktion cObj->IMAGE rendern zu lassen.