Generierter
Quellcode: Views
Für das Backen der Views beschränken wir uns auf den
Controller Feed, weil wir für FeedItem
die
Scaffolding-Funktion eingeschaltet haben. Sie hat Vorrang
gegenüber
eventuell definierten Views. Bei Views handelt es sich um Dateien mit
der Endung .thtml – sie enthalten
sinngemäß
mehrheitlich HTML- und nur minimal PHP-Code. Die View, das Template,
soll möglichst keine Programmlogik enthalten. Dies ist in der
Realität nicht ganz zu vermeiden und auch nicht tragisch,
sofern
es sich um einfache if-then-Bedingungen oder
Schleifen
handelt, die direkt mit der Darstellung von Elementen
zusammenhängen.
In Bake wählen wir die Option für den Controller Feed
und lassen uns scaffolded views (Frage mit y statt
defaultmäßig
n beantworten!) generieren, alles Weitere geht in Ordnung, so wie
vorgeschlagen. Diese Session generiert vier Dateien im Ordner
/apps/views/feeds:
add.thtml, edit.thtml, index.thtml
und
view.thtml. Gemäß
CakePHP-Konvention, trägt
die thtml-Datei denselben Namen der im Controller
definierten
Aktion in Kleinbuchstaben.
DE">Die
Applikation ist jetzt schon ausführbar: wir können
uns
davon überzeugen, indem wir mit dem Browser folgende Adressen
besuchen: http://localhost/feeds
und http://localhost/feed_items. Wenn
wir auf den Link New
Feed
klicken, erscheint die entsprechend generierte Eingabemaske.
Feed-Maske anpassen
In unserer Feed-Applikation wollen wir einzig den Link zu einem
RSS-Feed angeben. Das Programm soll danach mit Hilfe der
PEAR-Bibliothek XML_RSS alles weitere von selbst
holen. Unsere
Maske /app/views/feeds/add.thml braucht eine
deshalb kleine
Anpassung. Wir verändern sie so, dass sie wie in Listing 7
aussieht:
<h2>New Feed</h2><form action="<?php echo $html->url('/feeds/add'); ?>" method="post"><div class="optional"><?php echo $form->labelTag( 'Feed/link', 'Link' );?><?php echo $html->textarea('Feed/link', array('cols' => '60', 'rows' => '1'));?><?php echo $html->tagErrorMsg('Feed/link', 'Please enter the Link.');?></div><div class="submit"><?php echo $html->submit('Add');?></div></form><ul class="actions"><li><?php echo $html->link('List Feeds', '/feeds/index')?></li></ul>
Bei dieser Gelegenheit können wir sehen, dass CakePHP Hilfsmittel für den Bau von HTML-Seiten und -Formularen bereitstellt – beachten wir dazu auch die Aufrufe von ->labelTag , ->textarea, ->submit und ->link ! Diese Funktionsaufrufe produzieren zur Laufzeit korrekten HTML-Code und kümmern sich um die Richtigkeit von Feldnamen oder Verlinkungen. CakePHP bietet eine ganze Reihe von diesen so genannten Helpers und stellt ein Interface bereit, mit dem man die komplexesten eigenen Helper-Kreationen einbinden kann. Im Internet sind viele von der Community veröffentlichte Helpers zu finden. Eine gute Quelle hierzu finden Sie auch unter [2].
Ergänzungen an der Add-Aktion in Feed-Controller
Nun ergänzen wir unsere Applikation mit einem kleinen Automatismus: bei Angabe eines gültigen Links zu einer RSS-Ressource in der Feed-Eingabemaske, soll das Programm sich alle weiteren Informationen selbst holen und danach alle zur Verfügung stehenden Feed-Einträge aus dem Internet laden und in die Datenbanktabelle eintragen. Wir bemühen dazu die PEAR-Bibliothek XML_RSS [3], die ganz einfach mit dem Kommando pear install –alldeps XML_RSS installiert wird.
Dann hängen wir unseren Code in den FeedController und zwar an der Aktion add. Der fertige Code ist im Listing 8 zu sehen:
function add() {if (empty($this->data)) {$this->render();} else {$this->cleanUpFields();if ($this->Feed->save($this->data)) {$this->Session->setFlash('The Feed has been saved');// *** angepasster Code startet hierrequire_once('XML/RSS.php');$rss =& new XML_RSS($this->data['Feed']['link']);$rss->parse();$this->Feed->saveField('name', $rss->channel['title']);$this->Feed->saveField('description', $rss->channel['description']);$id = $this->Feed->id;foreach($rss->items as $item) {$this->Feed->FeedItem->create();$this->Feed->FeedItem->data['feed_id'] = $id;$this->Feed->FeedItem->data['title'] = $item['title'];if (!empty($item['description'])) {$this->Feed->FeedItem->data['content'] = $item['description'];}$this->Feed->FeedItem->data['link'] = $item['link'];$this->Feed->FeedItem->save($this->Feed->FeedItem->data);}// *** angepasster Code endet hier$this->redirect('/feeds/index');} else {$this->Session->setFlash('Please correct errors below.');}}}
Tragen wir als Test also einen neuen Feed ein und drücken auf add. Wenn alles korrekt gelaufen ist, hat die Applikation die neusten News aus dem RSS-Feed von entwickler.de geladen und in feed_items gespeichert (Abbildung 3).
FazitCakePHP ermöglicht einen Kaltstart für neue Webapplikationen und sorgt für Struktur des Codes und saubere Schnittstellen. Die schnelle Prototyperstellung mit wenigen Codezeilen belohnt den Entwickler in kurzer Zeit mit Resultaten und hält ihn davon ab, das Rad neu erfinden zu müssen. Von CakePHP bekommt man mehr oder weniger frei Haus Session-Management, HTML-, Formular-, AJAX- und weitere Helferlein, die objekt-relationale Kapselung der Datenbank, Access Control Lists (ACLs), Eingabedaten-Validierung und einen View-Cache.
Die Entwicklung von CakePHP ist noch in vollem Gang, Versionen und Unterversionen unterscheiden sich voneinander, Version 1.2, die momentan das Alpha-Stadium durchläuft, bringt schon einige umfassende Änderungen mit sich. Die Dokumentation ist leider fragmentiert und sie hinkt der Entwicklung hinterher. Es ist unbedingt notwendig, Blogs und Newsgroups regelmäßig zu besuchen und sich den Code direkt anzuschauen, um tieferen Einblick zu gewinnen.
Um zu sehen, welche Projekte schon in CakePHP geschrieben wurden, hilft ein Blick auf die Listen in [4] und [5]. Erst kürzlich hat die Entwicklergruppe, die das CMS Mambo pflegt, angekündigt, für die kommende Version 5 CakePHP als Grundlage nehmen zu wollen. Und man kann sich sogar schon als CakePHP Engineer zertifizieren lassen – von der Vierergruppe, die CakePHP lanciert hat [6].





