Archive for the ‘zend framework’ tag
PHP und Zend Framework Video-Podcasts und -Serien
Falls ihr euch in das Zend Framework einarbeiten wollt, müsst, oder es kennenlernen möchtet, seien euch neben dem offiziellen Quickstart-Guide oder Büchern zu Zend Framework auch noch 2 Video-Podcasts ans Herz gelegt. Mein Favorit ist Zendcasts:
In gut verständlichem Englisch und mittlerweile über 60 Videos erklärt Jon Lebensold wirklich alles, was man mit dem Framework anstellen kann. Wirklich zu empfehlen.
Eine weitere Serie stammt von “integral30″ und ist auf YouTube zu finden. Es gibt aktuell 19 Folgen, und es wird ganz am Anfang angefangen, inklusive Erklärung des MVC-Pattern, dem Frontcontroller usw. Einziges Problem: Das indische Englisch, ich persönlich kann das nicht allzu lang ertragen, muss ich zugeben. Aber trotzdem sehenswert.
Ein gutes Anfänger PHP Video Tutorial bietet www.php-kurs.com. 39 Videos auf YouTube und weitere per Bestellung. Wer sich mit PHP beschäftigen möchte sollte unbedingt die YouTube Playlisten durchstöbern.
Sehr bekannt sind ja auch die Video2Brain DVDs, und auch zu PHP 5.3 gibt es eine randvolle DVD. Bin sehr gespannt wann und ob auch mal eine zum Zend Framework geben wird.
Habt ihr Tipps zu guten Videoserien, evtl. sogar für Fortgeschrittene/Profis? Welche Audio- und Video-Podcasts habt ihr aboniert zum Thema PHP, Zend Framework oder Webentwicklung allgemein? Deutsch und Englisch willkommen!
Einen eigenen Zend_Filter erstellen
Zend_Filter sind kleine Hilfsfunktionen, die Eingaben filtern und eine eventuell geänderte Ausgabe zurück liefern falls die Eingabe nicht den Kriterien entsprach. Dabei besteht die Ausgabe immer aus einer Untermenge der Eingabe, ungültige Zeichen werden heraus gefiltert. Oder aber Eingabezeichen werden transformiert, sprich umgewandelt. Häufig genutzte Filter sind beispielsweise
Zend_Filter_Alpha <- filtert alle Zeichen raus die keine Buchstaben sind Zend_Filter_HtmlEntities <- transformiert alle Sonderzeichen in ihre HTML Entities Zend_Filter_Digits <- filtert alle Zeichen raus die keine Zahlen sind Zend_Filter_StringToLower <- transformiert alle Zeichen in Kleinbuchstaben
Hier einige Beispiele wie man sie nutzen kann: Weiterlesen »
Adress- und Kontaktdaten als VCard exportieren
VCards sind kleine Dateien, die Personen- und Adressbuch-Daten enthalten. Diese Dateien kann man wunderbar an Emails dranhängen, oder aber als Export + Import zwischen verschiedenen Programmen (Outlook, Thunderbird, Mac OS X Addressbook etc) nutzen. Als Premium-Mitglied bei Xing kann man alle seine Kontakte dort auch exportieren und in die oben genannten Applikationen oder auch in sein Handy importieren.
Wie sieht eine VCard aus? Ungefähr so:
BEGIN:VCARD VERSION:3.0 N:Kliewe;Michael FN:Michael Kliewe ADR;TYPE=HOME,WORK:;;Am Stadtgarten 8a;Oelde;;59302 EMAIL;TYPE=HOME;TYPE=WORK:emailadresse@domain.de EMAIL;TYPE=PREF:wichtige@emailaddresse.de END:VCARD
Man sieht, das Format ist schon recht alt (1998), heutzutage würde man wahrscheinlich XML wählen. Aber es ist nun mal DER Standard, wir wollen die Adressdaten aus unserer Applikation als VCard exportieren. Dazu gibt es bereits einige vorgefertigte Klassen (Contact_Vcard_Build, PHP vCard Class 2.0, class vcard), die ich aber hier nicht nutzen möchte, da sie entweder das ältere 2.1 Format nutzen oder kein UTF-8 unterstützen. Hier eine einfache Lösung mit wenigen Zeilen Code:
<?php
header("Content-type:text/x-vCard; charset=utf-8");
header("Content-Disposition: attachment; filename=vcardexport.vcf");
$first = "Michael";
$last = "Kliewe";
$email = "emailadresse@domain.de";
?>
BEGIN:VCARD
VERSION:2.1
N:<?php echo($last); ?>;<?php echo($first); ?>
FN:<?php echo($first); ?> <?php echo($last); ?>
EMAIL;PREF;INTERNET:<?php echo($email); ?>
REV:<?php echo date('Y-m-d H:i:s'); ?>
END:VCARD
Das ist natürlich nur der Anfang und ein erster Test. Aber das Prinzip ist recht einfach: Jede Zeile enthält eine Eigenschaft, wie “Voller Name”, “Email-Adresse”, “Wohnadresse”, “Notizen”, “Urls”, “Fotos”, “Firma”, “Geburtstag” und so weiter. Key und Value sind durch einen Doppelpunkt getrennt, spezielle Optionen wie beispielsweise das oben sichtbare “PREF” oder “TYPE” sind via Semikolon getrennt hinzuzufügen. Weitere Informationen erhält man auf der englischen Wikipedia-Seite (die deutsche ist nicht so umfangreich). Man kann auch mehrere Kontakte in einer vcf-Datei exportieren, und objektorientiert mit dem Zend Framework sieht das ganze dann ungefähr so aus:
public function exportvcardAction()
{
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$vcardString = '';
$contacts = $this->service->getAllContacts();
foreach ($contacts as $contact) {
/* @var $contact App_Addressbook_Contact */
$vcardString .= $contact->getContactAsVcardString() . "\r\n";
}
if (count($contacts) == 1) {
$filename = str_replace(" ", "_", $contacts[0]->getFirstname().' '.$contacts[0]->getSurname());
} else {
$filename = 'VCARDS';
}
$this->getResponse()->setHeader('Content-Type', 'text/x-vCard; charset=utf-8');
$this->getResponse()->setHeader('Content-Disposition', 'attachment; filename="'.$filename.'.vcf"');
$this->getResponse()->setHeader('Content-Length', strlen($vcardString));
$this->getResponse()->setHeader('Connection', 'close');
$this->getResponse()->setBody($vcardString);
}
Damit werden nun also alle Kontakte iteriert und die einzelnen VCard-Strings aneinandergehängt. Wir nutzen hier die entsprechenden Funktionen, um das Layout und den ViewRenderer zu deaktiveren und alle Informationen ins Response-Objekt zu schreiben
Die Funktion getContactAsVcardString() habe ich so umgesetzt:
public function getContactAsVcardString()
{
$data['BEGIN'] = 'VCARD';
$data['VERSION'] = '3.0';
$data['PRODID'] = '-//company contact export Version 1//EN';
$data['REV'] = date('Y-m-d H:i:s');
$data['TZ'] = date('O');
$data['FN'] = $this->getDisplayName();
$data['N'] = $this->getSurname().';'.$this->getFirstname();
if ($this->getTitle() != '') {
$data['TITLE'] = $this->getTitle();
}
foreach ($this->getMailAddresses() as $mailAddress) {
$data['EMAIL;TYPE=internet'] = $mailAddress;
}
if ($this->getNotice() != '') {
$data['NOTE'] = $this->getNotice();
}
$data['END'] = 'VCARD';
$exportString = '';
foreach ($data as $index => $value) {
$exportString .= $index . ':' . $value . "\r\n";
}
return $exportString;
}
Als Ergebnis erhält man eine Datei zum Download mit allen $contacts incl. Details.
Zend_View Output Filter: Whitespaces aus HTML entfernen
Zend Framework implementiert das Intercepting-Filter-Pattern, und dadurch ist es sehr einfach nach der Generierung des HTML-Codes (Postprocessor) einen Filter einzufügen, der die Ausgabe noch verändert. Natürlich gibt es auch Präprozessor-Filter, in denen man häufig die Authentifizierung prüft oder Eingabeparameter validiert.
Vorstellen könnte man sich beispielsweise einen Filter, der bestimmte Textblöcke ersetzt, um zum Beispiel aus “mailto:”-Links Bilder zu generieren oder sie anders zu schützen, beispielsweise mittels Javascript.
Man kann sich auch einen Filter vorstellen, der das HTML-Ergebnis durch den HTML-Purifier schickt, ihn also W3C-kompatibel macht. Dies sollte man jedoch vermeiden wenn eben möglich und seinen HTML-Code auch vorher bereits korrekt generieren.
In diesem Artikel möchte ich einen ganz einfachen Filter einrichten, der alle Tabs, Leerzeichen und Umbrüche entfernt, sodass der komplette HTML-Code in einer Zeile steht und keine unnötigen Whitespaces enthält. Man kann damit den Traffic um ca. 3-15% (nicht gzip’t) verringern, nur durch das Entfernen von Tabs und Leerzeichen! Es ersetzt natürlich nicht die Aktivierung von gzip, um “richtig” Traffic zu sparen und die Webseite schneller zu machen.
Wir schreiben uns also einen einfachen Filter, der die Aufgabe erfüllt:
<?php
class App_View_Filter_Minify implements Zend_Filter_Interface
{
public function filter($string)
{
return preg_replace(
array('/>\s+/', '/\s+</', '/[\r\n]+/'),
array('>', '<', ' '),
$string
);
}
}
Die filter() Methode bekommt den Ausgabestring übergeben, wir filtern alle Whitespaces heraus und geben das Ergebnis zurück. Wir sind hier etwas vorsichtig und filtern nur direkt vor oder nach HTML-Tags.
Diesen Filter müssen wir nun noch einbauen, und das geht wie folgt in der Bootstrap.php, wo wir im View-Objekt den Filter aktivieren:
/**
* Add Output filters to View
*
* @return void
*/
protected function _initViewFilter()
{
$view = $this->getResource('view');
$view->addFilterPath('App/View/Filter', 'App_View_Filter_')
->addFilter('Minify');
}
Wir fügen dem View-Objekt also einen Pfad hinzu, wo wir den Filter abgelegt haben, und übergeben dann noch den Namen des Filters. Das Zend Framework wird dann nach der Abarbeitung der ControllerAction und dem Rendern des View-Scripts diesen Filter benutzen und die Ausgabe verändern.
Ergebnis ist dann eine einzelne Zeile HTML-Code ohne Whitespaces. Hier ein paar Ergebnisse dieses doch sehr einfachen Filters:
| Größe vorher (KB) | Größe nachher (KB) | Ersparnis (%) |
|---|---|---|
| 6,1 | 5,5 | 9,9 |
| 100,9 | 90,2 | 10,6 |
| 4,6 | 4,2 | 8,7 |
| 18,9 | 18,6 | 1,6 |
Vergleich der großen PHP-Frameworks: Anzahl Jobs
Wollte nur kurz einen Link in den Raum werfen, den man vielleicht mal länger beobachten kann, um zu sehen wie es mit den PHP Frameworks steht:

| zend framework, cakephp, symfony, codeigniter Job Trends | zend framework jobs – cakephp jobs – symfony jobs – codeigniter jobs |
Das wars auch schon


