Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
1 Einleitung
2 Die Basis der Objektorientierung
3 Die Prinzipien des objektorientierten Entwurfs
4 Die Struktur objektorientierter Software
5 Vererbung und Polymorphie
6 Persistenz
7 Abläufe in einem objektorientierten System
8 Module und Architektur
9 Aspekte und Objektorientierung
10 Objektorientierung am Beispiel: Eine Web-Applikation mit PHP 5 und Ajax
A Verwendete Programmiersprachen
B Literaturverzeichnis
Stichwort
Ihre Meinung?

Spacer
 <<   zurück
Objektorientierte Programmierung von Bernhard Lahres, Gregor Rayman
Das umfassende Handbuch
Buch: Objektorientierte Programmierung

Objektorientierte Programmierung
2., aktualisierte und erweiterte Auflage, geb.
656 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1401-8
Pfeil 10 Objektorientierung am Beispiel: Eine Web-Applikation mit PHP 5 und Ajax
  Pfeil 10.1 OOP in PHP
    Pfeil 10.1.1 Klassen in PHP
    Pfeil 10.1.2 Dynamische Natur von PHP
  Pfeil 10.2 Das entwickelte Framework – Trennung der Anliegen – Model View Controller
    Pfeil 10.2.1 Trennung der Daten von der Darstellung
  Pfeil 10.3 Ein Dienst in PHP
    Pfeil 10.3.1 Datenmodell
    Pfeil 10.3.2 Dienste – Version 1
  Pfeil 10.4 Ein Klient in Ajax
    Pfeil 10.4.1 Bereitstellung der Daten
    Pfeil 10.4.2 Darstellung der Daten
  Pfeil 10.5 Ein Container für Dienste in PHP
    Pfeil 10.5.1 Dispatcher
    Pfeil 10.5.2 Fabrik
    Pfeil 10.5.3 Dependency Injection
    Pfeil 10.5.4 Sicherheit
  Pfeil 10.6 Ein Klient ohne JavaScript
  Pfeil 10.7 Was noch übrigbleibt


Rheinwerk Computing - Zum Seitenanfang

10.6 Ein Klient ohne JavaScript  topZur vorigen Überschrift

Bernhard: Jetzt haben wir ziemlich alles, was wir brauchen, um die Anwendung fertigzustellen. Wir können die Dienste programmieren, ohne uns um die Kommunikation mit dem Klienten, die Verwaltung der Datenbankverbindung oder die Authentifizierung des Benutzers kümmern zu müssen. Wir können die Struktur, den Stil und das Verhalten der HTML-Seiten voneinander getrennt entwerfen. Und wir haben ein Framework, mit dem wir die HTML-Seiten über Ajax mit den Diensten kommunizieren lassen können.Aber trotzdem bin ich mit unserer Lösung nicht ganz zufrieden. Was ist mit den Benutzern, die kein JavaScript verwenden möchten? Was ist mit den Suchmaschinen, wie würden diese unsere Seiten indizieren können, wenn sie ohne JavaScript und Ajax einfach leer bleiben?

Gregor: Du hast recht. Ajax ist eine mächtige Technologie, mit der man die Benutzerinteraktion mit einer Webanwendung viel attraktiver und angenehmer gestalten kann. Aber nicht alle wollen JavaScript verwenden, und das asynchrone Laden der Daten ist für die Suchmaschinen auch nicht besonders gut geeignet.Jetzt zeigt sich aber der Nutzen, den uns die Trennung der Anliegen, die Trennung der Fachlogik von der Darstellungslogik, gebracht hat. Wir können eine andere Variante der Darstellungslogik implementieren, die kein JavaScript braucht.

Was wir jetzt also brauchen, ist eine neue Implementierung der Darstellungslogik, die nicht in JavaScript im Browser, sondern auf dem Server in PHP implementiert wird.

Der Stil der HTML-Seiten ändert sich nicht, also können wir die bereits vorhandenen CSS-Dateien verwenden.

Die Struktur der HTML-Dateien ändert sich kaum – sie bleibt unverändert, bis auf die Skript-Elemente, die wir nicht brauchen. Wir könnten also die bereits vorhandenen HTML-Dateien als Vorlagen für die neue serverseitige Implementierung der Darstellungslogik verwenden.

Was wir allerdings wirklich neu implementieren müssen, ist die Anreicherung der HTML-Seite mit Daten, denn dies ist bisher in JavaScript-Dateien implementiert.

Bisher haben wir für das Füllen der HTML-Vorlagen die Bibliothek jQuery verwendet. Glücklicherweise wurde jQuery unter dem Namen phpQuery nach PHP portiert. [Sie können phpQuery von http://code.google.com/p/phpquery/ herunterladen. ]

Wir können also unser Skript aus kontakte.js ziemlich direkt nach PHP portieren.

Wir werden jetzt ein PHP-Skript erstellen, das

  • die bereits existierenden HTML-Dateien verwendet,
  • die bereits existierenden Dienste nutzt (allerdings werden diese direkt am Server aufgerufen),
  • den bereits existierenden Dispatcher für die Erstellung der Exemplare der Dienste verwendet, um die vorhandene Funktionalität der Dependency Injection nutzen zu können, und
  • statische HTML-Seiten produziert, mit denen Klienten ohne JavaScript die Kontaktdaten verwalten können.

Bevor wir mit diesem Skript anfangen, müssen wir allerdings unseren Dispatcher ein wenig anpassen.

Bisher wurde die Klasse in der Datei dispatcher.php implementiert, und diese enthielt neben der Klasse Dispatcher noch den Aufruf des Dispatchers. Damit wir die Klasse Dispatcher auch in anderen PHP-Skripten verwenden können, sollten wir sie in eine separate Datei auslagern, die außer der Deklaration der Klasse nichts anderes enthält. [Es ist sowieso eine gute Konvention, wenn man PHP-Klassen in separaten Dateien hält, die nach den Klassen benannt sind. In unserem Beispiel heißen die Dateien class.Klassenname.php – mit Ausnahme der Dienstklassen, die in Dateien mit dem Namen dienst.Klassenname.php programmiert werden. ]

Eine weitere Änderung besteht darin, dass der Dispatcher nicht den HTTP-Aufruf selbst behandeln kann. Wir wollen ja keine JSON-Struktur an den Klienten senden, sondern die HTML-Seite selbst erstellen. [Mit phpQuery könnten wir tatsächlich unsere Dienste über serverseitiges Ajax – also wirklich den Dispatcher, wie er bereits existiert, über HTTP – aufrufen. Allerdings wäre es nicht besonders effektiv, auf die eigenen Klassen über einen HTTP-Aufruf zuzugreifen. ] Wir werden den Dispatcher also nur zur Erstellung eines Exemplars des benötigten Dienstes brauchen. Folglich müssen wir die Sichtbarkeit der Methode dienstErstellen von privat auf öffentlich erhöhen.

Doch nach diesen kleinen Änderungen können wir sofort mit der Implementierung der serverseitigen Darstellungslogik anfangen. Da wir den Dienst Kontakte in die Datei dienst.Kontakte.php verschoben haben, können wir unser Skript jetzt einfach kontakte.php nennen.

<?php 
require_once('class.Dispatcher.php'); 
require_once('phpQuery/phpQuery.php'); 
 
$doc = phpQuery::newDocumentFileXHTML('kontakte.html');  
 
// Wir wollen kein JavaScript an den Browser senden 
pq("script")->remove();  
 
// kontakte.js nach PHP portiert 
class KontakteServerScript { 
  private static $neuerEintrag = 0;   
  public function kontaktAnzeigen($id, $kontakt) { 
    $dl = pq("<dl/>");  
    foreach ($kontakt as $i => $eintraege) { 
      $dl->append(pq("<dt/>")->text($eintraege->name . ':')); 
      $eintrag = $eintraege->eintrag; 
      if (!array_key_exists('id', $eintrag)) { 
        foreach ($eintrag as $j => $eintragJ) { 
          $dl->append( 
            pq("<dd/>")->append( 
              pq("<input/>") 
              ->attr('name',  
                     'bearbeitet[' . $eintragJ['id'] . ']') 
              ->val($eintragJ['wert']) 
            ) 
          ); 
        } 
        $dl->append( 
          pq("<dd/>")->append( 
            pq("<input  
               name='neu[" . $id . "][" .  
               $eintraege->id . "][" .  
               self::$neuerEintrag++ . "]' />"))); 
      } else if (array_key_exists('id', $eintrag)) { 
        $dl->append( 
          pq("<dd/>")->append( 
            pq("<input/>") 
            ->attr('name', 'bearbeitet[' . $eintrag['id'] . ']') 
            ->val($eintrag['wert']) 
          ) 
        ); 
      } 
    } 
    return $dl; 
  } 
   
  public function kontakteAuflisten($data) { 
    $kontakte = pq("<ul/>"); 
    foreach ($data['daten'] as $id => $datenElement) { 
      $kontakt = pq("<li/>"); 
      $kontakte->append($kontakt); 
      $kontakt->append( 
        self::kontaktAnzeigen($id, $datenElement)); 
    } 
    pq("#kontakte")->append($kontakte);  
  } 
} 
 
session_start();  
$dispatcher = new Dispatcher(); 
$dienstKontakte = $dispatcher->dienstErstellen("Kontakte");  
 
$data = $dienstKontakte->auflisten();  
KontakteServerScript::kontakteAuflisten($data);  
 
print $doc;  
 
session_write_close(); 
?>

Listing 10.16    Serverseitige Darstellung der Kontakte mit phpQuery

Im Gegensatz zu jQuery müssen wir phpQuery explizit sagen, auf welchem Dokument die Anfrage stattfinden soll. Wir erstellen das Dokument aus der gleichen Vorlage, wie wir sie in der Ajax-Version unserer Anwendung verwenden .

Da wir in dem fertigen HTML-Dokument kein JavaScript haben möchten, löschen wir einfach alle Skript-Elemente aus dem geladenen Dokument .

Das clientseitige Skript kontakte.js müssen wir nach PHP portieren. Es ist nicht schwierig, da phpQuery sich sehr stark an jQuery orientiert. Wir nutzen einfach statt der Funktion jQuery (beziehungsweise $) die Funktion pq und verwenden die PHP-Syntax .

Da wir den Dispatcher nur zum Erstellen der Dienste verwenden , müssen wir uns selbst um die Verwaltung der Session kümmern .

Die benötigte Operation des Dienstes rufen wir auch selbst auf , um das Ergebnis der Operation an das portierte Skript zu übergeben .

Zum Schluss müssen wir selbstverständlich das fertige Dokument ausgeben .

Das Ergebnis können Sie in Abbildung 10.4 sehen, die hier der Einfachheit halber noch einmal aufgeführt ist.

Abbildung 10.5    Der erste Screenshot mit ein wenig Stil



Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

 <<   zurück
  Zum Rheinwerk-Shop
Neuauflage: Objektorientierte Programmierung






Neuauflage:
Objektorientierte Programmierung

Jetzt Buch bestellen


 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Rheinwerk-Shop: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Rheinwerk-Shop: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Rheinwerk-Shop: C++ Handbuch






 C++ Handbuch


Zum Rheinwerk-Shop: Einstieg in Python






 Einstieg in Python


Zum Rheinwerk-Shop: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2009
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern