Zend Tutorial – 01 – Erste Schritte

1. Eclipse öffnen -> File -> New -> PHP Project

  • Project name: Bibotest
  • Create project at existing location (from existing source) auswählen
  • Pfad angeben: *\projects\bibotest\htdocs\bibotest
  • Finish drücken
  • Nun habt Ihr eure erste Zend Applikation in Eclipse eingebunden.

* ist euer Pfad zum Projekt
2. Erstellt werden soll ein simples Bibliotheksystem mit Bücheransicht, Bücherausleihe und der Möglichkeit Bücher anzulegen, zu bearbeiten und zu löschen. Desweiteren soll eine Möglichkeit existieren den Buchbestand zu durchsuchen. In einem zweiten Schritt soll eine simple Benutzerverwaltung integriert werden.

3. Zunächst benötigen wir eine SQLite Datenbank. Der Einfachheit halber wird das Firefox-Plugin SQLite Manager verwendet.

  • Plugin über Addons im Firefox herunterladen
  • Über das Menü Extra „SQLite Manager“ wird das Plugin gestartet
  • Datenbank -> Neue Datenbank ->
    Name der Datenbank: bibliothek
    Verzeichnis: *\projects\bibotest\htdocs\bibotest\application\data\db (Die Ordner data & db ggf. selber anlegen)

4. Wir benötigen für den ersten Teil des Tutorials eine Tabelle „buecher“ und eine Tabelle „exemplare“

  • Die Tabelle buecher bekommt folgende Felder: id, name, author, beschreibung.
    CREATE TABLE "buecher" ("id" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL , "name" VARCHAR NOT NULL , "author" VARCHAR, "beschreibung" VARCHAR)
  • Die Tabelle exemplare beinhaltet die Felder id, exem_buch_id, ausgeliehen und kunde.
    CREATE TABLE "exemplare" ("id" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL  UNIQUE , "exem_buch_id" INTEGER NOT NULL, "ausgeliehen" BOOL NOT NULL  DEFAULT FALSE, "kunde" VARCHAR)
  • Die Tabelle buecher beinhaltet alle Informationen zu den Büchern. Die Tabelle exemplare listet alle Exemplare aller Bücher. Über die exem_buch_id wird auf das entsprechende Buch (entspricht id aus der Tabelle buecher) referenziert.

5. Wir wollen die Anwendung modular aufbauen, d.h. jede Grundfunktionalität soll ein Modul darstellen. Soll heißen wir haben später zwei Module: ein Bibliotheksmodul und ein Loginmodul. Beginnen wollen wir mit dem Bibliotheksmodul. Über Putty legen wir mit Hilfe des zf-Tools ein neues Modul an:

  • Wechsel mittels cd in das Verzeichnis /projects/bibotest/htdocs/bibotest
  • Danach folgenden Befehl ausführen:
    zf create module bibo
  • Dieser Befehl legt uns in unserem Projekt bibotest ein neues Modul bibo samt Ordnerstruktur an
  • Überprüft im Eclipse (nachdem ihr im PHP Explorer F5 gedrückt habt) ob unter application der Ordner /modules/bibo exisitiert. In diesem Ordner befinden sich die Ordner controllers (für die Controller des Moduls), models (für die Models des Moduls), sowie ein Ordner views (für die Views des Moduls). In dem Ordner views ist zunächst nur der Ordner scripts interessant. Dort kommen entsprechend den Controllern eure View-Scripte hinein.

6. Damit wir später diverserse Layoutanpassungen nicht in jedem Layoutscript einzeln durchführen müssen, legen wir eine zentrale Layoutdatei an, welche uns ein Layout-Grundgerüst für die Anwendung liefert. Wir bleiben mit Putty im Verzeichnis /projects/bibotest/htdocs/bibotest und führen folgenden Befehl aus:

zf enable layout

. Dadurch wird die Layout-Funktionalität der Anwendung freigeschaltet und im application-Ordner der Ordner layouts/scripts erzeugt. In diesem Ordner befindet sich nun die Datei layout.phtml. Diese ist momentan so konfiguriert, dass sie lediglich den Inhalt aus den view-Script der Anwendung anzeigt.

7. Nachdem wir ein Modul angelegt haben, müssen wir unserer Anwendung mitteilen, dass dieses Modul zum Anwendungsstart als Standard geladen werden soll. Dazu öffnen wir die Datei application.ini im Ordner application/configs
Diese sollte aktuell so aussehen:

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

Ändere die Datei wie unten stehend ab:

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0

includePaths.application = APPLICATION_PATH
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"

autoloaderNamespace.bibo = "Bibo_"

resources.frontController.controllerDirectory = APPLICATION_PATH "/modules/controllers"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.defaultModule= "bibo"
resources.frontController.params.displayExceptions = 0
resources.frontController.params.prefixDefaultModule = true

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
resources.layout.layout=bibo

resources.view[] =
resources.modules[] =

resources.db.adapter = "PDO_SQLITE"
resources.db.params.dbname = APPLICATION_PATH "/data/db/bibliothek.sqlite"
resources.db.isDefaultTableAdapter  = true

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

Wir haben zum einen Pfade zu den wichtigen Verzeichnissen gesetzt, die später im Tutorialverlauf benötigt werden. Desweiteren werden ab sofort die Controller aus den Modulordnern verwendet. Unser Default-Module haben wir auf bibo gesetzt, ebenso das Layout. Da dieses Layout aber noch nicht exisistiert, soll es im nächsten Schritt angelegt werden. Über die Zeilen die mit resources.db beginnen, wird unsere Datenbank bei der Anwendung bekannt gemacht.

8. Da unsere Standard-Layout-Datei bibo und nicht mehr layout heißen soll müssen wir diese umbenennen. Wir gehen dazu ins Verzeichnis application/layouts/scripts. Rechtsklick auf die Datei layout.phtml -> Refactor -> Rename -> bibo.phtml eintragen -> Ok drücken

9. Falls ihr nun eure Anwendung ausführen wollt, werdet Ihr mit einer orangefarbenen Fehlermeldung konfrontiert:

Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (error)'

Das liegt daran, dass uns nach den Einstellungen in der application.ini unsere Controller an den entsprechenden Stellen fehlen.

Im Ordner application/modules/bibo/controllers legen wir zwei Controller an: ErrorController.php & IndexController.php

In die Datei IndexController.php schreiben wir folgendes:

class Bibo_IndexController extends Zend_Controller_Action
{
	/**
	 * Index Action
	 */
	public function indexAction()
	{
				
	}
}

Die Datei ErrorController.php soll folgenden Code beinhalten:

class Bibo_ErrorController extends Zend_Controller_Action
{
	public function errorAction()
	{
		$errors = $this->_getParam('error_handler');
	
		if (!$errors) {
			$this->view->message = 'You have reached the error page';
			return;
		}
		
		switch ($errors->type) {
			case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
			case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
			case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
				// 404 error -- controller or action not found
				$this->getResponse()->setHttpResponseCode(404);
				$this->view->message = 'Page not found';
				break;
		        default:
				// application error
				$this->getResponse()->setHttpResponseCode(500);
				$this->view->message = 'Application error';
			break;
		}
			
		// Log exception, if logger available
		if ($log = $this->getLog()) {
			$log->crit($this->view->message, $errors->exception);
		}
		
		// conditionally display exceptions
		if ($this->getInvokeArg('displayExceptions') == true) {
			$this->view->exception = $errors->exception;
		}
			
		$this->view->request   = $errors->request;
	}
		
	public function getLog()
	{
		$bootstrap = $this->getInvokeArg('bootstrap');
		if (!$bootstrap->hasResource('Log')) {
			return false;
		}
		$log = $bootstrap->getResource('Log');
		return $log;
	}
}

Nun fehlen uns passend zu den Controllern noch die entsprechenden View Scripte. Dazu legen wir im Ordner application/modules/bibo/views/scripts zunächst die Ordner error und index an, welche die Namen der Controller wiederspiegeln. Im Ordner error legen wir eine error.phtml an. Der Name der Scriptdatei spiegelt den Name der jeweiligen Action im Controller wieder.

Inhalt der error.phtml

<div id="exception">
	<h1>
		Error
	</h1>

	<h2><?php echo $this->exception->getMessage() ?></h2>
	<h3>Exception information:</h3>
	<h3>Stack trace:</h3>
	<pre><?php echo $this->exception->getTraceAsString() ?></pre>
	<h3>Request Parameter:</h3>
	<pre><?php echo var_export($this->request->getParams(), true) ?></pre>
</div>

Zu guter Letzt fehlt im Ordner Index noch die Datei index.phtml (weil die dazugehörige Action im Controller indexAction heißt)

<h1>Hello Bibo-Modul</h1>

10. Das Modul ist zwar jetzt schon lauffähig, allerdings sollten wir nicht vergessen, eine Bootstrap.php für das Modul zu erzeugen, da diese im weiteren Tutorialverlauf zwingend benötigt wird. Ohne diese Datei kann es vorkommen, das entsprechende Klassen nicht gefunden werden. Im Ordner application/modules/bibo/ legen wir die Datei bootstrap.php an und füllen sie mit folgendem Inhalt:

 
class Bibo_Bootstrap extends Zend_Application_Module_Bootstrap
{

}

11. Damit haben wir unser erstes Modul lauffähig bekommen. Wie Ihr vllt. schon bemerkt habt folgen die Controller und Views in Zend einer bestimmten Namenskonvention. Der Name der Klasse des Controller startet mit dem Namen unseres Moduls (hier „Bibo_“). Danach folgt der Name des entsprechenden View-Ordners (hier „Index“). Dahinter wird das Schlüsselwort Controller angefügt, so dass sich als Klassenname „Bibo_ErrorController“ ergibt. Über die Action „public function indexAction()“ lässt sich nun die Datei index.phtml ansprechen. Sobald die Funktion im Controller steht (egal, ob sie mit Inhalt gefüllt wurde oder nicht) muss die passende View im entsprechenden Ordner dazu existieren, sonst bekommt ihr eine Zend-Fehlermeldung im modischen orange. Im nächsten Tutorial wagen wir uns an das Datenauslesen aus der Datenbank.

Link: Weiter zu Teil 2 des Tutorials

3 Kommentare

  1. Hallo,

    zunächst finde ich das Tutorium über die Zend Module sehr erleuchtend. Wäre es möglich den Source Code zu bekommen? meine E-Mail haben Sie nun.

    Beste Grüße

Kommentar verfassen