Sie sind auf Seite 1von 13

VP WWW und Multimedia, SoSe 09, B. Jellinek, LA Informatik und Informatikmanagement

Universit¨at Salzburg, Gerhard Mitterlechner

Schriftliche Ausarbeitung fur¨

VP WWW und Multimedia

CakePHP am Beispiel einer Verwaltung von Jazzmusikern

CakePHP am Beispiel einer Verwaltung von Jazzmusikern Logo-Quelle: [1]. 15. September 2009 Zusammenfassung Dieses

Logo-Quelle: [1].

15. September 2009

Zusammenfassung Dieses Dokument beschreibt anhand einer kleinen Test-Applikation das PHP-Framework Cake- PHP, welches aufbauend auf das Model-View-Controller Architekturmuster eine halb-automatisierte Entwicklung flexibler datenbankbasierter Webanwendungen erm¨oglicht. Als Test-Applikation wur- de eine Verwaltung von bedeutenden Jazz-Musikern gew¨ahlt, welche in einer MySQL Datenbank gespeichert werden.

Inhaltsverzeichnis

1 Einleitung

2

1.1

Test-Applikation

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

2

2 Prinzipien in CakePHP

 

2

2.1 Model-View-Controller (MVC)

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

2

Model

2.1.1 .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

3

2.1.2 View

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

4

2.1.3 Controller

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

4

2.1.4 Grundlegender Datenfluss in CakePHP

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

5

2.2 Convention over configuration

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

5

3 Installation

6

4 Anlegen der Datenbank

 

6

5 Erzeugung der Model und Controller Klassen

 

7

5.1 CakePHP Console - Einrichtung

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

7

5.2 Source Code backen“: cake bake

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

7

5.2.1 Model erzeugen:

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

7

5.2.2 Controller erzeugen:

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

8

6 Scaffolding in CakePHP

 

8

7 Views backen“

und anpassen

 

9

8 Validierung von Model-Attributen

 

11

9 Weiterfuhrende¨

Themen

 

12

Literatur

13

 

1

CakePHP

WWW und Multimedia

Gerhard Mitterlechner

1 Einleitung

CakePHP ist ein freies, open-source, rapid development Framework fur¨ PHP [1]. Aufbauend auf das Model-View-Controller (MVC) Architekturmuster es gibt es die grundlegende Struktur fur¨ die Programmierung von Web-Applikationen vor 1 . Die CakePHP Klassenbibliotheken und Tools erm¨oglichen es dem Programmierer, sich bei der Ent- wicklung auf die spezifische Programmlogik ihrer Applikation konzentrieren zu k¨onnen, ohne sprichw¨ortlich das Rad jedesmal neu erfinden zu mussen.¨

Unter anderem zeichnen folgende Punkte CakePHP aus ([1], [3]):

Nutzung des Model-View-Controller Architekturmusters zur modularen Trennung von Daten- verwaltung, Programmsteuerung und Darstellung (Abschnitt 2.1).

Integrierte CRUD (create, retrieve, update, delete) Funktionalit¨at fur¨ Datenbank.

die Interaktion mit der

Scaffolding der Applikation: der Entwickler gibt eine Spezifikation fur¨ die Nutzung der Daten-

generiert welches die Applikation zur Verwal-

bank vor, woraus der Compiler ein Code-Gerust¨

tung der Datenbank-Eintr¨age nutzt (scaffold: das Gerust),¨

siehe Abschnitt 6 und [5].

Integrierte Datenvalidierung bei Benutzer-Eingaben (Abschnitt 8).

Automatisches Object-Relational Mapping (ORM) zwischen Datenbank-Tabellen und entspre- chenden PHP-Klassen.

Konsolen-Tools zur automatischen Generierung der Model/View/Controller-Klassen, zur Inter- nationalisierung, Zugriffsverwaltung, Unit Tests und DB-Schema-Erzeugung (Abschnitt 5).

1.1 Test-Applikation

In diesem Dokument wird eine kleine Webanwendung zur Verwaltung von beruhmten¨ Jazz-Musikern als Test-Applikation entwickelt. Die Datenbank besteht dabei nur aus einer einzigen Tabelle jazzmusicians mit Feldern fur¨ Vor- Nach- und Nicknamen, sowie Geburtsdaten und das gespielte Instrument. Ohne Programm-Code manuell schreiben zu mussen¨ wird halbautomatisiert eine Applikation mit voll funktionstuchtiger¨ CRUD-Funktionalit¨at erzeugt. Die einzelnen Entwicklungsschritte werden genau beschrieben, Funktionalit¨at zur Validierung von Benutzereingaben hinzugefugt,¨ und die Darstellung (View) an spezielle Erfordernisse angepasst.

