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>
Helpers
– Die nützlichen
Helferlein
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 hier
require_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.');
}
}
}
Wir binden mit
require_once die PEAR-Bibliothek
XML_RSS
ein und holen sogleich den mitgegebenen Link. Es erfolgt keine
syntaktische oder sonstige Überprüfung –
solche Features
bietet CakePHP ebenfalls unter der Bezeichnung Validierung –
sondern es wird erwartet, dass der Link wirklich auf eine
gültige
RSS-Ressource zeigt. Nach erfolgreichem Parsen können wir mit
der Modell-Methode
saveFields(feldnamen, wert) die
neu
gewonnen Felder in die Feed-Tabelle eintragen. Da ein Feed in der
Regel mehrere Einträge bereitstellt, lesen wir diese, falls
vorhanden, in einer Schleife ein. Man beachte die Methode
create(),
die das Modell bei jedem Durchlauf initialisiert. Dies ist für
jeden neu eingefügten Record
nötig.
Die Datenfelder werden in einem Array
assoziativ
abgebildet. Danach sorgt die Methode
save(datenarray)
dafür,
dass der Eintrag seinen Weg in die Datenbank findet. Falls ein Fehler
passieren sollte, was hier der Einfachheit halber nicht
überprüft
wird, gibt die Funktion
false zurück.
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).

Abb. 3: Resultat nach dem Klick auf den Link View auf http://localhost/cake/feeds
Fazit
CakePHP 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].