Development

Documentation/de_DE/book/1.0/11-Ajax-Integration (diff)

You must first sign up to be able to contribute.

Changes between Version 12 and Version 13 of Documentation/de_DE/book/1.0/11-Ajax-Integration

Show
Ignore:
Author:
Jan.Kunzmann (IP: 79.193.130.161)
Timestamp:
04/18/08 19:40:55 (10 years ago)
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Documentation/de_DE/book/1.0/11-Ajax-Integration

    v12 v13  
    11'''ARBEITSENTWURF ROHÜBERSETZUNG / TRANSLATION WORKING DRAFT'''[[BR]] 
    2 Originaldokument: http://svn.symfony-project.com/doc/branches/1.1/book/11-Ajax-Integration.txt, Version 7987 vom 2008-03-19[[BR]] 
     2Originaldokument: http://svn.symfony-project.com/doc/branches/1.1/book/11-Ajax-Integration.txt, Revision 8468 vom 2008-04-10[[BR]] 
    33Übersetzungsfortschritt: 100%[[BR]] 
    44Übersetzung: JK[[BR]] 
    1010============================= 
    1111 
    12 Clientseitige Interaktion, komplexe visuelle Effekte und die asynchrone Kommunikation sind typisch für das Web 2.0. Sie benötigen JavaScript, aber sie selbst zu schreiben bedeutet oft mühsames und zeitraubendes Debuggen. Zum Glück automatisiert symfony viele der gebräuchlichen Einsatzmöglichkeiten für Javascript in den Templates mit einer Reihe von Helfern. Viele clientseitige Verhaltensweisen können sogar ohne eine einzige Zeile JavaScript kodiert werden. Die Entwickler müssen sich nur noch Gedanken machen, welchen Effekt sie erreichen wollen, und symfony kümmert sich um den komplexen Syntax und Kompatibilitätsfragen. 
    13  
    14 Dieses Kapitel beschreibt die Werkzeuge, die symfony bereitstellt, um clientseitiges Scripting zu ermöglichen: 
    15  
    16   * Einfache JavaScript-Helfer geben standardkonforme `<script>`-Tags in symfony-Templates aus, um Elemente im Document Object Model (DOM) zu verändern oder ein Script über einen Link auszuführen. 
    17   * Mit Prototype wurde eine JavaScript-Bibliothek in symfony integriert, die die Entwicklung von clientseitigen Scripten beschleunigt, indem sie neue Funktionen und Methoden zum JavaScript-Kern hinzufügt. 
     12Clientseitige Interaktion, komplexe visuelle Effekte und die asynchrone Kommunikation sind typisch für das Web 2.0. Sie benötigen JavaScript, aber sie selbst zu schreiben bedeutet oft mühsames und zeitraubendes Debuggen. Zum Glück automatisiert Symfony viele der gebräuchlichen Einsatzmöglichkeiten für Javascript in den Templates mit einer Reihe von Helfern. Viele clientseitige Verhaltensweisen können sogar ohne eine einzige Zeile JavaScript kodiert werden. Die Entwickler müssen sich nur noch Gedanken machen, welchen Effekt sie erreichen wollen, und Symfony kümmert sich um den komplexen Syntax und Kompatibilitätsfragen. 
     13 
     14Dieses Kapitel beschreibt die Werkzeuge, die Symfony bereitstellt, um clientseitiges Scripting zu ermöglichen: 
     15 
     16  * Einfache JavaScript-Helfer geben standardkonforme `<script>`-Tags in Symfony-Templates aus, um Elemente im Document Object Model (DOM) zu verändern oder ein Script über einen Link auszuführen. 
     17  * Mit Prototype wurde eine JavaScript-Bibliothek in Symfony integriert, die die Entwicklung von clientseitigen Scripten beschleunigt, indem sie neue Funktionen und Methoden zum JavaScript-Kern hinzufügt. 
    1818  * Ajax-Helfer ermöglichen es dem User, Teile der Seite zu aktualsieren, indem er einen Link anklickt, ein Formular abschickt oder ein Formularelement benutzt. 
    1919  * Die reichhaltigen Optionen dieser Helfer bieten noch mehr Flexibilität und Leistung, vor allem durch den Einsatz von Callback-Funktionen. 
    20   * Script.aculo.us ist eine weitere in symfony integrierte JavaScript-Bibliothek, die dynamische visuelle Effekte bereitstellt, um die Benutzerschnittstelle zu erweitern und das Benutzererlebnis zu verstärken. 
     20  * Script.aculo.us ist eine weitere in Symfony integrierte JavaScript-Bibliothek, die dynamische visuelle Effekte bereitstellt, um die Benutzerschnittstelle zu erweitern und das Benutzererlebnis zu verstärken. 
    2121  * JavaScript Object Notation (JSON) ist ein Standard, der für die Kommunikation zwischen Server- und Clientscript benutzt wird. 
    22   * Komplexe clientseitige Interaktionen, die alle zuvor aufgeführten Elemente kombinieren, sind in symfony-Anwendungen möglich. Auto-Vervollständigung, Drag'n'drop, sortierbare Listen und editierbarer Text - all dies kann mit einer einzigen Zeile PHP implementiert werden -- dem Aufruf eines symfony-Helfers. 
     22  * Komplexe clientseitige Interaktionen, die alle zuvor aufgeführten Elemente kombinieren, sind in Symfony-Anwendungen möglich. Auto-Vervollständigung, Drag'n'drop, sortierbare Listen und editierbarer Text - all dies kann mit einer einzigen Zeile PHP implementiert werden -- dem Aufruf eines Symfony-Helfers. 
    2323 
    2424Einfache JavaScript-Helfer 
    2727Lange Zeit führte JavaScript wegen der Inkompatibilitäten zwischen den Browsern ein Schattendasein in professionellen Webanwendungen. Mittlerweile sind die meisten dieser Kompatibilitätsfragen gelöst. Es gibt einige stabile Bibliotheken, mit denen Sie komplexe Interaktionen in JavaScript programmieren können, ohne unzählige Zeilen Code zu schreiben und stundenlang zu debuggen. Die wohl populärste Entwicklung, Ajax genannt, werden wir im Abschnitt "Ajax-Helfer" später in diesem Kapitel behandeln. 
    2828 
    29 Es mag paradox klingen, dass Sie ziemlich wenig JavaScript-Code in diesem Kapitel sehen werden. Dies liegt daran, dass symfony einen ziemlich einfachen Ansatz für clientseitiges Scripting verfolgt: es verpackt und abstrahiert JavaScript-Verhaltensweisen in Helfer, wodurch Ihre Templates letztlich garkeinen JavaScript-Code mehr enthalten. Einem Seitenelement ein neues Verhalten hinzuzufügen bedeutet für den Entwickler eine einzige Zeile PHP, doch dieser Helferaufruf gibt JavaScript-Code aus, und wenn Sie sich die erzeugten HTML-Antwort ansehen, dann werden Sie die gekapselte Komplexität erkennen. Der Helfer kümmert sich um browserübergreifende Angelegenheiten, complex limit cases, Erweiterbarkeit usw., weshalb sie eine beträchtliche Menge JavaScript enthalten können. Daher wird Ihnen in diesem Kapitel gezeigt, wie man ohne JavaScript die Effekte erreichen kann, die Sie bisher mit JavaScript erzeugt haben. 
     29Es mag paradox klingen, dass Sie ziemlich wenig JavaScript-Code in diesem Kapitel sehen werden. Dies liegt daran, dass Symfony einen ziemlich einfachen Ansatz für clientseitiges Scripting verfolgt: es verpackt und abstrahiert JavaScript-Verhaltensweisen in Helfer, wodurch Ihre Templates letztlich garkeinen JavaScript-Code mehr enthalten. Einem Seitenelement ein neues Verhalten hinzuzufügen bedeutet für den Entwickler eine einzige Zeile PHP, doch dieser Helferaufruf gibt JavaScript-Code aus, und wenn Sie sich die erzeugten HTML-Antwort ansehen, dann werden Sie die gekapselte Komplexität erkennen. Der Helfer kümmert sich um browserübergreifende Angelegenheiten, complex limit cases, Erweiterbarkeit usw., weshalb sie eine beträchtliche Menge JavaScript enthalten können. Daher wird Ihnen in diesem Kapitel gezeigt, wie man ohne JavaScript die Effekte erreichen kann, die Sie bisher mit JavaScript erzeugt haben. 
    3030 
    3131Alle hier beschriebenen Helfer stehen in den Templates zur Verfügung, vorausgesetzt, Sie haben die Verwendung der `Javascript` Helfergruppe angegeben. 
    3838### JavaScript in Templates 
    3939 
    40 In XHTML muss ein JavaScript-Codeblock in eine CDATA-Sektion eingeschlossen wird. Bei Seiten mit vielen JavaScript-Codeblöcken kann das eine sehr mühsame Angelegenheit werden. Deshalb besitzt symfony den Helfer `javascript_tag()`, der eine Zeichenkette in XHTML-konforme `<script>`-Tags einbettet. Listing 11-1 zeigt die Verwendung des Helfers. 
     40In XHTML muss ein JavaScript-Codeblock in eine CDATA-Sektion eingeschlossen wird. Bei Seiten mit vielen JavaScript-Codeblöcken kann das eine sehr mühsame Angelegenheit werden. Deshalb besitzt Symfony den Helfer `javascript_tag()`, der eine Zeichenkette in XHTML-konforme `<script>`-Tags einbettet. Listing 11-1 zeigt die Verwendung des Helfers. 
    4141 
    4242Listing 11-1 - JavaScript mit dem Helfer `javascript_tag()` einfügen 
    120120>Anm. d. Übers.: "Graceful Degradation", wörtlich übersetzt in etwa "Sanfte Verschlechterung", besser "Anwenderfreundlicher Qualitätsverlust", bedeutet in unserem Falle, dass eine Webanwendung immer noch benutzbar bleibt, selbst wenn bestimmte Voraussetzungen wie z.B. JavaScript, Ajax, oder eine bestimmte Browserversion, nicht verfügbar sind. Möglicherweise muss der Benutzer Einschränkungen im Bedienkomfort hinnehmen oder auf bestimmte Merkmale verzichten. 
    121121 
    122 Das `<noscript>`-Tag erlaubt es Ihnen, HTML-Code anzugeben, der nur den Browsern angezeigt wird, die kein JavaScript unterstützen. Symfony ergänzt das um einen Helfer, der genau umgekehrt funktioniert: Er modifiziert Code derart, dass ihn nur Browser anzeigen, die JavaScript unterstützen. Die Helfer `if_javascript()` und `end_if_javascript()` erleichtern die Erstellung von Anwendungen, die abwärtskompatibel sind, wie in Listing 11-6 gezeigt. 
     122Das `<noscript>`-Tag erlaubt es Ihnen, HTML-Code anzugeben, der nur den Browsern angezeigt wird, die kein JavaScript unterstützen. Symfony ergänzt das um einee Helfer, der genau umgekehrt funktioniert: Er modifiziert Code derart, dass ihn nur Browser anzeigen, die JavaScript unterstützen. Die Helfer `if_javascript()` und `end_if_javascript()` erleichtern die Erstellung von Anwendungen, die abwärtskompatibel sind, wie in Listing 11-6 gezeigt. 
    123123 
    124124Listing 11-6 - Verwendung des `if_javascript()`-Helfers, um "Graceful Degradation" zu ermöglichen 
    141141Prototype ist eine großartige JavaScript-Bibliothek, welche die Fähigkeiten dieser Scriptsprache im Browser erweitert, indem sie die Funktionen hinzufügt, die Sie sich schon immer gewünscht haben, und indem es neue Wege zur Manipulation des DOMs anbietet. Die Webseite dieses Projekts ist [http://prototypejs.org/](http://prototypejs.org/). 
    142142 
    143 Die Dateien von Prototype kommen zusammen mit dem symfony-Framework und stehen in jedem neuen symfony-Projekt unter `web/sf/prototype/` zur Verfügung. Sie können Prototype also verwenden, indem Sie folgenden Code in eine Action einfügen: 
     143Die Dateien von Prototype kommen zusammen mit dem Symfony-Framework und stehen in jedem neuen Symfony-Projekt unter `web/sf/prototype/` zur Verfügung. Sie können Prototype also verwenden, indem Sie folgenden Code in eine Action einfügen: 
    144144 
    145145    [php] 
    153153 
    154154>**NOTE** 
    155 >Da die Ajax-Helfer von symfony, die im nächsten Abschnitt beschrieben werden, auf Prototype basieren, wird die Prototype-Bibliothek automatisch eingebunden, sobald Sie einen der Helfer verwenden. Das bedeutet, dass Sie das Prototype-Script nicht selbst hinzufügen müssen, wenn Ihr Template einen `_remote`-Helfer aufruft. 
     155>Da die Ajax-Helfer von Symfony, die im nächsten Abschnitt beschrieben werden, auf Prototype basieren, wird die Prototype-Bibliothek automatisch eingebunden, sobald Sie einen der Helfer verwenden. Das bedeutet, dass Sie das Prototype-Script nicht selbst hinzufügen müssen, wenn Ihr Template einen `_remote`-Helfer aufruft. 
    156156 
    157157Sobald die Prototype-Bibliothek geladen ist, können Sie all die neuen Funktionen verwenden, die es zum JavaScript-Kern hinzufügt. Es ist allerdings nicht Zweck dieses Buches, sie alle zu beschreiben. Im Web werden Sie ganz einfach jede Menge gute Dokumentation über Prototype finden, z.B. auf folgenden Webseiten: 
    196196    vegetables.each(function(food) { alert('Ich liebe ' + food); }); 
    197197 
    198 Weil das Programmieren von JavaScript mit Prototype so viel mehr Spaß macht als es per Hand zu schreiben, und weil es auch Teil von symfony ist, sollten Sie sich ein paar Minuten Zeit nehmen, um die entsprechende Dokumentation zu lesen. 
     198Weil das Programmieren von JavaScript mit Prototype so viel mehr Spaß macht als es per Hand zu schreiben, und weil es auch Teil von Symfony ist, sollten Sie sich ein paar Minuten Zeit nehmen, um die entsprechende Dokumentation zu lesen. 
    199199 
    200200Ajax-Helfer 
    221221".. ein Konzept der asynchronen Datenübertragung zwischen einem Server und dem Browser, das es ermöglicht, innerhalb einer HTML-Seite eine HTTP-Anfrage durchzuführen, ohne die Seite komplett neu laden zu müssen. Das eigentliche Novum besteht in der Tatsache, dass nur gewisse Teile einer HTML-Seite oder auch reine Nutzdaten sukzessiv bei Bedarf nachgeladen werden,..." 
    222222 
    223 Ajax verwendet `XMLHttpRequest`, ein JavaScript-Objekt, das sich in etwa wie ein versteckter Frame verhält, und das Sie durch eine Serveranfrage aktualisieren können, um Ihre Webseite zu verändern. Das Objekt selbst ist relativ systemnah, und es ist auf den verschiedenen Browserplattformen unterschiedlich implementiert, weshalb die manuelle Bearbeitung von Ajax-Requests üblicherweise in einer Menge Code endet. Glücklicherweise kapselt Prototype all den notwendigen Code für Ajax-Aufrufe und stellt ein einfacheres Ajax-Objekt zur Verfügung, das auch symfony verwendet. Das ist auch der Grund, weshalb die Prototype-Bibliothek immer automatisch geladen wird, sobald Sie einen Ajax-Helfer im Template verwenden. 
     223Ajax verwendet `XMLHttpRequest`, ein JavaScript-Objekt, das sich in etwa wie ein versteckter Frame verhält, und das Sie durch eine Serveranfrage aktualisieren können, um Ihre Webseite zu verändern. Das Objekt selbst ist relativ systemnah, und es ist auf den verschiedenen Browserplattformen unterschiedlich implementiert, weshalb die manuelle Bearbeitung von Ajax-Requests üblicherweise in einer Menge Code endet. Glücklicherweise kapselt Prototype all den notwendigen Code für Ajax-Aufrufe und stellt ein einfacheres Ajax-Objekt zur Verfügung, das auch Symfony verwendet. Das ist auch der Grund, weshalb die Prototype-Bibliothek immer automatisch geladen wird, sobald Sie einen Ajax-Helfer im Template verwenden. 
    224224 
    225225>**ACHTUNG** 
    335335>Wenn der Benutzer die Eingabetaste drückt, wird das Form mit der Aktion übertragen, die im `<form>`-Tag definiert ist -- in diesem Beispiel also eine normale Action. 
    336336 
    337 Heutzutage können Formulare nicht nur reagieren, wenn sie abgeschickt werden, sondern auch, wenn der Wert eines Feldes vom Benutzer aktualisiert wird. In symfony können Sie dafür den Helfer `observe_field()` verwenden. Listing 11-13 zeigt ein Beispiel, wie Sie diesen Helfer zur Erstellung eines "Autovorschlags" verwenden können. Jedes Mal, wenn ein Zeichen in das Feld `item` getippt wird, wird ein Ajax-Aufruf ausgelöst, der das Feld `item_vorschlag` auf der Seite aktualisiert. 
     337Heutzutage können Formulare nicht nur reagieren, wenn sie abgeschickt werden, sondern auch, wenn der Wert eines Feldes vom Benutzer aktualisiert wird. In Symfony können Sie dafür den Helfer `observe_field()` verwenden. Listing 11-13 zeigt ein Beispiel, wie Sie diesen Helfer zur Erstellung eines "Autovorschlags" verwenden können. Jedes Mal, wenn ein Zeichen in das Feld `item` getippt wird, wird ein Ajax-Aufruf ausgelöst, der das Feld `item_vorschlag` auf der Seite aktualisiert. 
    338338 
    339339Listing 11-13 - Aufruf einer Remote-Funktion durch `observe_field()`, wenn sich ein Feldinhalt ändert 
    391391 
    392392Wenn die Remote-Action fehlschlägt, können Sie durch den Remote-Helfer auch ein anderes Element aktualisieren lassen als jenes, das bei einer erfolgreichen Antwort verwendet wird. Zu diesem Zweck teilen Sie den Wert des Parameters `update` einfach in ein assoziatives Array und geben darin unterschiedliche Elemente an, die im Erfolgsfall (`success`) oder bei einem Fehlschlag (`failure`) zu aktualisieren sind. Dies kann z.B. nützlich sein, wenn eine Seite viele Ajax-Interaktionen enthält, und zusätzlich einen Bereich zum Anzeigen von Fehlern. Listing 11-16 zeigt diese bedingte Aktualisierung. 
    393 conditional update. 
    394393 
    395394Listing 11-16 - Bedingte Aktualisierung 
    661660------------------------------- 
    662661 
    663 Unter den Ajax-Helfern von symfony finden sie auch einige Werkzeuge, mit denen Sie komplexe Interaktionen über einen einzigen Aufruf erstellen können. Hierdurch können Sie das Benutzererlebnis mit Interaktionen erweitern, wie man sie von Desktop-Anwendungen her kennt (Drag'n'drop, Auto-Vervollständigung, direkte Bearbeitung), ohne selbst komplexe JavaScripte schreiben zu müssen. Der folgende Abschnitt beschreibt die Helfer für komplexe Interaktionen mit einfachen Beispielen. Weitere Parameter und Kniffe werden in der Dokumentation von script.aculo.us beschrieben. 
     662Unter den Ajax-Helfern von Symfony finden sie auch einige Werkzeuge, mit denen Sie komplexe Interaktionen über einen einzigen Aufruf erstellen können. Hierdurch können Sie das Benutzererlebnis mit Interaktionen erweitern, wie man sie von Desktop-Anwendungen her kennt (Drag'n'drop, Auto-Vervollständigung, direkte Bearbeitung), ohne selbst komplexe JavaScripte schreiben zu müssen. Der folgende Abschnitt beschreibt die Helfer für komplexe Interaktionen mit einfachen Beispielen. Weitere Parameter und Kniffe werden in der Dokumentation von script.aculo.us beschrieben. 
    664663 
    665664>**ACHTUNG** 
    710709### Drag'n'drop 
    711710 
    712 Die Möglichkeit, ein Element mit der Maus zu nehmen, es zu verschieben und woanders loszulassen, wird bei Desktop-Anwendungen häufig verwendet, im Webbrowser jedoch nur selten. Das liegt vor allem daran, dass dieses Verhalten in JavaScript nur sehr kompliziert zu programmieren ist. Glücklicherweise benötigt es in symfony genau eine Zeile. 
     711Die Möglichkeit, ein Element mit der Maus zu nehmen, es zu verschieben und woanders loszulassen, wird bei Desktop-Anwendungen häufig verwendet, im Webbrowser jedoch nur selten. Das liegt vor allem daran, dass dieses Verhalten in JavaScript nur sehr kompliziert zu programmieren ist. Glücklicherweise benötigt es in Symfony genau eine Zeile. 
    713712 
    714713Das Framework stellt Ihnen zwei Helfer namens `draggable_element()` und `drop_receiving_element()` zur Verfügung, die Sie als Verhaltens-Modifikatoren ansehen können; diese fügen Code ein, der die angegebenen Elemente überwacht und um Funktionalität erweitert. Verwenden Sie sie, um ein Element als "ziehbar" (draggable) zu deklarieren, oder um ein Element zu einem Empfänger für gezogene Elemente zu machen. Ein ziehbares Element kann aufgenommen werden, indem man es mit der Maus anklickt. Bis der Mausbutton losgelassen wird, kann das Element über das Fenster bewegt bzw. gezogen werden. Das Empfängerelement ruft eine Remotefunktion auf, wenn ein ziehbares Element auf ihm losgelassen wird. Listing 11-32 zeigt diese Art der Interaktion anhand eines Warenkorbs, der Elemente empfangen kann. 
    787786  * `tag`: Wenn die zu sortierende Liste keine `<li>`-Elemente sind, müssen Sie hierüber angeben, welche Kindknoten ziehbar sind (z.B. `div` oder `dl`). 
    788787 
     788>**TIPP** 
     789>Seit Symfony 1.1 können Sie den `sortable_element()`-Helfer auch ohne die Option `url` verwenden, wodurch dann beim Umsortieren kein AJAX-Aufruf durchgeführt wird. Dies ist z.B. dann nützlich, wenn Sie den AJAX-Aufruf erst beim Drücken eines Buttons durchführen wollen. 
     790 
    789791### "Am Ort" bearbeiten (In-Place Editing) 
    790792 
    791 Immer mehr Webanwendungen erlauben es den Benutzern, Seiteninhalte direkt auf der Seite zu bearbeiten, ohne den Inhalt erst in einem Formular anzeigen zu müssen. Das Prinzip dieser Interaktion ist einfach: Ein Textblock wird hervorgehoben, sobald der Benutzer mit der Maus darüberfährt. Wenn er dann in den Block klickt, wird der Text in ein Eingabefeld verwandelt, das mit dem Blockinhalt gefüllt wird. Zusätzlich erscheint ein Speichern-Button. Der Benutzer kann den Text im Eingabefeld bearbeiten, und wenn er ihn speichert, verschwindet das Feld und der Text wird wieder normal angezeigt. Mit symfony können Sie diese Editier-Verhalten mit dem Helfer `input_in_place_editor_tag()` zu einem Element hinzufügen. Listing 11-34 zeigt, wie Sie ihn einsetzen. 
     793Immer mehr Webanwendungen erlauben es den Benutzern, Seiteninhalte direkt auf der Seite zu bearbeiten, ohne den Inhalt erst in einem Formular anzeigen zu müssen. Das Prinzip dieser Interaktion ist einfach: Ein Textblock wird hervorgehoben, sobald der Benutzer mit der Maus darüberfährt. Wenn er dann in den Block klickt, wird der Text in ein Eingabefeld verwandelt, das mit dem Blockinhalt gefüllt wird. Zusätzlich erscheint ein Speichern-Button. Der Benutzer kann den Text im Eingabefeld bearbeiten, und wenn er ihn speichert, verschwindet das Feld und der Text wird wieder normal angezeigt. Mit Symfony können Sie diese Editier-Verhalten mit dem Helfer `input_in_place_editor_tag()` zu einem Element hinzufügen. Listing 11-34 zeigt, wie Sie ihn einsetzen. 
    792794 
    793795Listing 11-34 - Beispiel zu editierbarem Text 
    815817Wenn Sie es leid sind, in Ihre Templates JavaScript-Code einzufügen, um clientseitige Verhaltensweisen hervorzurufen, eröffnen Ihnen die JavaScript-Helfer eine einfache Alternative. Sie automatisieren nicht nur das grundlegende Linkverhalten und das Aktualisieren von Elementen, sondern stellen auch einen Weg zu Verfügung, um Ajax-Interaktionen in einem Rutsch zu entwickeln. Mit Hilfe der mächtigen Syntaxerweiterung von Prototype und den großartigen grafischen Effekten von script.aculo.us sind selbst komplexe Interaktionen mit wenigen Zeilen geschrieben. 
    816818 
    817 Und da mit symfony ein interaktive Applikationen so einfach wie statische Seiten erstellt werden können, können Sie davon ausgehen, dass fast alle Interaktionen von Desktop-Anwendungen jetzt auch für Webanwendungen verfügbar sind. 
    818  
     819Und da mit Symfony ein interaktive Applikationen so einfach wie statische Seiten erstellt werden können, können Sie davon ausgehen, dass fast alle Interaktionen von Desktop-Anwendungen jetzt auch für Webanwendungen verfügbar sind. 
    819820}}}