Agile Webapplikationen mit dem CakePHP-Framework

Kuchen backen!
Kommentare

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

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:

New Feed

<form action="url(‚/feeds/add‘); ?>“ method=“post“>
labelTag( ‚Feed/link‘, ‚Link‘ );?> textarea(‚Feed/link‘, array(‚cols‘ => ’60‘, ‚rows‘ => ‚1‘));?> tagErrorMsg(‚Feed/link‘, ‚Please enter the Link.‘);?>
submit(‚Add‘);?>
  • link(‚List Feeds‘, ‚/feeds/index‘)?>

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

psenv::pushli(); eval($_oclass[„form“]); psenv::popli(); ?>

->labelTag ,

psenv::pushli(); eval($_oclass[„html“]); psenv::popli(); ?>

->textarea,

psenv::pushli(); eval($_oclass[„html“]); psenv::popli(); ?>

->submit und

psenv::pushli(); eval($_oclass[„html“]); psenv::popli(); ?>

->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

psenv::pushli(); eval($_oclass[„data“]); psenv::popli(); ?>

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].

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -