Zend Framework Tutorial Teil 8:
Formularverarbeitung mit Zend_Form
Im siebten Teil vom Zend Framework Tutorial haben wir die Zend_View Komponente kennen gelernt und schon für die Anzeige der Artikelliste und eines einzelnen Artikels verwendet. Wir haben ein Haupttemplate mit dem Seitenaufbau sowie mehrere Subtemplates erstellt. Zudem haben wir ein wenig CSS unser TravelloBlog ein wenig aufgehübscht. Wenn du die ersten sieben Teile noch nicht gelesen hast, hole dies bitte schnell nach.
In diesem achten Teil des Tutorials werden wir uns um die Formularverarbeitung kümmern. Hierbei übernehmen die Aktionsmethoden des Controllers die Interaktion zwischen Model, View und Controller. Ich zeige einen Weg auf, wie du mit Hilfe des Zend Frameworks die einzelnen Schritte und Aspekte einer Formularverarbeitung (Erstellung des Formulars, Validierung der Daten, Behandlung der Fehlermeldung und Speichern der Daten) lösen kannst.
Wenn du über neue Tutorial Teile informiert werden möchtest, abonniere am besten den Feed dieses Blogs. Dann verpasst du garantiert keinen Teil des Tutorials.
Inhaltsverzeichnis
- Vorüberlegungen
- Artikelformular erstellen
- Anpassen der createAction Methode
- Validierung des Formulars
- Speichern der Daten
- Zend_Form in Action
- Artikel ändern
- Artikel löschen
- Übung: die weiteren Formulare
- Download
- Zusammenfassung
- Navigation
- Kommentare
Vorüberlegungen
Die Verarbeitung von Formularen in einem Webprojekt erfordert mehrere Teilschritte. Für unsere Artikel wären dies im einzelnen (die Liste lässt sich sicher erweitern, dies sollte aber für uns erst einmal ausreichend sein):
- Erstellen des Formulars für neue Artikel mit Vorbelegung initialer Werte
- Erstellen des Formulars für bestehende Artikel mit Vorbelegung der vorhandenen Werte
- Validierung der eingegebenen Daten nach dem Absenden des Formulars
- Behandlung von Fehlermeldungen bei fehlerhafter Validierung sowie erneute Ausgabe des Formulars
- Speichern der Daten bei erfolgreicher Validierung für einen neuen Artikel
- Aktualisieren der Daten bei erfolgreicher Validierung für einen bestehenden Artikel
- Ausgabe einer Ergebnisseite nach dem Speichern der Daten
Jetzt wäre es denkbar, alle diese Teilschritte von einer einzigen Aktionsmethode von unserem ArticleController verarbeiten zu lassen. Dies würde diese Aktionsmethode jedoch sehr umfangreich und schlecht wartbar werden lassen. Deshalb ist es sinnvoll, diese Teilschritte in verschiedenen Aktionsmethoden verarbeiten zu lassen. So könnte eine Methode für die Erstellung des Formulars zuständig sein, während eine andere die Daten validiert und die nächste die Daten speichert.
Um mehrfach vorhandenen Code zu vermeiden, ist es ebenfalls sinnvoll, nicht für jeden der genannten Teilschritte eine eigene Aktionsmethode zu erstellen. In der folgenden Tabelle habe ich diese Überlegungen einmal zusammengefasst. In den Klammern habe ich die Bezeichner der einzelnen Teilschritte von oben eingefügt.
| Aktion | Aufgabe |
|---|---|
| createAction | bereitet die Initialwerte für das Anlegen eines neuen Artikels auf und übergibt die Kontrolle zusammen mit den Werten an formAction (a.) |
| updateAction | lädt die Werte des zu ändernden Artikels aus der Datenbank und übergibt die Kontrolle zusammen mit den Werten an formAction (b.) |
| formAction | erstellt das Formular mit den vorgegeben Werten; (a. und b.) gibt ggf. auch die Fehlermeldungen nach einer fehlerhaften Validierung aus (d.) |
| validateAction | validiert die Eingaben (c.)
|
| saveAction | speichert die Daten ab
danach wird nach showAction umgeleitet |
| showAction | zeigt den Artikel an (g.) |
Auf den ersten Blick mag es recht umständlich aussehen, für die Verarbeitung eines einfachen Formulars sechs Aktionsmethoden zu verwenden. Dies verbessert jedoch die Übersicht in den einzelnen Aktionsmethoden und erleichtert damit auch die spätere Wartung.
Für das Übergeben der Kontrolle an eine andere Aktionsmethode sowie für das Umleiten stellt die Zend_Controller Komponente zwei praktische Methoden bereit. Mit Hilfe von _forward() kann in einem Controller die Kontrolle an einer andere Aktionsmethode übergeben werden, wobei alle gewünschten Parameter übergeben werden können. Mit Hilfe von _redirect() kann, wie der Name schon sagt, eine Umleitung auf eine andere Adresse initiiert werden. Dabei können außer über die URL keine Parameter übergeben werden.
Da die Methoden formAction und saveAction jedoch nicht direkt vom Benutzer über die Eingabe einer entsprechenden URL aufgerufen werden sollen, müssen wir uns etwas überlegen. Es bietet sich auf den ersten Blick an, diese Methoden nicht als öffentlich zugängliche Aktionsmethoden, sondern als private Methoden zu deklarieren. Dabei müssen wir sie in buildForm und saveData umbenennen, weil der Zend_Controller verlangt, dass alle Methoden, die auf "Action" enden, als öffentlich deklariert sind. Doch dazu gleich mehr.
Artikelformular erstellen
Um neue Artikel erstellen und bestehende ändern zu können, benötigen wir ein entsprechendes Template mit einem Formular. Wie oben erwähnt verwenden wir sowohl für das Erstellen als auch für das Ändern eines Artikels das gleiche Formular.
Lege also in dem Verzeichnis "/travelloblog/application/views/article" die neue Datei mit Namen form.phtml und folgendem Inhalt an:
-
<form action="<?php echo $this->form_action; ?>" method="post">
-
<input type="hidden" id="art_id" name="art_id" value="<?php echo $this->article['art_id']; ?>" />
-
<?php endif; ?>
-
<fieldset>
-
<legend>Artikeldaten</legend>
-
<table>
-
<tr>
-
<td><label for="art_title">Titel</label></td>
-
<td>
-
<input type="text" id="art_title" name="art_title" maxlength="64" value="<?php echo $this->article['art_title']; ?>" />
-
</td>
-
</tr>
-
<tr>
-
<td><label for="art_teaser">Teaser</label></td>
-
<td>
-
<input type="text" id="art_teaser" name="art_teaser" maxlength="255" value="<?php echo $this->article['art_teaser']; ?>" />
-
</td>
-
</tr>
-
<tr>
-
<td><label for="art_text">Text</label></td>
-
<td>
-
<textarea id="art_text" name="art_text" rows="10"><?php echo $this->article['art_text']; ?></textarea>
-
</td>
-
</tr>
-
<tr>
-
<td> </td>
-
<td><input type="submit" name="button_save" value="Artikel speichern" class="button" /></td>
-
</tr>
-
</table>
-
</fieldset>
-
</form>
-
<hr />
-
<a href="<?php echo $this->url(array('controller'=>'article', 'action'=>'index'), null, true); ?>">zurück zur Artikelliste</a>
Das Formular Template setzt voraus, dass in der Templatevariable $this->article die Werte für die einzelnen Felder und in $this->errors mögliche Fehlermeldungen vorhanden sind. Ist für eine Spalte ein Fehler gefunden worden, wird das entsprechende Eingabefeld farblich hervorgehoben und die Fehlermeldung ausgegeben.
Zudem wird bei zu ändernden Artikeln die Id des Artikels ausgegeben. Außerdem erwartet das Template die Templatevariable form_action mit der Aktion für das Formular.
Bevor wir uns dem Controller widmen, fügen wir noch in unserem Haupttemplate main.phtml im Verzeichnis "/application/layouts/" einige Links für die Anzeige der Artikelliste, Tagliste und Kategorieliste sowie zum Formular für das Erstellen neuer Artikel ein.
-
[...]
-
-
<div id="navi">
-
<ul>
-
<li><a href="<?php echo $this->url(array('controller'=>'article', 'action'=>'index'), null, true); ?>">Artikel auflisten</a></li>
-
<li><a href="<?php echo $this->url(array('controller'=>'article', 'action'=>'create'), null, true); ?>">Artikel anlegen</a></li>
-
<li><a href="#">a</a></li>
-
<li><a href="#">b</a></li>
-
<li><a href="#">c</a></li>
-
<li><a href="#">d</a></li>
-
</ul>
-
</div>
-
-
[...]
Anpassen der createAction Methode
Als erstes ändern wir die bereits vorhandene createAction Methode in unserem ArticleController wie folgt ab:
-
class ArticleController extends Zend_Controller_Action
-
{
-
[...]
-
-
public function createAction()
-
{
-
$params['title'] = 'TravelloBlog - Neuen Artikel erstellen';
-
$params['article']['art_title' ] = '';
-
$params['article']['art_teaser'] = '';
-
$params['article']['art_text' ] = '';
-
-
$this->buildForm($params);
-
}
-
-
[...]
-
}
Zu jeder Aktion gehört auch ein view-Skript. unsere create view-Skript macht nichts anderes als das Artikel-Formular aufzurufen.
Lege dazu bitte die Datei create.phtml im Verzeichnis "/views/scripts/article/" an und schreibe dort rein:
-
<?php
-
-
require 'form.phtml';
-
-
?>
Im Prinzip wird in createAction nur ein Parameter Array für die Verarbeitung durch die private Methode buildForm zum Erstellen unseres Formulars befüllt. Zuerst werden die initialen Werte für die Felder des Formulars belegt. Da das Formular noch nicht validiert worden ist, gibt es auch noch keine Fehlermeldungen. Zuguterletzt wird noch der Titel für die Seite festgelegt.
Zum Schluss werden die Parameter an die Methode buildForm übergeben, welche das Formular erstellt und ausgibt.
Als nächstes müssen wir die neue private Methode buildForm in unserem ArticleController anlegen:
-
class ArticleController extends Zend_Controller_Action
-
{
-
[...]
-
-
private function buildForm($params)
-
{
-
foreach($params as $key => $value)
-
{
-
$this->view->assign($key, $value);
-
}
-
-
$this->view->assign('form_action', 'validate');
-
}
-
-
[...]
-
}
Die übergebenen Parameterwerte werden einfach an unser Zend_View Objekt übergeben.
Rufe nun bitte wieder die Adresse "http://localhost/travelloblog/public/article/" in deinem Browser auf und klicke dort auf den "Artikel anlegen". Das Formular sollte jetzt in etwa so aussehen:

Wenn du nun auf den "Artikel speichern" Button klickst, wird nur "ArticleController::__call()" ausgegeben. Daran erkennen wir, dass die aufgerufene Aktionsmethode für die Validierung noch nicht existiert.
Validierung des Formulars
In unserem ArticleController legen wir die neue Aktionsmethode validateAction an:
-
class ArticleController extends Zend_Controller_Action
-
{
-
[...]
-
-
public function validateAction()
-
{
-
-
{
-
$data['art_id'] = $_POST['art_id'];
-
}
-
-
$data['art_title' ] = $_POST['art_title' ];
-
$data['art_teaser'] = $_POST['art_teaser'];
-
$data['art_text' ] = $_POST['art_text' ];
-
-
{
-
$errors['art_title'] = 'Bitte Titel eingeben!';
-
}
-
-
{
-
$errors['art_text'] = 'Bitte Text eingeben!';
-
}
-
-
{
-
$params['article'] = $data;
-
$params['errors' ] = $errors;
-
$params['title' ] = 'TravelloBlog - Artikelvalidierung';
-
$this->buildForm($params);
-
-
return;
-
}
-
-
$this->saveData($data);
-
}
-
-
[...]
-
}
Und wie es sich gehört, legen wir für diese Aktion auch wieder ein entsprechendes view-Skript (validate.phtml) an. Wie auch schon bei create.phtml brauchen wir hier lediglich das Artikel-Formular einzulesen:
-
<?php
-
-
require 'form.phtml';
-
-
?>
Zuerst holen wir uns alle benötigten Formularwerte aus dem globalen $_POST Array. Danach überprüfen wir, ob für den Artikel ein Titel und ein Text angegeben worden ist. Falls ja, wird eine entsprechende Fehlermeldung festgelegt.
Hinweis
Du solltest nie die Daten aus dem globalen $_POST Array direkt übernehmen, um dir keine Sicherheitslücken einzuhandeln. Das Zend Framework bietet mit Zend_Filter_Input eine gute Lösung, um Benutzerdaten zu prüfen und zu verarbeiten. In einem späteren Teil des Tutorials lernst du mehr über Zend_Filter_Input. Momentan übernehmen wir die Daten des Benutzers ohne viele Prüfung bzw. Filterung.
Wenn mindestens ein Fehler gefunden worden ist, wird wieder die Methode buildForm aufgerufen, wobei die Artikeldaten und Fehlermeldungen übergeben werden. Das return wird benötigt, weil ansonsten der nachfolgende Code ebenfalls ausgeführt werden würde. Falls die Validierung erfolgreich war, werden die Daten an die Methode saveData übergeben.
Sende nun bitte einmal das Formular ab, ohne dass du in eines der Feldern irgendwelche Daten eingibst. Das Formular sollte nun die Fehlermeldungen ausgeben:

Speichern der Daten
Nachdem die Validierung nun geklappt hat, widmen wir uns dem Speichern der Daten. Lege nun bitte in unserem ArticleController die neue private Methode saveData an:
-
class ArticleController extends Zend_Controller_Action
-
{
-
[...]
-
-
private function saveData($data)
-
{
-
-
$data['art_user_id'] = '1';
-
$data['art_cdate' ] = $newDate;
-
$data['art_udate' ] = $newDate;
-
-
$article = new ArticleModel();
-
$art_id = $article->insert($data);
-
$url = '/article/show/id/' . $art_id;
-
$this->_redirect($url);
-
}
-
-
[...]
-
}
Zuerst werden für weitere Felder unseres Artikeldatensatzes neue Werte festgelegt. Danach initialisieren wir wieder unsere Model Klasse für den Artikel und speichern den neuen Artikeln ab.
Die insert() Methode gibt die Id des neuen Artikels zurück. Die _redirect() Methode führt die Weiterleitung durch um den neuen Artikel gleich anzuzeigen. Durch die sofortige Weiterleitung verhindern wir übrigens auch, dass jemand das Formular aus Versehen doppelt absendet.
Wenn du nun die Daten für einen neuen Artikel eingibst, sollte das Ganze in etwa wie folgt aussehen:

