Im ersten Teil wurde bereits ein Überblick über die API gegeben, sodass es in diesem Teil vermehrt um die Entwicklung einer kleinen Erweiterung gehen soll. Ziel ist es ein kleines iWidget anzulegen, welches alle Öffentlichen Foren ausliest und auf der Homepage angezeigt. Da es sich nur um ein Beispiel handelt, wird nicht der gesamte Quelltext ausgegeben werden, sondern auf wichtige Teile beschränkt.
Als Basis für die Erweiterung wird ein kleines iWidget erstellt. Befüllt wird das Widget mittels JavaScript, welches als Resource in das Widget eingebunden wird.
widget.xml:
<iw:iwidget id="communardo_sample" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:iw="http://www.ibm.com/xmlns/prod/iWidget" supportedModes="view" mode="view" iScope="communardo_sampleScope"> <iw:resource id="communardo_jsID" src="communardo_sample.js" /> <iw:content mode="view"> <![CDATA[ <div id="ROOT_DIV">Loading...</div>]]> </iw:content> </iw:iwidget>
In der eingebunden JavaScript-Datei befindet sich die komplette Programmlogik, sodass keine weiteren Dateien benötigt werden. Hauptteil ist die onView-Methode, die automatisch geladen wird wenn das Widget geladen wird.
communardo_sample.js:
... onView : function() { var element = this.iContext.getElementById("ROOT_DIV"); //ROOT-Element laden var conn = new dojox.atom.io.Connection(); // Verbindung initialisiert var url = this.iContext.io.rewriteURI("/forums/atom/forums/my?view=following&filter=forums"); // URL über Proxy vorbereiten conn.getFeed(url, // getFeed-Aufruf function(feed) { // Callback-Methode für den Erfolgsfall element.innerHTML = ""; var entries = feed.entries; // Definition der Einträge for( var i = 0 ; i < entries.length ; i++ ){ // Auslesen der Einträge for( var j = 0 ; j < entries[i].links.length ; j++ ){ //Auslesen der Links if( entries[i].links[j].rel == 'self' ){ var a = dojo.create(('a'), { innerHTML: entries[i].title.value, href: entries[i].links[j].href }); element.appendChild(a); element.appendChild(dojo.create('br')); } } } }, function(err) { //Callback-Methode für den Fehlerfall console.debug(err); }); }, ...
Zu Beginn der Funktion wird das Root-Element geladen, welches in der widget.xml definiert wurde. Anschließend wird mit der Variable "conn" eine Verbindung Atom-Verbindung initialisiert, mit der dann anhand der übergebenen URL (Variable "url") die Feeds geladen werden können. Weitere Parameter der "getFeed"-Methode sind eine Callback-Funktion, die aufgerufen wird, wenn die Daten geladen wurden und eine Callback-Funktion die im Fehlerfall ausgeführt wird.
Callback-Methode für den Erfolgsfall:
Der Callback-Methode wird beim Aufruf das Feed-Element übergeben, sodass innerhalb der Funktion ein Zugriff auf die Daten gewährt wird. Da die Haupt-Daten innerhalb des Feeds in diesem Fall uninteressant sind, werden sofort nach dem Leeren des Root-Elements die Einträge des Feeds ausgelesen und in der neuen Variable "entries" definiert. Anschließend werden alle Einträge in einer Schleife durchiteriert und ausgelesen. Zur Darstellung im Widget genügt uns jedoch nicht der Titel, sodass zusätzlich noch der Link zum jeweiligen Forum ausgelesen werden muss. Dazu werden alle Links des jeweiligen Eintrags ausgelesen und anschließend der Link weiterverfolgt, der ein Verweis auf das eigene Element beinhält (rel="self").
Mit diesen Informationen wird dann das Root-Element befüllt. Im folgenden Screenshot sieht man das Widget in Aktion: