Mrz 15

Da ich dieses Problem gerade mal wieder hatte, dachte ich mir, ich schreibe mal die Arbeitsschritte nieder:

Die Grundsituation ist die Folgende: TYPO3 läuft auf einem Server und soll nun auf einen neuen Server umgezogen werden. Man könnte dies natürlich nun mittels FTP und phpMyAdmin bewerkstelligen – aber wir haben einen SSH-Zugang und nutzen diesen daher. Die Anleitung geht davon aus, dass wir Zugang zu einer Shell haben. Linux und Mac OS X haben diese bereits an Board – Windows User sollten auf PuTTY ausweichen (in diesem Fall sieht der erste Schritt anders aus – bitte die Doku kontaktieren):

  1. Als erstes müssen wir uns mittels SSH auf dem Server einloggen. Statt “loginname” geben wir das Login an, welches wir vom Serverbetreiber erhalten haben und statt “www.alter-domainname.de” geben wir natürlich unseren Domainnamen (von der Domain, die wir umziehen wollen) an.:
    ssh -l loginname www.alter-domainname.de
  2. Nun wechseln wir in das “public_html”-Verzeichnis  (also dem Verzeichnis, welches unsere “index.php” für den TYPO3-Betrieb enthält. Unter Umständen ist der SHH-Zugang so konzipiert, dass man nach dem einloggen direkt dort landet. Dieses Verzeichnis kann auch “html”, “web” oder ähnlich heissen).
    cd pfad1/pfad2/public_html
  3. Nun fertigen wir ein Backup der Datenbank an. Genaugenommen müssten wir sicherstellen, dass keinerlei Schreibzugriffe mehr stattfinden, indem wir den Apache-Webserver stoppen.”HOSTNAME” ist der Name des Datenbankservers (ist oftmals “localhost”), “USERNAME” eben der Username und das Passwort muss direkt hinter “-p” geschrieben werden. Das Backup landet nun direkt in der Datei “backup.sql” in unserem “public_html”-Verzeichnis
    mysqldump -h HOSTNAME -u USERNAME -pPASSWORT DATENBANKNAME > backup.sql
  4. Jetzt fertigen wir ein Backup aller Dateien an – dafür verwenden wir den Befehl “tar” an. Dieser packt alle Dateien in eine einzige Datei und komprimiert diese sogar anschließend noch. Durch “website.tar.gz” wird der Name der Datei festgelegt, der die ganzen gepackten Dateien aus dem public_html-Verzeichnis beinhalten soll. Die Angabe des Punktes “.” besagt, dass wir das Backup vom aktuellen Verzeichnis anfertigen wollen.
    tar -czvf website.tar.gz .
  5. Nun loggen wir uns mit einer zweiten Shell in den neuen Server ebenfalls per SSH ein:
    ssh -l loginname www.neuer-domainname.de
  6. Und wechsel bei diesem ebenfalls in das “public_html”-Verzeichnis
    cd pfad1/pfad2/public_html
  7. Mittels “wget” übertragen wir nun das Backup direkt vom alten auf den neuen Server
    wget www.alter-domainname.de/website.tar.gz
  8. Als nächsten entpacken wir das Tar-File auf dem neuen Server:
    tar -xzvf website.tar.gz
  9. Nun müssen wir einfach nur eine neue Datenbank auf dem neuen Server mit dem Namen “NEUERDATENBANKNAME” (hier natürlich einen eigenen Namen wählen) anlegen – beispielsweise mittels Sysadmin-Tool wie Confixx, SysCP oder phpMyAdmin
  10. Und spielen das Datenbank-Backup wieder ein
    mysql -h HOSTNAME -u USERNAME -pPASSWORT NEUERDATENBANKNAME < backup.sql
  11. Jetzt passen wir noch die Zugangsdaten für die Datenbank in der Datei “typo3conf/localconf.php” an – also Server, Datenbank, Username, Passwort)
  12. und voilá – wir sind ersteinmal fertig.
  13. Um nun dieses Setup zu testen, kann man in die Datei “hosts” (bei Mac OS X in /private/etc/) einen Eintrag in der folgenden Art hinterlegen – damit werden alle Anfragen an die Domain direkt an die neue IP-Adresse des Servers weitergeleitet und man kann die umgezogene TYPO3-Installation in Ruhe testen. Erst wenn alles zur Zufriedenheit läuft, kann man im DNS die entsprechenden Änderung vornehmen.
    # IP-Adresse  Domain
    12.34.56.78   www.neuer-domainname.de
  14. Die Anleitung geht prinzipiell davon aus, dass sowohl alter, wie auch neuer Datenbankserver die selbe Kodierung für die Datenbank verwenden. Wenn dies nicht so sein sollte, wird der Workflow etwas komplizierter – dies werden wir in einem der nächsten Postings behandeln.
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.

Nov 4
PHP Conference
icon1 alex | icon2 Community, PHP | icon4 11 4th, 2007| icon3No Comments »

Am Dienstag ist die International PHP Conference in Frankfurt. Wir werden da sein. Vielleicht sieht man sich.