Browsing all articles from Mai, 2009
Mai
28

Zend_Mail Filestream

Um Zend_Mail zu testen benötigt man keinen Online Mailserver oder einen Webserver auf seinem lokalen Entwicklungssystem. Warum nicht mit einem Transporter arbeiten, der einem die versandten E-Mails in eine Datei schreibt? Und genau das stelle ich hier vor.

Man benötigt zuerst in seiner Library den Transporter

class Zorta_Mail_Transport_File extends Zend_Mail_Transport_Abstract
{
        public function _sendMail()
        {
                $file = APPLICATION_PATH . "/../logs/mails.log";
                $fp = fopen($file, 'a');
                fwrite($fp, $this->header);
                fwrite($fp, "\r\n");
                fwrite($fp, $this->body);
                fwrite($fp, "\r\n\r\n\r\n#############################################################\r\n\r\n\r\n");
                fclose($fp);
        }
} 

Mit diesem Transporter ist es schon fast erledigt. Was wird hier getan? Ganz einfach. Es gibt ein Verzeichnis logs und darin eine Datei mail.log. Diese öffnet der Transporter und gibt den Header und den Body hinein. Mehr Daten benötigt man normalerweise nicht. Falls doch, so kann man den Transporter durchaus erweitern. Zum Beispiel um die Anhänge einer E-Mail usw.

Um nun automatisiert den Transporteu zuzuordnen kann man in der Bootstrap den folgenden Code verwenden.

protected function _initMail()
    {
        if(APPLICATION_ENV == "development")
        {
            $mail_transport = new Zorta_Mail_Transport_File();
            Zend_Mail::setDefaultTransport($mail_transport);
        }
        else
        {
            $mail_conf = Zend_Registry::get('CONFIG')->mail;

            $config = array('auth' => 'login',
                			'username' => $mail_conf->smtp->user,
                			'password' => $mail_conf->smtp->pass);

            $mail_transport = new Zend_Mail_Transport_Smtp($mail_conf->smtp->host, $config);
            Zend_Mail::setDefaultTransport($mail_transport);
        }

    }

Es wird geprüft, ob man im Entwicklungsstadium ist. Die Konstante “APPLICATION_ENV” beinhaltet dies. Wenn man sich in Entwicklung befindet, dann greift er auf den, so eben erstellten, Datei Transporter zu. Ansonsten wird auf den SMTP Transporter zugegriffen. Wie man die Konfiguration des SMTP Transporters initalisiert ist einem selbst überlassen, daher gehe ich hier nicht weiter auf das obige Beispiel ein. Mittels der Methode “setDefaultTransport” wird für das Zend_Mail global der Transporter gesetzt.

Wenn man nun eine E-Mail erstellt und versendet landet sie in angegebener Textdatei und sieht in etwa so aus:

From: Zorta Dateiemail <test@zorta.de>
To: Alberto <denis_zunke@gmx.de>
Subject: Testnachricht
Date: Thu, 28 May 2009 21:51:40 +0200
Content-Type: multipart/alternative; charset="UTF-8";
 boundary="=_5e42e31ef1a7fb8fe32142a32f672f11"
MIME-Version: 1.0

--=_5e42e31ef1a7fb8fe32142a32f672f11
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Textinhalt

--=_5e42e31ef1a7fb8fe32142a32f672f11
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<b>HTML INHALT</b>

--=_5e42e31ef1a7fb8fe32142a32f672f11--
Mai
26

Mehrsprachigkeit mit Zend_Application

Eine Multilinguale Seite mit Zend_Application aufzubauen ist gar nicht so schwer, wie man denkt. Ich gehe hier davon aus, dass man schon Erfahrung mit Zend_Application hat und werde es nicht in jeder Kleinigkeit erklären. Das ganze basiert auf dem Zend Framework 1.8.1

Wenn man am Ende alles richtig eingebaut hat anhang der Beispieldaten, dann sind die Sprachen Deutsch und Englisch verfügbar über die folgenden Adressen:

http://en.domain.tld -> Englisch
http://de.domain.tld -> Deutsch
http://fr.domain.tld -> Deutsch, da dies als Standard gesetzt wird in der Bootstrap

Zuerst einma benötigt man Translate Dateien. Ich habe dafür eine Verzeichnisstruktur angelegt, in der sich ein Ordner für jede Sprache findet. In meinem Fall sind dies “de” und “en”. In diesen liegen dann die verschiedenen PHP Dateien mit Arrays. Hier kurz Beispielhaft für Deutsch und Englisch jeweils die string.php

return array(

'WELCOME' => 'Willkommen zum Test'

);
return array(

'WELCOME' => 'Welcome to the Test'

);

Über die application.ini setzt man die nötigen Routen, Locale und Translate Einstellungen. Bitte die angegebene Domain im Router auch in die richtige ändern.

resources.router.routes.language.type = "Zend_Controller_Router_Route_Hostname"
resources.router.routes.language.route = ":lang.domain.tld"
resources.router.routes.language.defaults.controller = "index"
resources.router.routes.language.defaults.action = "index"
resources.router.routes.language.defaults.lang = "de"
resources.router.routes.language.chains.index.type = "Zend_Controller_Router_Route"
resources.router.routes.language.chains.index.route = ":controller/:action/*"
resources.router.routes.language.chains.index.defaults.module = "default"
resources.router.routes.language.chains.index.defaults.controller = "index"
resources.router.routes.language.chains.index.defaults.controller = "index"
resources.router.routes.language.chains.base.type = "Zend_Controller_Router_Route"
resources.router.routes.language.chains.base.route = "/*"
resources.router.routes.language.chains.base.defaults.module = "default"
resources.router.routes.language.chains.base.defaults.controller = "index"
resources.router.routes.language.chains.base.defaults.controller = "index"

resources.translate.adapter = "array"
resources.translate.data = APPLICATION_PATH "/languages"
resources.translate.locale = "en"
resources.translate.options.disableNotices = true
resources.translate.options.scan = "directory"

Und zuletzt die Bootstrap Klasse

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

protected function _initRequest()
{
// Nötige Abhängigkeiten auflösen
$this->bootstrap('FrontController');
$this->bootstrap('router');

// Den Frontcontroller holen
$front = $this->getResource('FrontController');

// Ein Request Objekt in den Frontcontroller setzen
$request = new Zend_Controller_Request_Http();
$request->setBaseUrl('/');
$front->setRequest($request);

// Den Request in die Registry des Bootstrap Objekt setzen
return $request;
}

protected function _initLang()
{
// Die nötigen Abhhängigkeiten aufbauen
$this->bootstrap('FrontController');
$this->bootstrap('router');
$this->bootstrap('translate');

// Den Frontcontroller mit dem Request Objekt holen und den Router ausführen
$front = Zend_Controller_Front::getInstance();
$request = $front->getRequest();
$router = $front->getRouter();
$router->route($request);

// Das Translate Objekt holen
$lang = $this->getResource('translate');

// Prüfen, ob die ausgewählte Sprache zur verfügung steht, wenn nicht, dann Standard setzen.
if (!$lang->isAvailable($front->getRequest()->getParam('lang','de'))) {
$front->getRequest()->setParam('lang','de');
}

// Die ausgewählte Sprache in das Translate setzen
$lang->setLocale($front->getRequest()->getParam('lang'));

return;
}

}

Zum Test kann man sich einen String ausgeben lassen in der View

<?=$this->translate('WELCOME')?>

Das ganze ist natürlich noch um einige Features erweiterbar, aber mit diesen Schritten hat man eine gute Basis um weiter zu kommen. Interessant sind für den Einbau wohl noch Zend_Cache, entsprechende andere Router oder das speichern der Standardsprache in der Konfiguration für schnelle Änderungen.

Mai
24

Zend Studio 7.0

Zend Stuido 7.0 Early Access Das Zend Studio 7.0 ist in einer Beta Version heraus gekommen. In der neuen Version werden einige neue Features eingebunden, auf die manch einer auch schon Sehnsüchtig gewartet hat.

Die neue Version beruht auf PDT 2.x und bindet zusätzlich, wie bisher, noch die Zend Framework Unterstützung ein. Jeder, der die Version testen will kann dies über die Seite [1] des Early Acess machen. Entweder man nutzt die 30 Tage Testversion oder man verwendet seine alte Serial.

Für mich am entscheidensten bei der neuen Version sind u.a. die PHP 5.3 Unterstützung, der Einbau des Zend Framework 1.8 inkl. Zend_Tool unterstützung und die extreme Geschwindigkeit. Die Version 7.0 ist mit dem Vorgänger kaum zu vergleichen. Das starten und beenden geht um einiges schneller auf einem Windows Betriebssystem.

Jeder aber sollte sich selber überzeugen von der neuen Version.

[1] http://www.zend.com/en/products/studio/studio-7-early-access

Mai
15

Bandbreiten testen

Immer wieder stößt man auf das Problem, dass man ein Projekt gerne mit anderen Bandbreiten testen würde als man hat. Es gibt dafür natürlich viele Programme, die einem eine Statistik über die verschiedenen Geschwindigkeiten ausgeben. Auf die ist aber eigentlich kein Verlass.

Für MS Windows Nutzer gibt es da eine andere Lösung. Der NetLimiter [1]. Ein Programm, das ich persönlich zu schätzen gelernt habe. Mit diesem lässt sich die Bandbreite für bestimmte Programme begrenzen. Das geht leider nur in der Pro Version, so dass man sich entweder auf 28 Tage Shareware begrenzen muss oder man erwirbt es. Es lohnt sich auf jedenfall das Programm zu kaufen.

Die Anwendung ist auch recht einfach. Installieren und starten. Das Programm erkennt automatisch welche Prozesse laufen und diesen könnt ihr dann einen Down- und einen Upload verpassen. So lassen sich z.B. im Firefox wunderbar alle Geschwindigkeiten durchgehen. Von Analogem Modem bis zu maximaler Bandbreite, die man selber hat. Nur, wenn man höhere Geschwindigkeiten, als die eigene, testen möchte, ist man noch auf andere Anbieter angewiesen.

Geschwindigkeitseinstellung

[1] http://www.netlimiter.com/

Mai
10

PHPUnit & Zend Studio for Eclipse

Das Zend Studio 6, also jenes, das auf Eclipse und PDT basiert, unterstüzt PHPUnit. Mit diesem kann man seine Anwendungen Testen. Nun ist aber die Frage der Anwendung. Wie ich haben auch viele anere Nutzer des Zend Studios anfängliche Probleme sich in das umfangreiche Debugging einzufinden.

Ich gehe jetzt einmal von einer frischen Installation des Zend Studio aus. Wir legen uns zunächst ein einfaches Zend Framework Projekt an. Das ganze bekommt einen Namen und den gewünschten Workspace. Die ZF Version auswählen und dann gleich auf “Fertig” klicken.

Ein einfaches Zend Framework Projekt wird jetzt inkl. Sturktur und einigen Basisdateien angelegt. Dazu auch ein Verzeichnis Test. Dies öffnen wir und sehen die Datei “AllTests.php”. Mit einem Rechtsklick auf die Datei rufen wir das Context Menü dieser Datei auf und gehen auf “Debug As”. Wie wir sehen steht dort nichts vom PHPUnit Test. Also klicken wir auf “Debug Configurations”. Es öffnet sich ein Fenster. Mit einem Rechtsklick auf “PHPUnit” gibt es ein neues Contextmenü indem wir auf “New” klicken.

So wird gleich ein neuer PHPUnit Test mit dem Namen “AllTests.php” angezeigt. Klickt diesen an. Nun ist eigentlich nur wichtig, dass ihr die 2. Option ausgewählt habt, dass alle Tests gestartet werden. Nicht wie die erste Option es angibt “Run as single Test”. Das wollen wir nicht. Noch nicht.

Nun noch ein klick auf “Debug” und das Fenster schließt sich. Es kommt die Frage, ob ihr in eine ander ePerspektive wechseln wollt. Das müsst ihr für euch Entscheiden. Ich mache es eher seltener, da ich nicht alle die Fenster aus der Debug Ansicht brauche. Rechts im Zend Studio hat sich nun ein neuer Bereich geöffnet für die PHPUnit Tests. Dort seht ihr, ob es Errors gab usw. eigentlich recht simple zu verstehen.

Wenn ihr nun auch in der Dateileiste wieder auf “AllTests.php” geht, dann findet ihr nun im Contectmenü auch den Punkt “Debug As PHPUnit Test”.