Das schaut ja alles schon sehr gut aus, nur bietet und das Zend Framework die Möglichkeit, die Formularestellung und die Validierung zu vereinfachen, und zwar mit Zend_Filter bzw. Zend_Filter_Input und Zend_Validate. Lies dir das alles mal in einer ruhigen Stunde durch.
Wir gehen aber gleich einen Schritt weiter und verwenden Zend_Form. Damit werden Forumularerstellung und Validierung
noch einfacher und vor allem wartungsfreundlicher.
Zend_Form in Action
Zunächst einmal müssen wir das Formular neu anlegen. Dazu erstelle bitte eine Datei mit dem Namen ArticleForm.php im Verzeichnis "/application/models/". Dort trage dann folgendes ein:
-
class ArticleForm extends Zend_Form
-
{
-
public function __construct($options = null)
-
{
-
parent::__construct($options);
-
-
$art_id = new Zend_Form_Element_Hidden('art_id');
-
-
$title = new Zend_Form_Element_Text('art_title');
-
$title->setLabel('Titel')
-
->setRequired(true)
-
->addFilter('StripTags')
-
->addFilter('StringTrim')
-
->addValidator('NotEmpty')
-
->addErrorMessage('Bitte einen Titel eintragen');
-
-
$teaser = new Zend_Form_Element_Text('art_teaser');
-
$teaser->setLabel('Teaser')
-
->addFilter('StripTags')
-
->addFilter('StringTrim');
-
-
$text = new Zend_Form_Element_Textarea('art_text');
-
$text->setLabel('Text')
-
->setRequired(true)
-
->addFilter('StripTags')
-
->addFilter('StringTrim')
-
->addValidator('NotEmpty')
-
->addErrorMessage('Etwas Text muss schon sein');
-
-
$submit = new Zend_Form_Element_Submit('submit');
-
$submit->setLabel('Artikel speichern');
-
-
}
-
}
Was haben wir hier gemacht? Zend_Form hat vordefinierte Elemente, die wir entweder in der Standardeinstellung verwenden oder bei Bedarf an unsere Bedürfnisse anpassen können:
Jedes Element, das wir hinzufügen, bekommt als Attribut den Feldnamen unter dem es in unserer Datenbank angelegt ist.
Mit setLabel() können wir den Text festlegen, der im Formular angezeigt wird und dem User sagt, welche Eingabe erwartet wird.
Sollte ein Feld ausgefüllt werden müssen, kann das durch setRequired(true) festgelegt werden.
addFilter bietet die Möglichkeit mit Filtern die Usereingabe zu entschärfen. In unserem Fall löschen wir mit StringTrim() die Leerzeichen vor und hinter der Eingabe und mit StripTags() werden alle HTML und PHP Tags aus dem Text gelöscht. Weitere Filter findest du unter Standard Filter Klassen.
Wir wollen die Usereingabe jedoch nicht nur entschärfen, wir müssen die Eingabe auch prüfen (validieren). Dazu gibt es addValidator() mit dem wir Regeln aufstellen können, nach der die Eingabe geprüft wird.
Sollte es zu einer Fehleingabe kommen, wird per default die Standardmeldung ausgegeben, und das in englisch. Wir wollen aber unsere eigene Fehlermeldung anzeigen und zudem in deutsch. Um die Fehlermeldung zu individualisieren, verwenden wir addErrorMessage().
So, das Formular haben wir. Jetzt müssen wir noch unsere createAction() Methode anpassen. Öffne dazu bitte den ArticleController und ändere createAction() wie folgt:
-
class ArticleController extends Zend_Controller_Action
-
{
-
[...]
-
-
public function createAction()
-
{
-
$this->view->title = "TravelloBlog - Neuen Artikel hinzufügen";
-
-
-
$form = new ArticleForm();
-
$this->view->form = $form;
-
-
if ($this->_request->isPost())
-
{
-
$formData = $this->_request->getPost();
-
-
if ($form->isValid($formData))
-
{
-
$article = new ArticleModel();
-
-
$row = $article->createRow();
-
$row->art_title = $form->getValue('art_title');
-
$row->art_teaser = $form->getValue('art_teaser');
-
$row->art_text = $form->getValue('art_text');
-
$row->art_user_id = '1';
-
$row->art_cdate = $newDate;
-
$row->art_udate = $newDate;
-
-
$art_id = $row->save();
-
$url = '/article/show/id/' . $art_id;
-
$this->_redirect($url);
-
}
-
else
-
{
-
$form->populate($formData);
-
}
-
}
-
-
[...]
-
}
Wir erstellen zunächst ein neues Objekt mit dem Namen ArticleForm. Aufgrund der Namenskonvention weiß Zend Framework, dass es die dazu gehörende Datei ArticleForm.php im Verzeichnis "/application/models/" zu suchen hat.
Sollte das Formular via POST übermittelt werden, werden die Daten gesammelt und validiert. Sind keine Fehler aufgetreten werden die Daten in die entsprechenden Felder unserer Datenbanktabelle geschrieben und gespeichert. Wenn es jedoch einen oder mehrere Fehleingaben geben, wird das Formular erneut angezeigt.
Kurz und knackig. Wenn du dir mal anshaust, was wir für die gleichen AKtionen vorher alles machen mussten:
buildForm(), validateAction() und saveData() - die kannst du jetzt alle löschen.
Als letztes müssen wir noch dafür sorgen, dass unser Formular auch angezeigt wird. Öffne dazu bitte die Datei create.phtml im Verzeichnis "/application/views/scripts/article/" und ändere den Eintrag wie folgt:
-
<fieldset>
-
<legend>Artikeldaten</legend>
-
-
<?php
-
-
-
?>
-
-
</fieldset>
-
-
<hr />
-
<a href="<?php echo $this->url(array('controller'=>'article', 'action'=>'index'), null, true); ?>">zurück zur Artikelliste</a>
Das war's auch schon. Wenn du jetzt "http://localhost/travelloblog/public/article/" in deinem Browser aufrufst siehst du, dass alles genauso ist wie vorher.
Artikel ändern
Um einen Artikel ändern zu können, bearbeiten wir als erstes die Datei show.phtml ind unserem Scripts-Verzeichnis und ergänzen es um einen Link zum Ändern des Artikels:
Danach ändern wir unsere Aktionsmethode changeAction() im ArticleController:
-
class ArticleController extends Zend_Controller_Action
-
{
-
[...]
-
-
public function changeAction()
-
{
-
$this->view->title = "Travelloblog - Artikel ändern";
-
-
$form = new ArticleForm();
-
$this->view->form = $form;
-
-
if ($this->_request->isPost())
-
{
-
$formData = $this->_request->getPost();
-
-
if ($form->isValid($formData))
-
{
-
$article = new ArticleModel();
-
-
$id = (int)$form->getValue('art_id');
-
-
$row = $article->fetchRow('art_id='. $id);
-
$row->art_title = $form->getValue('art_title');
-
$row->art_teaser = $form->getValue('art_teaser');
-
$row->art_text = $form->getValue('art_text');
-
-
$art_id = $row->save();
-
$url = '/article/show/id/' . $art_id;
-
$this->_redirect($url);
-
}
-
else
-
{
-
$form->populate($formData);
-
}
-
}
-
else
-
{
-
//-- Daten ins Formular einlesen
-
$id = (int)$this->_request->getParam('id', 0);
-
-
if ($id> 0)
-
{
-
$article = new ArticleModel();
-
$article = $article->fetchRow('art_id='. $id);
-
$form->populate($article->toArray());
-
}
-
}
-
}
-
-
[...]
-
}
Letztendlich ist hier alles weitestgehend identisch zur createAction(), es ist lediglich noch ein Teil hinzugekommen, mit dem wir die Daten erstmalig ins Formular einlesen: Die Id des Artikels wird aus den Parametern übernommen und der Datensatz gelesen und mit populate an das Formular übergeben.
Jetzt müssen wir uns nur noch um die Anzeige des Formulars kümmern und das ist ebenfalls identisch zum create.phtml. Also öffne bitte die Datei change.phtml und ändere diese folgendermaßen:
-
<fieldset>
-
<legend>Artikeldaten</legend>
-
-
<?php
-
-
-
?>
-
-
</fieldset>
-
-
<hr />
-
<a href="<?php echo $this->url(array('controller'=>'article', 'action'=>'index'), null, true); ?>">zurück zur Artikelliste</a>
Wenn du dir einen Artikel anzeigen lässt und auf den "Artikel ändern" Link klickst, sollte das in etwa so aussehen:

Artikel löschen
Jetzt fehlt nur noch die Möglichkeit bestehende Artikel nach einer Sicherheitsabfrage zu löschen. Dafür ergänzen wir das als erstes das Template show.phtml mit einem Link zum Löschen des Artikels:
-
[...]
-
-
echo '<hr />';
-
'action'=>'index'), null, true) .'">'
-
.'zurück zur Artikelliste</a> | ';
-
-
'action'=>'change')) .'">'
-
.'Artikel ändern</a> | ';
-
-
'action'=>'delete')) .'">'
-
.'Artikel löschen</a></h2>';
Als nächstes benötigen wir noch ein Template, welches den Artikel zur Kontrolle noch einmal anzeigt und einen entsprechenden Löschbutton enthält. Ändere dafür im Verzeichnis "/travelloblog/application/views/article" das Template delete.phtml:
-
<fieldset>
-
<legend>Artikel löschen</legend>
-
-
<?php
-
-
-
?>
-
-
<form action="<?php echo $this->url(array('action'=>'delete')); ?>" method="post">
-
<input type="hidden" name="art_id" value="<?php echo $this->article->art_id; ?>" />
-
<input type="submit" name="del" value="Artikel wirklich löschen" />
-
</form>
-
-
</fieldset>
-
-
<hr />
-
<a href="<?php echo $this->url(array('controller'=>'article', 'action'=>'index'), null, true); ?>">zurück zur Artikelliste</a>
Als nächstes müssen wir nun unsere Aktionsmethode deleteAction im ArticleController überarbeiten:
-
class ArticleController extends Zend_Controller_Action
-
{
-
[...]
-
-
public function deleteAction()
-
{
-
$this->view->title = "travelloblog - Artikel löschen";
-
-
if ($this->_request->isPost())
-
{
-
$id = (int)$this->_request->getPost('art_id');
-
-
$del = $this->_request->getPost('del');
-
-
if ($del && $id> 0)
-
{
-
$article = new ArticleModel();
-
$where = 'art_id = ' . $id;
-
$article->delete($where);
-
}
-
$this->_redirect('article/');
-
}
-
else
-
{
-
$id = (int)$this->_request->getParam('id');
-
-
if ($id> 0)
-
{
-
$article = new ArticleModel();
-
$this->view->article = $article->fetchRow('art_id='. $id);
-
}
-
}
-
}
-
-
[...]
-
}
Wir übergeben an das Template delete.phtml neben den Artikeldaten auch eine entsprechende Aktion für das Formular. Wenn du dir nun einen Artikel anzeigen lässt und auf den Link "Artikel löschen" klickst, sollte das in etwa so aussehen:

Übung: die weiteren Formulare
Als kleine Übung bis zum nächsten Teil dieses Tutorials möchte ich dich bitten für die Kategorien und die Tags auch die entsprechenden Formulare zu erstellen und die Controller Klassen CategoryController und TagController für die Verwendung dieser Formulare anzupassen. Es sollen neue Kategorien und Tags angelegt sowie bestehende verändert und gelöscht werden können.
Achte bitte darauf, dass die Felder tag_path bzw. cat_path keine direkten Eingabefelder sein sollen, sondern die Eingaben aus tag_name bzw. cat_name in eine URL freundliche Variante umwandeln sollen. Du kannst dafür z.B. diese Zeilen verwenden:
Dabei wird zuerst eine Zeichenkette in Kleinbuchstaben umgewandelt. Dann werden alle Zeichen, die keinen Buchstaben oder Ziffern sind, in einen Unterstrich umgewandelt. Zum Schluss werden mehrfach vorkommende Unterstriche zusammengefasst.
Zudem ändern wir die Übergabe per id von tag_path bzw. cat_path in tag_id bzw. cat_id, also so, wie beim Artikel auch. Dazu musst du die jeweiligen index.phtml Dateien und die showAction Methoden anpassen.
Zur Kontrolle lade dir den aktuellen Stand des Tutorials runter. Dann kannst du deine Ergebnisse damit vergleichen.
Download
Der aktuelle Stand des Tutorials nach diesem achten Teil kann herunter geladen werden. Hier sind auch alle Templates enthalten:
Die Zip Datei enthält nicht die aktuelle Version des Zend Frameworks. Dies musst du bitte selber in das entsprechende Verzeichnis kopieren.
Zusammenfassung
In diesem siebten Teil des Zend Framework Tutorials haben wir die Formularverarbeitung mit Hilfe von Zend_Form realisiert. Wir haben ein mehrfache verwendbares Formular für das Anlegen und Bearbeiten eines Artikels erstellt und unseren ArticleController um einige private Methoden ergänzt bzw. bestehende Aktionsmethoden überarbeitet. Das Anlegen neuer Artikel klappt nun genauso gut wie das Bearbeiten und Löschen bestehender Artikel.
Im nächsten Teil werden wir ein wenig aufräumen und die fehlenden Controller, Model und View Elemente unseres TravelloBlogs erstellen. Außerdem werden wir uns um die Startseite unseres TravelloBlogs kümmern. Danach wird das TravelloBlog zumindest schon einmal rudimentär laufen.
Fragen, Probleme und Anregungen bitte nicht per E-Mail senden, sondern hier in die Kommentare stellen. Dann haben alle etwas davon.
Navigation
- Zend Framework Tutorial Übersicht
- Zurück zu Teil 7: Zend_Db und Zend_View
- Weiter zu Teil 9: Design Pattern für weitere Controller

Donnerstag, 12. März 2009 1:40
Nur eine kleine Sache:
Sollte “Lege also in dem Verzeichnis “/travelloblog/application/views/article” die neue Datei mit Namen “form.php” und folgendem Inhalt an:” nicht so sein:
“/travelloblog/application/views/scripts/article” die neue Datei mit Namen “form.phtml” und folgendem Inhalt an:”
?
Donnerstag, 12. März 2009 1:49
genauso ist es. Ich hab’s geändert. Danke für den Hinweis
Montag, 16. März 2009 12:36
– Zitat Anfang –
Als nächstes benötigen wir noch ein Template, welches den Artikel zur Kontrolle noch einmal anzeigt und einen entsprechenden Löschbutton enthält. Ändere dafür im Verzeichnis “/travelloblog/application/views/article” das Template delete.php:
– Zitat Ende –
Meinst doch sicher delete.phtml, oder?
Dienstag, 17. März 2009 0:18
klar…
ist geändert, danke für den Hinweis
Donnerstag, 19. März 2009 18:44
Super Tutorial! Weiter so.
Freue mich schon auf die nächsten Teile.
Vielen Dank dafür!
Freitag, 24. April 2009 20:51
Vielen Dank für dieses Tutorial bzw. dessen Aktualisierung. Ich bin schonn sehr gespannt auf die nächsten Teile!
Dienstag, 28. April 2009 4:16
Kann mich da nur anschliessen. Ein sehr gutes Tutorial.
Mittwoch, 29. April 2009 17:28
Schließe mich 5), 6) und 7) an: danke für das Tutorial, das erste Schritte im Framework deutlich erleichtert. Bin auf die nächsten Teile gespannt!
Samstag, 9. Mai 2009 10:47
Vielen Dank für das geniale Tutorial! Weiter so! =)
Grüße
Ronald
Dienstag, 19. Mai 2009 18:29
Echt klasse Tutorial! Warte schon shensüchtig auf die nächste Episode!
Mittwoch, 20. Mai 2009 22:21
Kevin, das wird evtl. noch ein wenig dauern.
Als nächstes kommt erstmal die Anpassung an die Veränderungen des ZF 1.8
Zudem portiere ich gerade mein Shopsystem auf ZF – ist mehr Arbeit, als ich befürchtet habe.
Aber die Fortsetzung kommt!
Mittwoch, 27. Mai 2009 16:08
Hab mir jetzt das Buch vom Ralf gekauft. Interessant wären vielleicht anstatt ein komplettes How2 einzelne Kapitel. Kannst dann ja auch Teile erzählen, die Du jetzt bei deinem Shop umgesetzt hast, also wie setze ich ein Login um, Sessionmanagement oder sowas. (:
Samstag, 30. Mai 2009 19:48
Ich halte einzelne Kapitel zunächst mal ür wenig hilfreich.
Als Beginner weiss man noch nicht viel über den Aufbau, die Strukturierung und das Ineinandergreifen der einzelnen Komponenten des Frameworks.
Und dadurch kommt es zu Problemen. Geh doch einfach mal die Beispiele der durchaus sehr guten Dokumentation von ZF durch. Blickst du da als Anfänger immer durch? Ich jedenfalls nicht.
Aus diesem Grund glaube ich, dass ein chronologischer Aufbau zunächst mal viel hilfreicher ist.
Mittwoch, 10. Juni 2009 15:54
Hier musste ich für 1.8.2 nur sehr wenig ändern. So heißt meine Klasse für ArticleForm den Namen Model_ArticleForm. Ansonsten geht das fast 1:1.
Mittwoch, 10. Juni 2009 15:59
So, harter Arbeitstag hinter mir.
Dieses Tutorial ist genau das, was ich lange gesucht habe!!! Sehr gut!!
Warum gibt es eigentlich auf der Zend-Seite so schlechte Starthilfen? Ich hab mir auch das Buch von Ralf geholt (von dem ja die Urversion dieses Tuts stammt), aber die Beispiele aus dem Buch gefielen mir gar nicht. Da ist ja dieser Blog hinten auch nochmal drin, aber er entwickelt das Projekt gar nicht sondern fängt gleich mit einer Bootstrap-Datei an, die schon alles enthält was man je brauchen wird.
Deshalb: Danke für die Aktualisierung dieses Blogs! Mir hat das sehr geholfen. Dazu das PDF, das ich in einem früheren Post erwähnt habe (Kapitel 1 oder 2). Beide zusammen sind die idealen Starthilfen und sollten direkt auf der Zend-Seite angeboten werden.
Mich würden aber speziell noch Bereiche wie Zwischenspeichern von Session-Daten (etwa Warenkorb), Login, Ajax usw interessieren. Das ist hier ja noch nicht enthalten. Hoffe dass du bald auch Zeit dafür findest.
Mittwoch, 17. Juni 2009 9:43
hi marcus .. hast du dir das version 1.7 buch geholt oder ein älteres ??
hier das meine ich
http://www.amazon.de/exec/obidos/ASIN/3827327857/ecnethambu
Dienstag, 14. Juli 2009 6:53
ja, genau das. kann ich für anfänger nicht empfehlen. wer noch nie mit zend gearbeitet hat wird mit dem buch von ralf eggert nicht so richtig glücklich werden. kann sein dass das buch besser ist, wenn man sich mit zend schon auskennt. – ich will aber erstmal einsteigen.
Mittwoch, 5. August 2009 9:49
Danke erstmal für das Top Tutorial!
Weiß jemand, wie man SQL-Fehler, die von $row->save() ausgelöst werden, abfangen kann? Konkret geht es bei mir um Spalten, die unique sind und daher einen Fehler verursachen, wenn man eine Zeile mit gleichem Inhalt in den entsprechenden Spalten einfügen will.
Freitag, 18. September 2009 9:36
[...] Aber es wird eine Zeit kommen, da reicht einem das Standard-Layout des Zend Framework nicht mehr aus. Wenn die Ansprüche steigen, wird es Zeit, sich mit den Dekoratoren von Zend_Form zu befassen. Das Thema wird von vielen Entwicklern eher gemieden, dabei geht es eigentlich ganz einfach. Auf die Möglichkeiten zur Erstellung eines Formulars mit Zend Framework möchte ich an dieser Stelle nicht eingehen. Ein recht aktuelles Tutorial zum Thema finden Sie im Zend Framework Tutorial von Uwe E. Schirm. [...]
Mittwoch, 30. September 2009 16:16
[...] Weiter zu Teil 8: Formularverarbeitung mit Zend_Form Tags » Zend Framework, Zend Framework Tutorial « Autor: Uwe E. Schirm Datum: Donnerstag, 5. Februar 2009 1:09 Trackback: Trackback-URL Themengebiet: Zend Framework Tutorial für Anfänger Feed zum Beitrag: RSS 2.0 Diesen Artikel kommentieren [...]
Donnerstag, 1. Oktober 2009 10:53
Vielen Dank für dass super Tutorial.
Hoffe es kommen bald weitere Teile…
Donnerstag, 1. Oktober 2009 11:50
Vielen dank für das tolle Tutorial.
Endlich blicke ich durch das ganze besser durch. Freue mich schon auf den nächsten Teil.
Dienstag, 6. Oktober 2009 18:25
Hallo,
ja geniales Tutorial, das ist genau das was mir bei der ZF Doku aufstösst, es gibt keine praktische Anleitung … sondern mehr ein sammelsurium aus Funktionsblöcken
benutz ZF schön länger, also einzelteile GData, Rss, SOAP etc…
thx!
Sonntag, 11. Oktober 2009 15:15
Zunächst auch von mir vielen Dank!
Ich arbeite mit der Version 1.9 und erhalte beim Laden des Formulars folgende Fehlermeldung:
Fatal error: Class ‘ArticleForm’ not found
Die Datei liegt wie beschrieben in application/models und ist ArticleForm.php benannt.
In den Kommentaren wurde bereits erwähnt die Klasse in Model_ArticleForm umzubenennen. Das änderte bis auf den Klassennamen nichts an der Fehlermeldung.
Hat noch jemand einen Tipp für mich?
Mittwoch, 21. Oktober 2009 14:01
hi @ all,
erstmal ein herzliches Danke für das aufbauende Tutorial. Ich finde deine/eure Art wie das hier erklärt und darauf eingegangen wird echt Klasse.
So genug …, ich habe eine Frage bezüglich dem 9. Teil, weißt Du schon wann der ca. online kommen wird? Naja und wenn das noch dauert, was hier ja bestimmt jeder verstehen kann, wo finde ich das Urtutorial von diesem Ralf (wahrscheinlich etwas veraltet u in englisch)? Hab ich das richtig verstanden, dass du dich daran orientierst?
….schon mal Danke im voraus für jegliche Hilfe und mach weiter so!!!
Greetz
derbjoern
Freitag, 30. Oktober 2009 17:14
Hallo
Ich stecke voll im Tutorial. Super da auch bei der Fehlersuche, die Details durchgeleuchtet werden.
Ich erhalte nach der Speicherung eines neuen Artikels die Fehlermeldung:
Cannot send headers; headers already sent in C:\xampp\htdocs\travelloblog\library\Zend\Loader.php, line 207
Meine Version:
ZF 1.9
Hat jemand eine Idee?
Dienstag, 3. November 2009 14:33
Sollte dieser Text “Zuerst holen wir uns alle benötigten Formularwerte aus dem globalen $_POST Array. Danach überprüfen wir, ob für den Artikel ein Titel und ein Text angegeben worden ist. Falls ja, wird eine entsprechende Fehlermeldung festgelegt.”
-> JA sollte NEIN heissen oder?
Mittwoch, 2. Dezember 2009 21:55
Einfach suuuuuuuuuuuuuuuuper Tutorial!!!
Nur ich lese hier, dass es seit März anscheinend kein weiterer Teil hinzugekommen ist? oO
Bitte!!! Meinetwegen flaster die Seite mit Werbung und “Spende Button” zu – vielleicht ist das ein Anreiz weiterzumachen, denn dann würdest du auch noch gut dabei verdienen – aber bitte führe das Tutorial fort!!!
Vielen Dank
Gruß Schorschi
Sonntag, 6. Dezember 2009 15:49
Das tutorial ist SUPER. Wäre sehr schade, wenn es nicht weiter geht.
Kennt jmd ein gutes Tutorial für zend_auth und zend_acl?
Montag, 7. Dezember 2009 22:55
Hallo!
Das Tutorial ist einfach genial.
Herzlichen Dank!
Wird das Tutorial weitergeführt?
Grüße
Mustafa
Dienstag, 15. Dezember 2009 13:09
Suuuperr
Bitte weitermachen!
Sonntag, 20. Dezember 2009 20:48
Ich finds auch Klasse!
Dienstag, 22. Dezember 2009 9:17
Hallo, ist geplant das Tutorial auf das neue Framework umzuschreiben?? Also 1.8., beim überfliegen des Tutorials ist mir nämlich aufgefallen das vieles in der neuen Version nicht mehr funktionieren sollte. Aber ansonsten ein echt super Tutorial!!
Viele Grüße
Freitag, 29. Januar 2010 9:10
Ich finde es Klasse, wie du dieses Tutorial gemacht hast.
Ich hoffe es kommt noch mehr
Montag, 5. Juli 2010 9:47
Hallo, klasse tutorial! Dennoch ein Problem, ich habe Zend Framework + Zend Server Community Edition(CE) (PHP 5.3) installiert und habe das dortige Framework einfach mit dem Framework 1.8.2 ersetzt. Danach “travelloblog_08″ heruntergeladen und in htdocs extrahiert. Der gibt mir auf jeden Link den ich klicke folgende Fehlermeldung aus:
Not Found
The requested URL /travelloblog_08/public/category was not found on this server.
Woran könnte das liegen?
Mittwoch, 7. Juli 2010 14:44
Hallo,
was mach ich den wenn diese fehlermeldung kommt?:
Fatal error: Class ‘ArticleForm’ not found in /xyz/travelloblog/application/controllers/ArticleController.php on line 33
Montag, 19. Juli 2010 16:56
Hallo Uwe,
vielen Dank für das Super Tutorial…
Mach bitte weiter so.
Danke.
Andreas
Montag, 9. August 2010 10:16
Das Tutorial war für mich ein Traum zum Einstieg ins ZF. Selbst mehrere Bücher und ZF-Doku haben mich bei Weitem nicht so zielgerichtet vorwärts gebracht wie diese Anleitung.
Ich selbst habe tausende Stunden in kostenfreie Internetprojekte gesteckt und weiß daher, wie sich das Thema Motivation bzgl. solcher auf Dauer gestaltet. Sollte ich hier irgendwann eine Möglichkeit finden, in Form einer wie auch immer gearteten Spende Danke zu sagen, werde ich es tun.
Vielen Dank nochmal
Freitag, 3. September 2010 15:14
Gestern und heute habe ich nur mit diesem Tut gearbeitet und es ist wirklich genial!
Mach bitte weiter – Vielen Dank!
=)