2 Prinzipien in CakePHP

2.1 Model-View-Controller (MVC)

Das in CakePHP verwendete MVC Design Pattern trennt die Struktur eines Softwaresystems in drei auf Code-Ebene voneinander abgegrenzte Komponenten 2 .

1 CakePHP ist ubrigens¨

eines von zahllosen PHP-Webframeworks welche MVC implementieren, siehe [4].

2 In [1] wird MVC als Design Pattern bezeichnet, hingegen in [4] und [9] als Architekturmuster. MVC weist starke Ahnlichkeiten ¨ zum Design Pattern Observer auf, in [7] wird die Ansicht vertreten dass MVC das Observer-Pattern benutzt.

2

CakePHP

WWW und Multimedia

Gerhard Mitterlechner

Das sogenannte Model ist verantwortlich fur¨

die den Zugriff auf den verwendeten Datenspeicher

(meist eine Datenbank). Die graphische Darstellung und Aufbereitung der Daten im User-Interface (hier: Webseiten) ubernimmt¨ die View. Der Controller ubernimmt¨ die Aufgabe der Programmsteuerung; oft implementiert er auch die Gesch¨aftslogik. In Abb. 1 ist das Zusammenspiel grob dargestellt, und wird in Abschnitt 2.1.4 noch detaillierter erl¨autert.

und wird in Abschnitt 2.1.4 noch detaillierter erl¨autert. Abbildung 1: Grundlegender Datenfluss in CakePHP [1]. 2.1.1

Abbildung 1: Grundlegender Datenfluss in CakePHP [1].

2.1.1

Model

Ein Model in CakePHP ist eine OOP-Klasse welche einen Teil der der Applikation zugrundelie- genden Daten repr¨asentiert und zum Datenzugriff verwendet wird. Im Normalfall entspricht eine Model-Klasse einer Datenbanktabelle. Entsprechende Klassenmethoden des Models verwalten die Datenbankverbindung, lesen und schreiben Datens¨atze oder suchen nach Datens¨atzen.

Nur Model-Klassen haben Zugriff auf die Datenbank, und erm¨oglichen einfache Datenverwaltung mit Funktionen wie save(), find(), delete() etc. Der Benutzer legt eine Datenbank nach gewis- sen Regeln an, woraus die konkreten Model-Klassen automatisch generiert werden k¨onnen (ORM - Object Relational Mapping). Jede generierte Model-Klasse erbt von einer Basisklasse, welche fur¨ den Applikationsentwickler die Kommunikation mit der Datenbank transparent durchfuhrt.¨ So kommt ein Entwickler z.B. nicht in Beruhrung¨ mit datenbankspezifischem SQL-Code.

Sobald die Model-Klasse existiert, kann der Controller auf sie zugreifen, wenn die Namen den Konventionen gerecht werden. Das Model wird vom Controller initialisiert und einer Variable abgelegt (Abschnitt 2.2). Das Model ist in CakePHP außerdem zust¨andig die Datenvalidierung von User- Eingaben (Abschnitt 8).

Im Gegensatz zum Observer-Pattern kann das Model in webbasierten Anwendungen nicht den

¨

Controller oder die View von Anderungen notifizieren. In solchen F¨allen spricht man auch von ei-

nem passiven Model. Das Model reagiert in diesem Fall immer nur auf Funktionsaufrufe durch den Controller (bzw. der View), wird aber nie selbstst¨andig aktiv.

3

CakePHP

WWW und Multimedia

Gerhard Mitterlechner

2.1.2 View

Die View ist zust¨andig fur¨ die sog. Pr¨asentationslogik, also alle Abl¨aufe zur graphischen Darstellung von Inhalten. In webbasierten Anwendungen wie CakePHP geben Templates das HTML-Rahmengerust¨ vor welches durch PHP-Code dynamisch befullt¨ wird.

In CakePHP besteht die View-Schicht aus mehreren Teilen:

Layouts:

Layouts (ctp-Files, z.B. default.ctp) geben die HTML-Grundstruktur der Seiten einer Cake- PHP Applikation an, und befinden sich in app/views/layouts. Innerhalb von Layouts werden dann per PHP die eigentlichen View-Files fur¨ verschiedene Seiten geladen (Variable $content_for_layout).

Normale“ View Files:

Fur¨ jede Funktion des Controllers (z.B. add() zum Hinzufugen¨ eines Datensatzes) existiert ein eigenst¨andiges View-File (hier app/views/add.ctp). Der Inhalt ist ein div-Tag in dem die eigentliche Darstellung des seitenspezifischen Contents durchgefuhrt¨ wird (z.B. hier: Anzeigen des Formulars zur Dateneingabe des neuen Datensatzes). Die Endung ctp steht fur¨ CakePHP View Templates.

Helpers:

sind vordefinierte Pr¨asentationskomponenten die in allen Views benutzt werden k¨onnen. Helpers werden im Controller registriert: die Codezeile var $helpers = array(’Html’, ’Form’); legt z.B. einen HTML- und Formular-Helper an.

Der HTML-Helper wird dann in den View-Templates benutzt um CSS-Files zu inkludieren oder Links und Bilder in die HTML-Seite einzufugen¨ (z.B. <?php echo $html->link(_(’Google’, true), ’http://www.google.com’); ?>).

Der Formular-Helper hilft bei der Erstellung von Formularen, und stellt Funktionen wie $form->create(), $form->input() oder $form->end() zur Verfugung.¨

Anzahl

Ein weiterer Helper ist der Paginator, der sich darum kummert¨

von Datens¨atzen in der View angezeigt wird und Sortier-Funktionalit¨at bereitstellt.

dass eine vernunftige¨

Elements:

kleine Teile von Pr¨asentationscode die auf mehreren Seiten ben¨otigt werden, wie zum Beispiel Werbeeinschaltungen, Helpboxes, Navigationselemente etc. Ein Element ist eine Mini-View die

in anderen Views eingefugt¨

wird.

Im Gegensatz zu Model und Controller werden bei der Entwicklung einer Cake-Applikation keine erbenden Subklassen der View-Basisklsse erzeugt, sondern nur die View-Templates ver- wendet.

2.1.3 Controller

In CakePHP wird die gesamte Funktionalit¨at der Applikation welche der Benutzer z.B. uber¨ der Links der Views nutzen kann zuerst uber¨ Controller-Methoden abgewickelt. Diese Benutzeraktionen werden Actions bezeichnet. Jede Aktion repr¨asentiert dabei jeweils eine spezifische Funktion im Controller. Normalerweise verwaltet ein Controller die die Aktionen eines einzigen Models; zu jedem Model muss es also einen eindeutigen Controller geben, und beide Klassen sind entprechend benannt (siehe Abschnitt 2.2). Jede Aktion (bzw. der Aufruf der zugeh¨origen Controller-Funktion) veranlasst dabei

4

CakePHP

WWW und Multimedia

Gerhard Mitterlechner

a) falls n¨otig den Datenaustausch mit dem Model, und b) das Anzeigen der dazugeh¨origen (wieder entsprechend benannten) View. Jeder Controller der Applikation erbt dabei von einer Basisklasse, welcher das Aufrufen der Views fur¨ den Entwickler eines Applikations-Controllers transparent durchfuhrt.¨

2.1.4 Grundlegender Datenfluss in CakePHP

Wenn der Benutzer (Client) in CakePHP eine URL aufruft, wird diese HTTP-Anfrage uber¨ einen (hier nicht relevanten) Dispatcher in einen PHP-Funktionsaufruf im Controller umgesetzt (z.B. index():

alle Datens¨atze der Tabelle anzeigen).

Der Controller ruft in dieser Funktion die passende Methode des Models auf (z.B. find(’all’)),

Der Con-

daraufhin die erhaltenen Daten an die View weiter, indem er eine Array-Variable der

welche die Daten aus der Datenbank liest und dem Controller in einem Array zuruckgibt.¨

troller ubergibt¨

View beschreibt. Daraufhin wird die View zum Anzeigen der entsprechenden Seite aufgerufen.

Array wieder aus und generiert den HTML-Code mit

allen ben¨otigten Links, welche bei Klick wieder in Funktionsaufrufe des Controllers umgesetzt wer- den. In Abb. 1 wird der Datenfluss noch einmal graphisch veranschaulicht; in Abschnitt 7 werden diesbezuglich¨ relevante Code-Teile am Beispiel der Testapplikation erl¨autert.

Die View liest ihr vom Controller befulltes¨

2.2 Convention over configuration

Mithilfe zahlreicher Konventionen bei der Struktur und Benennung der Programmteile wird versucht, den Konfigurationsaufwand m¨oglichst minimal zu halten. Die Konventionen beziehen sich z.B. auf Ordnerstruktur, Datei- und Klassennamen, Namen von Datenbanktabellen und Schlusselattributen.¨ Einige wichtige Konventionen werden hier an Beispielen aufgelistet:

Eine PHP-Klasse MyDummyClass wird in einer Datei my_dummy_class.php abgespeichert.

Eine Model-Klasse Jazzmusician kommt in ein File jazzmusician.php unter app/models/ des Framework-Directories.

Die zum Model geh¨orende Datenbanktabelle heißt jazzmusicians (Plural!), und hat ein ein- zelnes Primary Key-Attribut id sowie z.B. ein Attribut firstname.

Die dazugeh¨orige Controller-Klasse heißt dann JazzmusiciansController und wird als

app/controllers/jazzmusicians_controller.php abgelegt (Plural!).

Fur¨ die Controller-Funktionen index() (listet Datens¨atze auf) und add() (fugt¨ einen Datensatz hinzu) werden separate View-Template-Klassen index.ctp und add.ctp unter app/views/jazzmusicians/ abgelegt.

Eine HTTP-Anfrage auf z.B. http://www.jazz.com/jazzmusicians/ wird umgesetzt zu einem Aufruf der Funktion index() von JazzmusiciansController; die Anfrage http://www.jazz.com/jazzmusicians/add/ hingegen auf einen Aufruf der add()-Methode des JazzmusiciansController.

Der Controller JazzmusiciansController kann mit dem Model Jazzmusician uber¨ ble $this->Jazzmusician kommunizieren.

5

die Varia-

CakePHP

WWW und Multimedia

Gerhard Mitterlechner

3 Installation

1. Um CakePHP nutzen zu k¨onnen, mussen¨ zuerst folgende Programme installiert sein und laufen:

ein PHP-f¨ahiger Webserver (bevorzugt Apache, aber auch andere Webserver sollten funk- tionieren)

ein Datenbank-Server

Fur¨ diese Test-Applikation wurde XAMPP 1.7.0 fur¨ Windows verwendet, welches den Apache Webserver 2.2.11 mit PHP 5.2.8 sowie MySQL 5.1.3 bundelt.¨

2. Die eigentliche Installation des Frameworks:

Von der CakePHP Homepage http://cakephp.org holt man sich das Archiv des neuesten stable releases (hier 1.2.5).

Der Inhalt (ein Ordner namens cake sowie der Versionsnummer, hier: cake_1.2.5) wird

entpackt und in das Dokumentenwurzelverzeichnis (document root) des Webservers kopiert

(hier:

/xampp/htdocs).

Es ist praktisch die Versionsnummer wegzulassen und den Ordner in cake umzubenennen.

Aufrufen der CakePHP-Startseite durch Eingeben des URL http://127.0.0.1/cake im Browser (IP-Adresse ggf. anpassen). Kann die CakePHP Seite geladen werden, ist das Framework erfolgreich installiert. Die Fehlermeldung Your database configuration file is not present“ zeigt an, dass CakePHP noch keine Verbindung zu einer Datenbank herstellen kann.

Nach der Installation erfolgt das Anlegen der Datenbank sowie das Anpassen der Datenbank- Konfigurationsdatei.

4 Anlegen der Datenbank

1. Datenbank erzeugen:

Zuerst muss eine Datenbank angelegt werden. Dies kann mit einem beliebigen MySQL-Client geschehen. Hier wurde der MySQL Query Browser verwendet, und die Datenbank jazzcake angelegt.

2. Anpassen der Datenbank-Konfigurationsdatei:

Die Konfigurations-Datei database.php.default (zu finden unter /app/config im cake- Ordner) umbenennen in database.php.

In der Konfigurations-Datei das Array $default der Klasse DATABASE_CONFIG z.B. wie folgt anpassen (die zweite Variable $test kann gel¨oscht werden):

var

$default

=

array(

’driver’

=>

’mysql’,

’persistent’

’host’

false,

’localhost’,

=>

=>

’login’

=>

’cakedb_user’,

’password’

=>

’cakedb_passw’,

’database’

=>

’jazzcake’,

’prefix’

=>

’’,

);

Damit wird CakePHP mitgeteilt, welchen Datenbank-Server, welche Datenbank und wel- cher Datenbank-Account (User und Passwort) verwendet werden soll.

6

CakePHP

WWW und Multimedia

Gerhard Mitterlechner

Nach neuerlichem Aufruf der CakePHP-Startseite sollte dann die oben genannte Fehler- meldung verschwunden sein.

3. Anlegen der Tabelle: Wir legen eine Tabelle fur¨ Jazz-Musiker mit den Vor-, Nach- sowie Nick- Namen, dem gespielten Instrument, sowie Geburts- und Sterbedatum an. Das entsprechende SQL-Statement:

CREATE

id

TABLE

NOT

INT

jazzmusicians

NULL

(

AUTO_INCREMENT,

firstname

VARCHAR(100)

NOT

NULL,

lastname

VARCHAR(100)

NOT

NULL,

nickname

VARCHAR(100),

instrument

VARCHAR(100)

NOT

NULL,

birthdate

DATE

NOT

NULL,

deathdate

DATE,

PRIMARY

KEY(id)

 

);

Achtung: es ist hier essentiell dass die Namenskonventionen eingehalten werden (Abschnitt 2.2).

5 Erzeugung der Model und Controller Klassen

Es gibt die M¨oglichkeit die MVC-Klassen manuell zu schreiben oder sie aber mithilfe der sogenannten CakePHP Console automatisch erzeugen zu lassen. Zweiteres wird im Folgenden erl¨autert.

5.1 CakePHP Console - Einrichtung

Die automatische Generierung von Source-Code - genauer: der PHP-Model- und Controller-Klassen - erfolgt mithilfe einer mitgelieferten Konsolen-Anwendung: cake.

1. Zuerst die PATH-Umgebungsvariable des Betriebssystems setzen, damit cake.bat aus jedem Ver-

im document root Verzeichnis

zeichnis aufgerufen werden kann. Hier:

des Webservers.

/cake/cake/console

2. Den Applikationspfad mit der Option -app setzen: hier lautet der Aufruf: cake -app wobei wieder der Pfad des document root die drei Punkte ersetzt.

/cake/app,

5.2 Source Code backen“: cake bake

Die eigentliche Generierung des Source Codes erfolgt durch den Aufruf von cake bake in der Konsole. Es folgt ein Menu¨ mit einer Auswahl welche Klassen erzeugt werden sollen (siehe Abb. 2).

5.2.1 Model erzeugen:

Im Hauptmenu¨ w¨ahlt man M zum Erzeugen einer Model-Klasse. Daraufhin best¨atigt man die DB-

Einstellung default. Dann schl¨agt die Anwendung bereits dir richtige Tabelle vor (Nummer 1, jazzmusicians). Die restlichen beiden Fragen werden vorerst verneint; die abschließende Frage Look okay? bejaht. Dar-

aufhin wird eine entsprechende PHP-Model-Klasse erzeugt, unter

/cake/app/models/jazzmusician.php:

<?php

 

class

Jazzmusician

extends

AppModel

{

 

var

$name

=

’Jazzmusician’;

}

?>

7

CakePHP

WWW und Multimedia

Gerhard Mitterlechner

CakePHP WWW und Multimedia Gerhard Mitterlechner Abbildung 2: Das ” Backen“ der MVC-Klassen mit der

Abbildung 2: Das Backen“ der MVC-Klassen mit der Konsolen-Applikation cake bake.

5.2.2 Controller erzeugen:

Im bake Menu¨ w¨ahlt man als n¨achstes das Generieren einer Controller-Klasse durch Eingabe von C.

Man best¨atigt wieder den Vorschlag Nummer 1. Alle weiteren Fragen best¨atigt man mit y (insbeson- dere die Frage nach scaffolding. Die generierte PHP-Controller-Klasse, unter

/cake/app/controllers/jazzmusicians_controller.php

sieht folgendermaßen aus:

<?php

class

JazzmusiciansController

extends

AppController

{

 

var

$name

=

’Jazzmusicians’;

var

$scaffold;

}

?>

Die generierten Klassen sind sehr einfach, der Code der die eigentliche Arbeit verrichtet versteckt sich

in den zwei Hierarchieebenen daruberstehenden¨ des Frameworks.

Basisklassen Model und Controller im libs-Ordner

Das Grundgerust¨ fur¨ eine lauff¨ahige Applikation mit der Datens¨atze von Jazz-Musikern verwaltet werden k¨onnen ist mit der Erzeugung der Model- und Controller-Klassen bereits gelegt, ohne eine Zeile PHP-Code geschrieben zu haben. Der Grund hierfur¨ ist das Aktivieren von Scaffolding bei der Erzeugung des Controllers (siehe folgender Abschnitt). Die Applikation ist jetzt lauff¨ahig und kann unter dem URL http://127.0.0.1/cake/Jazzmusicians aufgerufen werden (siehe Abb. 3, bereits mit gespeicherten Eintr¨agen).

6 Scaffolding in CakePHP

Scaffolding erlaubt es eine einfache CRUD-Applikation (siehe Abschnitt 1) aus Model- und Controller- Klassen zu generieren, was durch das bloße Setzen der $scaffold-Variable in der Controller-Klasse bewirkt wird. Dabei ist das Anlegen einer View nicht n¨otig (weder manuell noch automatisiert uber¨ die Konsole). Die entsprechenden HTML-Seiten mit den Eingabe-Formularen werden von CakePHP dynamisch erzeugt.

8

CakePHP

WWW und Multimedia

Gerhard Mitterlechner

CakePHP WWW und Multimedia Gerhard Mitterlechner Abbildung 3: Die ” gebackene“ Applikation mit bereits

Abbildung 3: Die gebackene“ Applikation mit bereits gespeicherten Eintr¨agen. Die Funktionen zur Datensatzverwaltung (Actions) sowie die Darstellung mussten nicht manuell programmiert werden.

Scaffolding ist besonders geeignet zum Testen in der Anfangsphase eines Projekts, in der sich das Datenmodell noch oft ¨andern kann. Scaffolding kann weiters Assoziationen zwischen Objekten durch Fremdschlusselbeziehungen¨ korrekt aufl¨osen. Achtung: in dieser Applikation hat Scaffolding den Nachteil, dass beim Anlegen eines neuen Musi- kers nur Geburtsjahre ab 1989 erlaubt sind. Außerdem ist es nicht m¨oglich ein leeres Sterbedatum einzugeben. Dies wird behoben wenn Views explizit erzeugt werden (siehe unten).

7 Views backen“ und anpassen

Deaktiviert man Scaffolding beim Backen des Controllers (Eingabe von n bei der entsprechenden Frage), muss fur¨ eine lauff¨ahige Applikation der View-Code erzeugt werden, welcher anschließend an die eigenen Erfordernisse angepasst werden kann.

Controller ohne Scaffolding backen: Wir nehmen dazu an, dass ein Controller erzeugt wurde, wo Scaffolding deaktiviert wurde, sowie alle weiteren Fragen außer Would you like to use basic class methods?“, welche mit y bet¨atigt wird, verneint werden. Der entsprechende Controller-Code erh¨alt dann Methoden zur Datensatzverwaltung, wie etwa eine index() oder add()-Methode, welche mit dem Model den Datenaustausch durchfuhren:¨

function

index()

{

$this->Jazzmusician->recursive

$this->set(’jazzmusicians’,

=

0;

$this->paginate());

}

function

add()

{

if

(!empty($this->data))

{

$this->Jazzmusician->create();

 

if

($this->Jazzmusician->save($this->data))

{

 

$this->flash(_(’Jazzmusician

saved.’,

true),

array(’action’=>’index’));

 

}

else

{}

}

}

9

CakePHP

WWW und Multimedia

Gerhard Mitterlechner

In der index()-Funktion wird der PaginatorHelper aufgerufen 3 , welcher vom Model die Datens¨atze holt und in die View-Variable jazzmusicians schreibt, von wo die View die Daten wieder ausliest. Oh- ne Paginator k¨onnte der Controller wie in Abschnitt 2.1.3 erw¨ahnt direkt vom Model Jazzmusician alle Daten holen, und zwar mittels:

$this->set(’jazzmusicians’, $this->Jazzmusician->find(’all’));

In der add()-Methode wird am Model create() aufgerufen, und ein neuer Datensatz mit den Da-

Wenn

das Speichern erfolgreich war, wird der Benutzer mit dem flash()-Kommando zur Index-View wei-

tergeleitet, wobei vorher noch kurz eine Erfolgsmeldung angezeigt wird.

ten des Eingabeformulars ($this->data) im Model gespeichert (Model-Methode save(

)).

Views backen: Die Applikation ist noch nicht lauff¨ahig, man bekommt eine Fehlermeldung dass die zugeh¨orige View fehlt. Also benutzt man abermals cake bake und w¨ahlt im Menu¨ V zum Erzeugen der View. Jetzt wird man gefragt ob man scaffolded views zum Auflisten, Editieren, Hinzufugen¨ und L¨oschen anlegen m¨ochte, was mit y best¨atigt wird. Admin routing wird nicht aktiviert. Daraufhin wird fur¨ jede Funktion im Controller eine entsprechenden View-Datei erzeugt (cpt-Dateien unter /cake/app/views/jazzmusicians). Zum Beispiel enth¨alt das File add.ctp folgenden, den FormHelper benutzenden Code zum Anzeigen des Eingabeformulars:

<?php

echo

$form->input(’firstname’);

echo

$form->input(’lastname’);

echo

$form->input(’nickname’);

echo

$form->input(’instrument’);

echo

$form->input(’birthdate’);

echo

$form->input(’deathdate’);

?>

Dieses Formular leidet immer noch am Problem dass keine leeren Sterbedaten eingegeben werden k¨onnen., und dass das Jahr 1989 das fruhestm¨ ¨ogliche ist. Die L¨osung ist die Parameter des Input- Felds zu ver¨andern:

echo

$form->input(’birthdate’,

array(’minYear’

=>

1850,

’maxYear’

=>

2000));

echo

$form->input(’deathdate’,

array(’minYear’

=>

1870,

’maxYear’

=>

2020,’empty’

=>

true));

Nun ist es m¨oglich noch lebende Musiker anzulegen, sowie Jazzer die ¨alter als 20 Jahre sind.

Fur¨ die Anpassung des Aussehens der Views gibt k¨onnen im Ordner app/webroot des Frameworks alle CSS-Scripte, Bilder, JavaScripts und andere Dateien abgelegt werden welche auf einer CakePHP- Seite benutzt werden sollen. Im File cake.generic.css im CSS-Ordner k¨onnen Anpassungen an das CSS-Layout vorgenommen werden; alternativ setzt man im Default-Layout-File app/view/layouts/default.ctp das Argument in $html->css(’cake.generic’); entsprechend um.

In den View Templates (z.B. index.ctp) ist es m¨oglich z.B. die Seitenuberschrift¨

Zweiteres wird an der gewunschten¨

anzupassen oder

Stelle mithilfe des HtmlHelpers

Bilder auf die Seite einzufugen.¨

erreicht, sofern die Bilddatei unter webroot/img abgespeichert ist:

<?php

echo

$html->image(’meinbild.png’,

array(’alt’

=>

’Alternativtext’))?>

3 Der PaginatorHelper wird beim Aufruf von paginate als Helper in dem helpers-Array hinzugefugt.¨

10

CakePHP

WWW und Multimedia

Gerhard Mitterlechner

Ebenso angepasst werden kann das Template des View-Layouts app/views/layouts/default.ctp, z.B. um auf allen Seiten die Header und Footer auszutauschen bzw. zu deaktivieren. Um ubrigens¨ die Cake SQL Log-Informationen am unteren Seitenrand auszuschalten setzt man den ’debug’-Parameter in app/config/core.php auf 0. Ein Beispiel fur¨ solche Anpassungen sieht man in Abb. 4.

Ein Beispiel fur¨ solche Anpassungen sieht man in Abb. 4. Abbildung 4: Anpassung des View Templates

Abbildung 4: Anpassung des View Templates der Index-View und der View-Layout Datei, sowie des CSS-Files.

8 Validierung von Model-Attributen

CakePHP bietet die M¨oglichkeit, die User-Eingaben in den Formularen zu validieren, bevor die Ein- tr¨age in die Datenbank geschrieben werden, wozu eine Anpassung der Model-Klasse erforderlich ist. Es ist wiederum m¨oglich, mithilfe von cake bake bei der Model-Erstellung die Frage supply va- lidation criteria for the fields in your model“ positiv beantworten. Daraufhin kann man zwischen voreingestellten Validierungsm¨oglichkeiten ausw¨ahlen. Die Console fugt¨ der Model-Klasse die Array-Variable $validate hinzu, in der fur¨ jedes zu validie- rende Feld ein Eintrag erzeugt wird, welcher wiederum ein Array ist. Diese Eintr¨age k¨onnen h¨andisch nachgebessert werden. Es ist praktisch, dass CakePHP es erlaubt, neben den voreingestellten Regeln (wie z.B. ’notEmpty’:

keine leere Eingabe erlaubt) auch regul¨are Ausdrucke¨ fur¨ die Validierung zu verwenden, sowie mehrere vorhandene Validierungsregeln gleichzeitig zu benutzen¨ (siehe Beispiel unten, Feld lastname und instrument, bzw. nickname). Außerdem ist es m¨oglich eigene Validierungsfunktionen zu schreiben (wird hier nicht gezeigt). Im folgenden Code, der mit cake bake generiert und sp¨ater manuell angepasst wurde, werden unter- schiedliche M¨oglichkeiten fur¨ die einzelnen Felder des Models demonstriert. Im Parameter message steht was die Regel uberpr¨ uft.¨ Dieser Text wird in der Applikation angezeigt, wenn die Validierung fehlschl¨agt (Abb. 5).

class

Jazzmusician

extends

AppModel

{

var

$name

=

’Jazzmusician’;

var

$validate

=

array(

’firstname’

=>

array(

 

’rule’

=>

array(’between’,

3,

100),

’message’

=>

’Must

be

betw.

3

and

100

characters

long.’

),

’lastname’

=>

array(

 

’rule’

=>

’#^[A-Z][a-z]+([

-][A-Z]([a-z])+)*$#’,

 

’message’

=>

’Valid

names

begin

with

upper

case

letters.

 

Multiple

names

are

allowed,

but

separated

with

blank

or

-.’

),

 

11

CakePHP

WWW und Multimedia

Gerhard Mitterlechner

’nickname’

’rule1’

=>

=>

array(

array(

’rule’

=>

’message’

),

’notEmpty’,

=>

’This

field

’rule2’

=>

array(

must

not

be

left

empty.’

’rule’

=>

array(’maxLength’,

20),

’message’

=>

’Nickname

is

at

most

20

characters

long.’

}

);

),

),

’instrument’

’rule’

’message’

=>

=>

array(

’#^[a-z]+([

][a-z]+)*$#’,

=>

’Valid

instrument

names:

consisting

of

lower

case

letters.’

),

’birthdate’

=>

’notEmpty’

blank-separated

words

In Abb. 5 wird gezeigt, wie die Validierung der User-Eingabe fehlschl¨agt, weil der Eintrag des Instru- ments nicht dem regul¨aren Ausdruck der Validierungsregel entspricht.

dem regul¨aren Ausdruck der Validierungsregel entspricht. Abbildung 5: Verletzung einer Validierungsregel bei der

Abbildung 5: Verletzung einer Validierungsregel bei der Eingabe des Instruments. Die Eingabe von

tenor

sax hingegen wird akzeptiert.

9

Weiterfuhrende¨

Themen

eine effiziente und bequeme Entwicklung von Webapplika-

tionen. Zus¨atzlich zu den hier angefuhrten¨

mehreren miteinander Beziehung stehenden Datenbanktabellen zu generieren, wofur¨ die Cake Con- sole z.B. has-and-belongs-to-many“ oder has-one“ Optionen bereitstellt.

M¨oglichkeiten ist es m¨oglich Modelle aus

CakePHP bietet viele M¨oglichkeiten fur¨

einfuhrenden¨

12

CakePHP

WWW und Multimedia

Gerhard Mitterlechner

Weiters k¨onnen Controller um sog. Components erweitert werden, welche verantwortlich sind fur¨ z.B. Access Control Lists, E-Mail, Authentifizierung, Sicherheitsaspekte oder Sessionunterstutzung.¨ Sogenannte Behaviours erweitern die Models, und k¨onnen z.B. zum Filtern von Datenbank-Abfragen oder zum Verwalten von Daten in einer Baumstruktur. Zus¨atzlich zu den erw¨ahnten Helpern PaginatorHelper, FormHelper und HtmlHelper werden auch Helper fur¨ Caching, JavaScript, XML und Ajax zur Verfugung¨ gestellt.

Literatur

[1] CakePHP Homepage. http://cakephp.org.

[2] The

Cheatsheet

-

CakePHP

1.2.

[3] Wikipedia: CakePHP. http://en.wikipedia.org/wiki/CakePHP.

[4] Wikipedia: Model-View-Controller. http://en.wikipedia.org/wiki/Model-view-controller.

[5] Wikipedia: Scaffolding. http://en.wikipedia.org/wiki/CakePHP.

[6] Matt Curry.

Super Awesome Advanced CakePHP Tips.

[7] Erich Gamma, Richard Helm, and Ralph Johnson John M. Vlissides. Design Patterns: Elements of Reusable Object-Orientated Software. 1995.

[8] Duane O’Brian.

Cook up Websites fast with CakePHP.

IBM, 2006.

[9] Stefan Reiners and Gunnar Thies. PHP 5.3 und MySQL 5.1 - Das umfassende Handbuch. Galileo Press, Bonn, 2009.

13