Zend Tutorial – Modulabhängiger Wechsel des Layouts

Das Wechseln des Design in Abhängigkeit von eurem Modul kann im Zend Framework über ein Plugin realisiert werden. Legt dazu im Ordner application/Plugin/Layout die Datei Changer.php an und füge folgenden Inhalt in die Datei:

class Plugin_Layout_Changer extends Zend_Controller_Plugin_Abstract
{
    public function routeShutdown(Zend_Controller_Request_Abstract $request)
    {
        //Prüft ob eine Layoutdatei in Abhängigkeit vom Modulnamen existiert
        if(is_file(Zend_Layout::getMvcInstance()->getLayoutPath()
        .$request->getModuleName().'.phtml'))
        {
            //wenn ja, dann diese setzen
            Zend_Layout::getMvcInstance()->setLayout($request->getModuleName());
        }
        else
        {
            //wenn nicht, dann Standardlayout setzen, hier: bibo
            Zend_Layout::getMvcInstance()->setLayout('bibo');
        }
    }
} 

Jetzt müsst ihr noch in eurer Bootstrap-Datei eurer Anwendung das Plugin initialisieren. Fügt dazu einfach folgende Methode eurer Bootstrap-Klasse hinzu:

protected function _initLayoutChanger()
{
	$this->bootstrap('frontController');
	$this->getResource('frontController')
		 ->registerPlugin(new Plugin_Layout_Changer());
}

Überprüft, ob folgende Einträge in eurer application.ini vorhanden sind:

bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
autoloadernamespaces.0 = "Plugin_"

Nun ändert sich automatisch das Layout, in Abhängigkeit von eurem Modulnamen. Achtet darauf, dass die entsprechende Layoutdatei im Ordner application/layouts/scripts/ genauso benannt ist, wie euer Ordnername des Moduls. Bei mir existieren beispielsweise im Ordner application/modules/ die Module „bibo“ und „login“. Demzufolge heißen meine Layoutscripte im Ordner application/layouts/scripts auch „bibo.phtml“ und „login.phtml“. Existiert keine entsprechende Layoutdatei, wird das in der Changer.php im else Zweig angegebene Layout geladen (in meinem Fall das Layoutscript bibo.phtml).

Zend Tutorial – 05 – View Helper

Um Layout- & Viewscripte zu entschlacken und von Programmcode zu befreien (MVC-Prinzip), gibt es in Zend die Möglichkeit View-Helper einzusetzen. View Helper können auch dazu verwendet werden, um wiederkehrenden Code in seperaten Dateien abzulegen und somit doppelten Code zu vermeiden.

Ich erkläre das Prinzip beispielhaft für das Einbinden eines Copyrights incl. Jahreszahl (bspw.: © 2005 – 2011).
Weiterlesen →

XML definierte Zend_Forms – Validierung auf HTML Tags

Problem:
Eine über eine xml-Datei konfiguierte Zend_Form sollte validiert werden. Es sollte u.a. überprüft werden, ob HTML-Tags eingegeben wurden. Falls dies der Fall war, sollte das Formular nicht abgeschickt werden. Dazu wurde folgende Konfiguration (Auszug) verwendet:

<text type="textarea">
	<options required="1">
		<validators>
			<regex validator="Regex">
				<options>
					<pattern>(/[^<].*[>]/)</pattern>
				</options>
			</regex>
		</validators>
	</options>
</text>

Das Pattern ist in diesem Fall noch inkorrekt, da innerhalb von XML keine Zeichen wie „<" und "&" erlaubt sind. Der nächste Versuch war, die Zeichen mittels SQL Entities darzustellen.
Das Pattern sah dann wie folgt aus:

<pattern>(/[^&lt;].*[&gt;]/)</pattern>

Aber selbst dieser Ansatz brachte keine Lösung. Ein nächster Versuch war das einbetten des Codes in einen CDATA-Block.

<pattern><![CDATA["(/[^<].*[>]/)"]]></pattern>

Doch selbst dieser Ansatz lieferte weiterhin keine Lösung. Das Formular wurde nicht korrekt validiert.

Ein anderer Lösungsansatz brachte letztendlich den Erfolg: Das Schreiben einer eigenen Validatorklasse. In der XML-Konfiguration des Formulars muss nun nur noch folgender Aufruf stehen:

<text type="textarea">
	<options required="1">
		<validators>
			<regex validator="HtmlCheck" />
		</validators>
	</options>
</text>

Es wird nun der Validator HtmlCheck aufgerufen. Diesen müssen wir nun noch definieren. Wir legen dazu eine passende Validatorklasse an:

class Validate_HtmlCheck extends Zend_Validate_Abstract
{
	// [...]
	public function isValid($value)
	{
		//Prüfen, ob HTML Tags gesetzt wurden
		if($value!=strip_tags($value))
		{
			return false;
		}

		//Ansonsten true
		return true;
	}
}

Eventuell müsst ihr den Klassennamen entsprechend eurer eigenen Projektstruktur anpassen. Damit funktionierte das Validieren des Formulars auf HTML-Tags, wenn ihr euer Formular über XML definiert habt.

Vielleicht habt ihr ja noch eine elegantere Lösung?

Zend_Form über XML validieren

Ich habe auf slideshare.net ein gutes Tutorial zu Zend_Form in Verbindung mit XML gefunden.

Link:Zend Form Tutorial

Ein weiteres Tutorial, welches sich mit Zend_Form und XML beschäftigt, findet man auf der Seite von Pieter.

Passend dazu gibts auf der Zend Framework Seite eine Dokumentation zu den Validators.

Zend Acl – Zugriff auf spezielle Ressource prüfen

Um zu Prüfen ob eine Benutzergruppe auf eine Ressource zugreifen darf kann man folgendes Code-Snippet benutzen:

$acl->isAllowed($auth->getIdentity()->role,'bibo','buchanlegen');

Die Funktion isAllowed() erwartet dabei die Parameter Benutzerrolle, Modul und Action.

Im obigen Beispiel wird in der View geprüft, ob die Rolle des aktuell eingeloggten Benutzers im Modul „bibo“ auf die Action „buchanlegen“ zugreifen darf.

Zend Tutorial – Zend Acl über ini-Datei

Es existieren 2 Module:

  • bibo (Bücherverwaltung)
  • login (Loginmodul)

Folgendes Rechtemanagement soll umgesetzt werden:
admin, user, guest

  • Admin bekommt vollen Zugriff auf auf Modul bibo und Modul login
  • User bekommt Zugriff
    • auf die Bibo-Actions: Index, Ausleihen, Zurückgeben, Suchen
    • vollen Zugriff auf Login
  • gast bekommt Zugriff
    • auf die Bibo-Action: Index
    • auf die Login-Actions:index, login (logout braucht der gast nicht, sonst wäre er ein user)

Das Rechtemanagement soll über ein .ini-Datei konfigurierbar sein.
Weiterlesen →

Zend Tutorial – 03 – Weitere Actions

1. In diesem Teil des Tutorials wagen wir uns an weitere Actions und somit auch an eine Erweiterung unserer Anwendung. Ziel ist es, unseren IndexController um die Funktionen des Anlegens, Bearbeitens und Löschens zu erweitern. Wir werden auch mit den Zend_Forms in Berührung kommen, die uns die Arbeit mit Formularen vereinfachen sollen.
Weiterlesen →

Zend Tutorial – 02 – Datenbankhandling

1. Die Dateien, die für den Datenbankzugriff verantwortlich sind, sollen sich im Modulordner „bibo“ im Unterordner „models“ befinden. Dieser Ordner ist aktuell noch leer. Das wird sich recht schnell ändern. Legt im Ordner application/modules/bibo/models einen Unterordner „DbTable“ an. Achtet auch auf die casesensitive Schreibweise. In diesem Ordner machen wir jede Tabelle seperat bekannt.
Weiterlesen →