Open Source im professionellen Einsatz
Linux-Magazin 01/2008

PHP-Anwendungsentwicklung mit Prado

Tragendes Rahmenwerk

Wer Web- oder SaaS-Anwendungen anbieten will, bekommt es mit Kodierungsrelikten der HTML- und Skriptsprachen-Frühzeit zu tun. Abhilfe schaffen moderne Frameworks wie Prado, die viele Elemente und Templates bereits als fertige Bausteine bereitstellen. Doch deren Struktur will zuerst verstanden sein.

1269

Webserver und Browser bilden das am weitesten verbreitete Client-Server-Zweigespann. Die Schöpfer der Auszeichnungssprache HTML hatten aber lediglich Texte mit wenigen eingebundenen Grafik im Auge. CSS und Ajax bohren HTML-Seiten jedoch so weit auf, dass sich im Browser selbst Anwendungen mit dem Look&Feel eines Desktop-Programms realisieren lassen.

Die Sprachen und Standards, auf denen auch moderne Webanwendungen basieren, wurden jedoch für weit niedriger gesteckte Ziele entwickelt. Die historisch gewachsenen Standards für dynamische Webseiten zwingen die Entwickler oft, um die Ecke zu denken, und nötigen ihnen schon bei relativ einfachen Programmfeatures kreative Workarounds ab. Integriert die Anwendung Ajax-Funktionalität, so sollte der Client-seitige Javascript-Code auf allen verbreiteten Browsern laufen, muss also den Besonderheiten der unterschiedlichen Javascript-Implementierungen Rechnung tragen. Umfangreiche Kompatibilitätstests sind unverzichtbar.

Plan und Soll

Für eine effiziente und vor allem plan- und kalkulierbare Entwicklung ist es also gerade bei Web- und SaaS-Anwendungen sinnvoll, das Rad nicht für jede Detaillösung neu zu erfinden, sondern die Bausteine eines Entwicklungs-Framework zu nutzen. Eine umfangreiche, in vieler Hinsicht ausgereifte Entwicklungsumgebung für Webanwendungen stellt das Prado-Framework [1] bereit. Die Buchstaben des Namens stehen für PHP Rapid Application Development Object-oriented.

Prado deckt viele Bereiche der Anwendungsentwicklung ab: Es stellt GUI-Komponenten bereit, die von einfachen Eingabefeldern bis hin zu einem Wizard-Interface reichen. Die Syntax der XML-Template-Sprache lässt sich in normalen HTML-Editoren problemlos bearbeiten. Alle Formularkomponenten merken sich ihren Status, ohne dass der Entwickler sich darum kümmern muss.

Prado stellt auch Client-seitige Validation-Controller zur Verfügung, die vom Anwender eingegebene Daten schon vor dem Verschicken des Formulars prüfen. Ein integrierter Object-Relational-Mapper [2], der auf die PHP Data Objects aufsetzt, abstrahiert von der eingesetzten Datenbank und erleichtert den Wechsel des Datenbanktyps: Änderungen am Code sind dabei nur an einer einzigen Stelle nötig. Eine Active-Records-Klasse [3] vereinfacht den Umgang mit Datenbanken noch weiter, indem sie Methoden für häufige Transaktionen wie Einfügen, Updaten, Löschen oder Finden von Daten bereitstellt.

Die Architektur des Framework orientiert sich am MVC-Modell (Model View Controller). Jede Prado-Anwendung besteht aus einem oder mehreren Templates, die das Aussehen der angezeigten Seite festlegen. Eine PHP-Datei stellt die zugehörige Anwendungslogik bereit. Jedes Template kann Code oder andere Template-Dateien inkludieren, außerdem lässt sich ihm ein so genanntes Master-Template zuordnen, das anders als einfache Includes auch zugehörige Controller-Komponenten einbindet.

Eine Beispielanwendung veranschaulicht am besten, wie viel Arbeit Prado dem Entwickler abnimmt: Ein Mausklick soll das Türchen eines Web-Adventskalenders öffnen (Abbildung 1). Einmal geöffnete Türchen bleiben offen, die Anwendung muss sich also deren Status merken. Der umrandete Kasten unter den Türchen zeigt nach dem Öffnen den Inhalt des Kalenderfachs an.

Abbildung 1: Beispiel für eine einfache interaktive Anwendung: Die Türchen des Adventskalenders öffnen sich nach einem Mausklick, im weißen Feld darunter erscheint der Inhalt.

Die Anwendung soll so viel Code wie möglich wiederverwenden. Damit ist es selbstverständlich, dass der Code für die Türchen sowohl in der View- als auch in der Controller-Komponente nur einmal auftauchen möge. Aus Platzgründen enthält der Beispiel-Adventskalender nur Türchen für eine Woche.

Der erste Schritt

Für die Installation des Prado-Framework auf einem Webserver, der PHP-5-Seiten interpretiert, reicht es, Prado in den Root-Ordner des Webservers zu entpacken. Prado-Anwendungen setzen eine bestimmte Verzeichnisstruktur voraus, in der nur eine Datei im Stammordner für den Webserver erreichbar ist (Abbildung 2). Der eigentliche Code liegt unterhalb des »protected«-Verzeichnisses, das durch eine ».htaccess«-Datei für den Webserver gesperrt ist.

Abbildung 2: Prado-Seiten bestehen aus einem XML-Template und einer PHP-Datei für die Anwendungslogik.

Ein Kommanozeilen-PHP-Skript erstellt die Ordnerstruktur im Verzeichnis des Aufrufs. Als einzigen Parameter benötigt er den Namen der Anwendung. Im Ordner »protected/pages« liegt nach dem Aufruf das Dateipaar »Anwendungsname. page« und »Anwendungsname.php«, das die View- und Controller-Komponente der neuen Anwendung repräsentiert. Die Listings 1 und 2 zeigen deren Inhalt für das Adventskalender-Beispiel.

Listing 1

01 <!--- Formular --->
02 <com:TForm>
03   <!--- Repeater ("Datengrid") --->
04   <com:TRepeater ID="Repeater"
05       OnItemCommand="open_door" > <!--- alle Events aus Repeater --->
06       <!--- iterierter Code: Grafik für Adventskalendertürchen, Beschriftung und verstecktes Feld --->
07       <prop:ItemTemplate>
08         <div style="float:left">
09           <com:TImageButton ID="door" ImageURL="door.png" />
10           <div align="center">
11             <com:TLabel ID="tbox" text="<%# $this->Data['text'] %>" />
12           </div>
13         </div>
14         <com:THiddenField ID="inside" data="<%# $this->Data['inside'] %> " />
15       </prop:ItemTemplate>
16       <!--- Ende iterierter Code --->
17   </com:TRepeater>
18 
19   <!--- Anzeigebereich für den Inhalt des Kalenders --->
20   <div style="clear:left;border-width:2px; border-style:solid; background-color:#ffffff;
21   width:650px; height:100px; text-align:center; padding:20px; border-color:black;">
22     <com:TImage id="content"  /> <!--- Bild --->
23   </div>
24 </com:TForm>

Listing 2

01 <?php
02 
03 // Klasse für die Homepage
04 class Home extends TPage {
05 
06 // Diese Funktion liefert die Daten
07 protected function getData()
08   {
09     return array( // Text und Bild-URL für die Türchen
10     array('text' => 'So 2.', 'inside' => 'engel1.png'),
11     array('text' => 'Mo 3.', 'inside' => 'glocken.png'),
12     array('text' => 'Di 4.', 'inside' => 'kaefer.png'),
13     array('text' => 'Mi 5.', 'inside' => 'kugel.png'),
14     array('text' => 'Do 6.', 'inside' => 'engel2.png'),
15     array('text' => 'Fr 7.', 'inside' => 'stern.png'),
16     array('text' => 'Sa 8.', 'inside' => 'stern.png'),
17     );
18   }
19 // Repeater (Datengrid) initialisieren
20 public function onLoad($param) {
21   if (!$this->isPostBack) { // Nur beim ersten Aufruf
22     // Funktion als Datenquelle zuordnen
23     $this->Repeater->DataSource=$this->getData();
24     $this->Repeater->dataBind(); // Repeater initialisieren
25     }
26   }
27 // zum Öffnen der Türchen Bild wechseln
28 public function open_door($sender, $param)
29   { //beim Klick auf das Türchen erhält d. Eventhandler ein Objekt ...
30     $item=$param->getItem(); // ... das das aufrufende Objekt enthält
31     $item->door->setImageURL('door_open.png'); // Neues Bild für Türchen
32     $image=$item->inside->getData(); // Bild-URL aus dem Repeater ...
33     $this->content->ImageURL=$image; // ... unter dem Kalender anzeigen
34   }
35 }
36 ?>

Die View-Komponente (Listing 1) definiert in Zeile 2 mit »<com:TForm>« zunächst ein HTML-Formular. Die Zeilen 8 bis 14 gestalten ein Türchen des Kalenders. Das Template-Tag »<com:TImageButton ... >« (Zeile 9) bindet das Bild des geschlossenen Türchens ein. Ein Div-Block mit der CSS-Style-Eigenschaft »float:left« sorgt dafür, dass sich die Fächer des Adventskalenders in einer Zeile aneinanderreihen. Die Template-Dateien können also sowohl am Präfix »<com:« erkennbare Prado-Tags als auch normale HTML-Tags enthalten.

Ein weiteres »div«-Tag unterhalb des Bildes zentriert den Datumstext. Für den tageweise wechselnden Text ist in das Template eingebundener PHP-Code zuständig. Die umrahmenden »<%# ... %>«-Tags teilen Prado mit, dass es sich bei dem umschlossenen Code um PHP-Quelltext, nicht um Template-Code handelt. Um ihn zu verstehen, ist es nötig, einen Blick auf das Tag »<com:TRepeater>« in Zeile 4 zu werfen.

Ein Repeater, entlehnt aus ASP.Net von Microsoft, ähnelt einer »foreach()«-Schleife. Er wiederholt den eingeschlossenen Quelltext entsprechend der Zahl der Datensätze der im Controller-Code mit ihm verknüpften Datenquelle (Abbildung 3). »$this« verweist in diesem Kontext auf den Repeater. Jeder Repeater stellt das Attribut »Data[]« zur Verfügung, ein Array, das die Datensätze des Schleifendurchlaufs enthält.

Abbildung 3: Aus einem mach sieben: Die Prado-Template-Sprache enthält Kontrollstrukturen, die Elemente vervielfältigen und die einzelnen Instanzen mit Daten aus Arrays oder Listen versorgen.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Viel Holz für den Rahmen

    Wer sich mit PHP eine Website zimmern möchte, freut sich über die große Zahl an vorfertigten Rahmenwerken. Das Linux-Magazin prüft Funktionsumfang und Komfort der besten Frameworks.

  • Projekteküche

    Ajax ist und bleibt ein aktuelles Thema. Die Programmiertechnik für interaktive Webanwendungen setzt voraus, dass sich Entwickler mit den unterschiedlich reagierenden Javascript-Engines der Browser auseinandersetzen - oder die Browser-Abstraktion einer der zahlreichen Ajax-Bibliotheken überlassen.

  • Ubuntu-Doppel

    Diesen Monat tischt die Redaktion wieder ein paar besondere Software-Leckerbissen auf, so zwei spezielle Ubuntu-Server - einer davon virtualisiert -, ein aufgemotztes Suse, den Schwachstellen-Scanner Open VAS und auch sonst alles, was zum Magazin 11/09 passt.

  • Angular JS

    Angular JS ist der aktuelle Shootingstar unter den Webframeworks. Die Javascript-Bibliothek bringt bewährte Konzepte der Rich-Client-Entwicklung in den Browser und entwirrt Ansichten und Daten.

  • Sofortware

    Nur anmelden und los geht's! Was auf lokalen PCs als große Ausnahme gilt, ist bei Webdiensten die Regel. Gerade selten benötigte Software macht auf einem Webserver die bessere Figur. Kommen die Programmierer beim Auslagern unter die Räder? Ganz im Gegenteil.

comments powered by Disqus

Ausgabe 10/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.