Webanwendungen mit DataGrids modernisieren

YUI DataTable mit PHP DataSource
Kommentare

In den letzten Jahren sind die Anforderungen an das Graphical User Interface in Webapplikationen stark gestiegen. Heute ist es möglich, Webapplikationen zu erstellen, die sich nahezu wie native Desktopanwendungen bedienen lassen. Selbstverständlich muss man das Rad nicht neu erfinden, sondern kann sich auf eine bestehende JavaScript-Bibliothek stützen. Da in nahezu jeder Webapplikationen Daten in tabellarischer Form gelistet werden müssen, ist es naheliegend, mit der Modernisierung seiner Webapplikationen an dieser Stelle zu beginnen.

Im Laufe der Zeit wächst die Datenmenge in Systemen ganz automatisch. Listen und Tabellen werden immer länger und gerade betagtere Browser bekommen Probleme, diese in angenehmer Zeit zu rendern. Die Aufgabe eines DataGrids besteht darin, dem Benutzer größere tabellarische Datenmengen flüssig darzustellen und diese so zu visualisieren, dass der Benutzer sie komfortabel anschauen kann.

Anforderungen an DataGrids

Bevor wir uns einem praktischen Beispiel zuwenden, möchte ich kurz definieren, welche Features ein DataGrid von einer herkömmlichen Tabelle unterscheidet:

  • Auf- und absteigende Sortierung nach Spalten
  • Pagination – Unterteilung der Daten in mehrere Datenblätter
  • Daten dynamisch per XMLHttpRequest laden, um auch das flüssige Arbeiten mit großen Datenmengen zu ermöglichen
  • Daten mittels Filtermaske filtern
  • Inline Cell Editing – direkte Manipulation von Daten im DataGrid
Die YUI Library

Wie eingangs erwähnt, gibt es zahlreiche JavaScript-Bibliotheken, derer sich Entwickler bedienen können, um zeitgemäße Webapplikationen zu entwickeln. Eine mögliche JavaScript-Bibliothek ist YUI [1] von Yahoo! [2]. YUI ist eine umfangreiche und sehr gut dokumentierte Bibliothek. Zu sämtlichen Komponenten gibt es eine Vielzahl an Codebeispielen. Darüber hinaus ist YUI, letztlich auch durch den Einsatz bei Yahoo! selbst, im aktuellen Stadium gut getestet und sehr robust. In den folgenden Beispielen verwende ich das aktuelle Release 2.8.1 von YUI. Die neue YUI-3-Bibliothek ist zwar bereits einsetzbar und bringt viele Neuerungen und Verbesserungen mit, basiert aber bei den erweiterten Elementen noch weitestgehend auf Betaversionen und sollten daher noch nicht in produktiven Applikationen verwendet werden. Zudem wird nach Aussage [3] des YUI-Teams noch die Version 2.9 folgen, was darauf schließen lässt, dass YUI 2 noch einige Zeit erhalten bleibt und von Yahoo! weiterhin gepflegt wird.

Jetzt geht’s los

Yahoo! bietet diverse Möglichkeiten, um seine Bibliothek zu konfigurieren und einzubinden. Neben dem YUI Loader Utility [4] besteht die Möglichkeit, die gewünschten Komponenten mittels Dependency Configurator [5] zu konfigurieren und einzubinden. Als weitere Alternative bietet sich auch das YUI PHP Loader Utility (Beta) [6] an. Selbstverständlich können die Sourcen auch einfach auf der lokalen Festplatte gespeichert und per Script-Element eingebunden werden. Da viele Komponenten auf anderen aufbauen, ist es anfangs einfacher, den Dependency Configurator zur verwenden bzw. per YUI Loader einzubinden.

YUI Loader

In Listing 1 ist die Konfiguration des YUI Loaders mit den benötigten Komponenten abgebildet. Für das erste Beispiel benötigen wir neben der Standardkomponente YAHOO auch die Komponente YAHOO.widget.DataTable [7]. Des Weiteren binden wir die Komponenten YAHOO.util.Dom, YAHOO.util.Event und YAHOO.widget.Logger ein. Alle optional benötigten Komponenten können mit loadOptional: true automatisch eingebunden werden. Das Setzen der Konfigurationsvariable combine: true ermöglicht, sofern das YAHOO! CDN [8] (Content Delivery Network) verwendet wird, das Zusammenfassen aller Dateien zu einem Request je Dateityp (JS und CSS). Alternativ steht die Bibliothek im Google CDN [9] zur Verfügung, das zwar das Kombinieren der Dateien nicht ermöglicht, dafür aber SSL unterstützt. Es ist zu beachten, dass der YUI Loader automatisch das YAHOO! CDN verwendet, sobald combine: true gesetzt ist. Zu Entwicklungszwecken laden wir mit filter: „DEBUG“ nicht die minimierten Sourcen für den produktiven Einsatz, sondern Sourcen mit integrierten Log-Ausgaben. Nach dem Laden aller benötigten Sourcen, ruft der YUI Loader die Callback-Funktion onSuccess auf, in der dann die eigenen Komponenten und Funktionen ausgeführt werden können. Mit dem Aufruf YAHOO.widget.Logger.enableBrowserConsole(); nutzen wir die Möglichkeit des Loggers, alle Ausgaben in Firebug anzuzeigen.

Abb. 1: Log-Ausgaben in FirebugAbb. 1: Log-Ausgaben in Firebug (Vergrößern)

Listing 1: YUI Loader verwenden

var loader = new YAHOO.util.YUILoader({ 
  require: ["yahoo", "dom", "event", "logger", "datatable"],
  loadOptional: true, 
  combine: true,  // nur im Yahoo! CDN
  filter: "DEBUG",
  
  // wird aufgerufen, sobald alle JS und CSS Datei geladen wurden
      onSuccess: function() { 
    // Ausgabe des Logs in eine Browserkonsole (z.B. Firebug)
    YAHOO.widget.Logger.enableBrowserConsole();
    
    // DataGrid erzeugen
    Examples.markup();
  },
  timeout: 10000  // timeout nach 10 Sekunden
 }); 
loader.insert(); 
DataGrid aus vorhandenem Markup

YUI lässt dem Entwickler die Wahl, sein Grid aus einem JavaScript-Objekt oder aus einem vorhandenen Tabellen-Markup zu erstellen. Ebenso muss der Entwickler definieren, welche Datenbasis (HTML-Markup, lokales JavaScript, XML etc.) er verwenden möchte. Im Fall einer bestehenden Anwendung ist die Möglichkeit, als Datenbasis das Markup einer vorhandenen HTML-Tabelle zu verwenden, naheliegend.

Abb. 2: HTML-Tabelle als AusgangspunktAbb. 2: HTML-Tabelle als Ausgangspunkt (Vergrößern)

Um ein YUI DataTable instanziieren zu können, benötigen wir neben einem DataSource-Objekt auch eine Spaltendefinition. In Listing 2 sehen wir, dass die Spaltendefinition aus einem Array von Objektliteralen besteht. Für die Grundkonfiguration sollten je Spalte ein eindeutiger Schlüssel, ein Titel und die Möglichkeit der Sortierung definiert werden.

Die Variable formatter bietet die Möglichkeit, die Inhalte einer Spalte mit einem zugewiesenen formatter-Objekt zu formatieren. Neben der Definition von eigenen Formatierern, bringt YUI eine Reihe vordefinierter Formatierer zur Anpassung der Darstellung, z. B. DataTable.formatNumber, DataTable.formatCurrency, DataTable.formatDate etc., bereits mit. Die Ausgabe des Formatierers kann mittels Formatoptionen in der Konfiguration des DataTable seinen Vorstellungen angepasst beziehungsweise internationalisiert werden:

  • DataTable.formatNumber
    numberOptions: { 
      decimalPlaces: 0, 
      decimalSeparator: ",", 
      thousandsSeparator:"."
    }
  • DataTable.formatCurrency
    currencyOptions: {
      suffix:" €",
      decimalPlaces: 2, 
      decimalSeparator:",", 
      thousandsSeparator:"."
    }
  • DataTable.formatDate
    dateOptions: { format: '%d.%m.%Y' }

Darüber hinaus besteht die Möglichkeit, eigene Parser-Funktionen in der Felddefinition des Response-Schemas zu definieren, um beispielsweise ein MySQL Date zu parsen und in ein JavaScript-Date umzuwandeln. Neben den Formatierern, die sich auf die Darstellung beziehen, stellt YUI auch Formatierer zur Erzeugung von HTML-Formularelementen bereit (Kasten: „Formatierer zur Erstellung von HTML-Formularelementen“).

Formatierer zur Erstellung von HTML-Formularelementen

  • YAHOO.widget.DataTable.formatButton
  • YAHOO.widget.DataTable.formatCheckbox
  • YAHOO.widget.DataTable.formatDropdown
  • YAHOO.widget.DataTable.formatLink
  • YAHOO.widget.DataTable.formatRadio
  • YAHOO.widget.DataTable.formatTextarea
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -