30. Januar 2009 Zend Framework View Helper

in Kategorie PHP

Tags: ,


Da ich mich momentan wieder einmal intensiver mit dem Zend Framework auseinander setzen kann, nutze ich die Gelegenheit und schildere hin und wieder ein paar Tipps zum Umgang mit dem Framework.

ZF ist ein Framework für PHP und bietet etliche Komponenten, die dem professionellen PHP-Entwickler die alltägliche Arbeit wesentlich erleichtern. Ich möchte hier keine Einführung in ZF geben. Alle Anfänger oder Interessierte seien auf die hervorragende Dokumentation von Zend verwiesen. Wer mit den grundlegenden Design Patterns (wie z.B. MVC) vertraut ist, der wird sich auch schnell in der API des Frameworks zurechtfinden.

View Helper

In diesem Artikel möchte ich ein schöne Möglichkeit aufzeigen, wie jeder selbst häufig wiederkehrende Logik, die sich in den View Scripts befindet, in sog. View Helper auslagern kann.
Dies schafft nicht nur schlankeren und übersichtlicheren Code und entschlackt die View-Scripts von den unübersichtlichen PHP-Konstrukten innerhalb der Templates, sondern führt zu wiederverwendbarem Code.
Ein View Helper stellt hierzu Methoden bereit, die innerhalb der View Scripts aufgerufen werden können.

Mittlerweile bringt ZF selbst etliche, sehr nützliche View Helper mit. In der Dokumentation werden diese mit Beispielen erklärt. Besonders erwähnen möchte ich hier die ganzen Head…-Helper, welche in Zusammenhang mit Zend_Layout extrem nützlich sind.

Eigene View Helper schreiben

Da Zend den Ansatz verfolgt, dass jede Komponente auch einfach erweiterbar sein soll, ist dies natürlich auch bei den View Helpern möglich. Das Grundgerüst eines eigenen View Helpers ist ganz einfach:

class My_View_Helper_Example
{
	public function example()
	{
		return 'example';
	}
}

»My« sollte durch einen passenden Namespace des Entwicklers ausgetauscht werden. Empfohlen wird z.B. die Verwendung der eigenen Initialen. Wer zusätzlich innerhalb des Helpers Zugriff auf die Instanz von Zend_View benötigt, der leitet seinen View Helper von Zend_View_Helper_Abstract ab. Diese abstrakte Klasse implementiert die Methode setView($view), die auch automatisch vom Framework selbst aufgerufen wird. Daraufhin hat man über die Variable $view den gewünschten Zugriff.

Um nun die Methode example() innerhalb der View Scripts aufrufen zu können, müssen wir dem Framework mitteilen, wo die Klasse zu finden ist. Dazu muss man einen Helper-Pfad zur View-Instanz hinzufügen:

$view = new Zend_View();
 
// Setze den Pfad auf /path/to/more/helpers, 
// mit dem Präfix 'My_View_Helper'
$view->setHelperPath('/path/to/more/helpers', 'My_View_Helper');

Einige View Helper, die ich gerne verwende…

Natürlich habe ich mir auch selbst einige kleine, nützliche Helferlein geschrieben. Drei davon möchte ich hier vorstellen. Häufig benötigt man innerhalb der View Scripts den vollständigen, aktuellen URL.
Mit den $_SERVER Variablen, die von PHP bereitgestellt werden, lässt sich dieser Zusammensetzen. Der CurrentUrl-Helper stellt die Methode currentUrl() bereit, mit der ich diesen URL direkt verwenden kann:

class MV_View_Helper_CurrentUrl {
 
	public function currentUrl()
	{
		$http_mode = 
			(!empty($_SERVER['HTTPS'])) ? 'https://' : 'http://';
 
		return $http_mode . $_SERVER['HTTP_HOST'] . 
			$_SERVER['REQUEST_URI'];
	}
}

Wer innerhalb der View Scripts Bilder, JavaScript- oder CSS-Dateien einbinden möchte (und das tut wohl jeder), der muss erstmal den korrekten URL zu diesen Resourcen finden. Hierzu benötigt man den Basis-URL. Beispiel: Ich befinde mich auf der Seite http://www.example.com/site/dir/page1. Mein CSS-Stylesheet liegt unter http://www.example.com/site/css/style.css. Meine Basis-URL ist http://www.example.com/site. Damit kann ich »/css/style.css« anhängen und habe den benötigten URL. Diese Basis-URL stellt der Front-Controller zur Verfügung:

require_once 'Zend/Controller/Front.php';
 
class MV_View_Helper_BaseUrl {
 
	public function baseUrl($path = '')
	{
		return Zend_Controller_Front::getInstance()->getBaseUrl() . 
			trim($path);
	}
}

Nun erhält man innerhalb des View Scripts mit folgendem Aufruf ganz einfach den benötigten URL:

echo $this->baseUrl('/css/style.css");

Zusätzlich verwende ich ganz gerne den CopyrightYear-Helper. Häufig kommt es vor, dass man im Footer-Bereich einer Website und/oder in den Meta-Tags nach dem Copyright die Jahreszahl platziert. Dabei möchte man diese Jahreszahl aber aktuell halten und zusätzlich den Zeitraum darstellen, seit dem die Website existiert (z.B. 2006-2009). Da dies praktisch in jedem Projekt vorkommt, habe ich mir diesen Helper geschrieben:

class MV_View_Helper_CopyrightYear {
 
	public function copyrightYear($year)
	{
		if(date('Y') > $year)
			return $year. ' – ' . date('Y');
		else
			return $year;
	}
}

Natürlich kann man sich darüber streiten, ob hierfür extra ein View Helper nötig ist. Ich selbst finde die Lösung aber ganz elegant.

Fazit

Mit den View Helpern schafft Zend eine schöne und mächtige Möglichkeit häufig wiederkehrende Aufgaben in den View Scripts auszulagern. So kann sich jeder Entwickler sein persönliches Packet an Helpern anlegen und seine tägliche Arbeit produktiver gestalten.

Die vorgestellten Helper gibt es unter folgendem Link zum Download:

Nun viel Spass beim schreiben eigener View Helper. Und zögert bitte nicht, mich über eure Entwicklungen zu informieren!

Ähnliche Artikel


Der Beitrag wurde am Freitag, den 30. Januar 2009 um 16:35 Uhr veröffentlicht und wurde unter PHP abgelegt. du kannst die Kommentare zu diesen Eintrag durch den RSS 2.0 Feed verfolgen. du kannst einen Kommentar schreiben, oder einen Trackback auf deiner Seite einrichten.

Kommentare

  1. Am 28. März 2009 um 00:04 Uhr
    Eugen G. gravatar

    Ich hab deinen CurrentUrl-Helfer etwas umgeschrieben:

    class My_View_Helper_CurrentUrl extends Zend_View_Helper_Abstract
    {
    protected static $currentUrl = null;

    public function currentUrl()
    {
    if (self::$currentUrl === null) {
    $http_mode = (!empty($_SERVER['HTTPS'])) ? ‘https://’ : ‘http://’;
    $http_mode .= $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

    self::$currentUrl = $http_mode;
    }

    return self::$currentUrl;
    }
    }

    Gleiches kann natürlich auch auf bspw. den BaseUrl-Helfer angewandt werden.

    Guter Beitrag übrigens, weiter so!

  2. Am 28. März 2009 um 11:36 Uhr
    Mario Volke gravatar

    Ja gute Idee hier noch ein Singleton mit einzubauen.

    Vielleicht habe ich das im Beitrag nicht ganz deutlich gemacht (betrifft aber nicht deinen Kommentar):
    Wenn man nicht die absolute URL benötigt, dann kann man auch direkt im View $this->url() verwenden, dadurch erhält man die aktuelle Route.

  3. Am 15. August 2009 um 02:41 Uhr
    Datum per View Helper umwandeln | Der ewige Anfänger gravatar

    [...] dem webaholics-Blog habe ich ein lesenswertes Tutorial über Zend View Helpers [...]

  4. Am 15. August 2009 um 02:52 Uhr
    angel gravatar

    Ich weiß nicht ob das die beste Variante ist Datum-Werte zu konvertieren. Nachdem ich den Artikel gelesen habe, habe ich folgenden (meinen ersten) Helper geschrieben:

    set($datetime);

    return $date->get(’H:mm, FFF’);
    }
    }

  5. Am 15. August 2009 um 02:54 Uhr
    angel gravatar

    hm, klappt nicht mit dem html-konverter, nochmal:

    class Angels_Date_Helper_ToTimeAndDate //extends Zend_View_Helper_Abstract
    {

    public function toTimeAndDate ($datetime)
    {
    $date = new Zend_Date();
    $date->set($datetime);

    return $date-<get(’H:mm, FFF’);
    }
    }

Einen Kommentar schreiben