<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Faddie bloggt - schon wieder! &#187; geeked</title>
	<atom:link href="http://blog.sonores.de/category/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sonores.de</link>
	<description>Faddie - die eleganteste Steigerung von Grün</description>
	<lastBuildDate>Wed, 10 Sep 2008 14:04:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.3</generator>
		<item>
		<title>Dojo Tutorial with a grid: part 3 &#8211; english version</title>
		<link>http://blog.sonores.de/2008/03/14/dojo-tutorial-with-a-grid-part-3-english-version/</link>
		<comments>http://blog.sonores.de/2008/03/14/dojo-tutorial-with-a-grid-part-3-english-version/#comments</comments>
		<pubDate>Fri, 14 Mar 2008 10:22:47 +0000</pubDate>
		<dc:creator>faddie</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[english content]]></category>
		<category><![CDATA[geeked]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[Grid]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[XHR]]></category>
		<category><![CDATA[xhttprequest]]></category>

		<guid isPermaLink="false">http://blog.sonores.de/2008/03/14/dojo-tutorial-with-a-grid-part-3-english-version/</guid>
		<description><![CDATA[<br/>Now we&#8217;re dealing with that grid. Finally, since we&#8217;ve been kept busy with the basics so far 3.6 dojo.grid in javascript After search for the name &#8220;Petersen&#8221;, the webserver returns a JSON-String, containing all people with this name. Our goal is now to process this data into a grid . So let&#8217;s have a look [...]]]></description>
			<content:encoded><![CDATA[<br/><p>Now we&#8217;re dealing with that grid. Finally, since we&#8217;ve been kept busy with the basics so far <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h2><span id="more-168"></span> 3.6 dojo.grid in javascript</h2>
<p>After search for the name &#8220;Petersen&#8221;, the webserver returns a JSON-String, containing all people with this name. Our goal is now to process this data into a grid .</p>
<p>So let&#8217;s have a look at gridtut.js again.</p>
<p>Using the command &#8220;var result = eval(&#8216;(&#8216;+data+&#8217;)');&#8221; an array (or better a javascript object) is beeing created from the JSON-string and been saved in the variable &#8220;result&#8221;.</p>
<p>With this array, we can now populate the grid&#8230; but wait, there definately missing a grid :-O<span><span></span></span></p>
<p>Firstof all, we have to tell the grid, how many columns we want to use. This is called view in the world of dojo. Here&#8217;s the example for our view:</p>
<pre name="code" class="js">var view1 = {
	cells: [
		[
			{name: 'Customer_ID', field:'id'},
			{name: 'Given Name', field:'givname'},
			{name: 'Name', field:'surname'},
			{name: 'Job', field:'job'},
			{name: 'Age', field:'age'},
			{name: 'Action', get: linkInGrid}
		]
	]
};</pre>
<p>The property cells contains an array (that why we use square brackets), containing small objects (curly brackets). The property &#8220;name&#8221; of those objects contains the title for the column header, the property &#8220;field&#8221; contains the name field of the data array we&#8217;re going to display.</p>
<p>Lazyness wants us to use global variables so we can access the grid (and the datastore) from all functions and we need a some sample data.</p>
<pre name="code" class="js">var ddata;
var grid;
var store;
var layout = [ view1 ];</pre>
<pre name="code" class="js">var dummydata = { "identifier": 'id',
				   "items":[
				     {	"id": 0,
				     	"givname":"There is",
				      	"surname":"no data ",
				      	"job": "-",
				      	"age": 0}
				   ]
};</pre>
<p>The dojo grid ist very flexible and supports rows, subrows and even subgrids.  The column-layout is defined by the variable &#8220;layout &#8220;(obviously <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ) and we use our just created view for that. The square brackets are mandatory by the way, because we have to use an array again.</p>
<p>The dummy data is usefull in two ways:</p>
<p>1) we can test the grid and exclude the webserver as an error source</p>
<p>2) the sample data is used an a message, that no data has been found. Also the grid only needs to be updated in the future, the creation has been done during the first call of the page.</p>
<p>For the sample data, we need the property &#8220;identifier&#8221; to tell the grid about our dataset&#8217;s primary key (or better: unique identifier)</p>
<p>The property &#8220;items&#8221; contains the datasets in an array.</p>
<p>Following function is going to create the grid:</p>
<pre name="code" class="js">function createGrid(myData) {</pre>
<pre name="code" class="js">	store = new dojo.data.ItemFileReadStore({jsId: 'jsonStore',data: myData});</pre>
<pre name="code" class="js">	ddata = new dojox.grid.data.DojoData(null,store,{jsId: 'model', clientSort: true, query: { id: '*' }});</pre>
<pre name="code" class="js">	grid = new dojox.Grid({id: "OurGrid", model: ddata, onRowMouseOver: keepPopup});</pre>
<pre name="code" class="js">	dojo.byId("gridContainer").appendChild(grid.domNode);</pre>
<pre name="code" class="js">	grid.setStructure(layout);</pre>
<pre name="code" class="js">	grid.startup();
}</pre>
<p>A lot of stuff has been done here, so we better take a close look.</p>
<p><strong>Line 2: </strong><br />
The first thing we do, is to create an ItemFileReadStore using the dojo data model. It gets the javascript id &#8220;jsonStore&#8221; (as I&#8217;ve told you, Dojo likes ids) . For the second parameter we pass our data array &#8211; to keep the function flexible, we use the variable mydata (the parameter in the function call).</p>
<p><strong>Line </strong><strong>3:</strong><br />
Since we now have an ItemFileReadStore, we have to connect it with the grid. The grid knows two ways for the data connection: grid.data.DojoData and grid.data.Table.</p>
<p>Using the table object could be easier: Just pass some sample data without encapsulation in identifier and items. Just plain data, even an ItemFileReadStore isn&#8217;t necessary.</p>
<pre name="code" class="js">// easy but not userful for us...

ddata = new dojox.grid.data.Table(null, dummydaten);</pre>
<p>Well, this is not too hard, but unfortunately not too useful <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  So we have to use DojoData and pass our store to it. The property &#8220;clientSort&#8221;allows the user to sort the data locally with the browser. Looking at the property &#8220;query&#8221; show us it&#8217;s relationship to the database world. We&#8217;re telling the model to collect all unique record sets, using id as a primary key &#8211; somehow a client-side &#8220;SELECT *&#8221;.</p>
<p><strong>Line </strong><strong>4:</strong><br />
Finally we create the grid itself. It gets an Id and we pass the store, as well as the model.</p>
<p><strong>Line </strong><strong>5:</strong><br />
We also have the define the layout und use &#8220;setStructure&#8221; for that.</p>
<p><strong>Line </strong><strong>6:</strong><br />
In part 1  we already defined a placeholder for the grid (that &lt;div&gt;-Container) and here we attach the grid to it.</p>
<p><strong>Line </strong><strong>7:<br />
</strong>At last it&#8217;s time to start the grid. Our just created function might come handy for this task <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<pre name="code" class="js">createGrid(dummydaten);</pre>
<p>Only a little  bit of CSS is needed, we add to our html-file:</p>
<pre name="code" class="css">&lt;style type="text/css"&gt;

 div.gridDiv {

 width: 600px;

 height: 450px;

 }

&lt;/style&gt;</pre>
<p>It is necessary to define the grid&#8217;s width, otherwise nothing is shown &#8211; this is a popular error source by the way.</p>
<p>If we&#8217;ve been good, the following is shown (depending on your language, of course):</p>
<p><img src="http://blog.sonores.de/wp-content/uploads/2008/02/gridtut-step6.JPG" alt="Unser erstes Grid" /></p>
<p>More to come in the next part.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sonores.de/2008/03/14/dojo-tutorial-with-a-grid-part-3-english-version/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Zend Studio Toolbar für Firefox 3</title>
		<link>http://blog.sonores.de/2008/03/13/zend-studio-toolbar-fur-firefox-3/</link>
		<comments>http://blog.sonores.de/2008/03/13/zend-studio-toolbar-fur-firefox-3/#comments</comments>
		<pubDate>Thu, 13 Mar 2008 10:46:00 +0000</pubDate>
		<dc:creator>faddie</dc:creator>
				<category><![CDATA[Faddies News]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[geeked]]></category>
		<category><![CDATA[Firefox 3]]></category>
		<category><![CDATA[Zend Studio Toolbar]]></category>

		<guid isPermaLink="false">http://blog.sonores.de/2008/03/13/zend-studio-toolbar-fur-firefox-3/</guid>
		<description><![CDATA[<br/>Dieser kleine Hack kann eventuell die Sicherheit von Firefox 3 beeinträchtigen, daher weise ich noch deutlicher als sonst, alle Verantwortung von mir. Damit die Zend Studio Toolbar auch mit dem neuen Firefox läuft, muss man ein klein wenig Hand anlegen. Ansonsten funktioniert das Debugging auch mit dem neusten Firefox ganz ausgezeichnet &#8211; mal sehen, wann [...]]]></description>
			<content:encoded><![CDATA[<br/><p><img src="http://blog.sonores.de/wp-content/uploads/2007/12/leet_speak.thumbnail.gif" alt="Leet Speak" align="right" />Dieser kleine Hack kann eventuell die Sicherheit von Firefox 3 beeinträchtigen, daher weise ich noch deutlicher als sonst, alle Verantwortung von mir.</p>
<p>Damit die Zend Studio Toolbar auch mit dem neuen Firefox läuft, muss man ein klein wenig Hand anlegen. Ansonsten funktioniert das Debugging auch mit dem neusten Firefox ganz ausgezeichnet &#8211; mal sehen, wann Zend die Toolbar offiziell updated.</p>
<p>Zuerst zieht man sich die Toolbar vom Zend-Server, nämlich hier:<img src="http://developer.mozilla.org/wiki-images/en/1/1d/Firefoxlogo2.png" alt="Firefox Logo" align="right" height="155" width="135" /></p>
<p>http://downloads.zend.com/studio_plugins/2.0.2/ZendFirefoxToolbar-2.0.2.xpi</p>
<p>Dafür eigenet sich am besten ein Downloadmanager oder der Internet Explorer, weil Firefox das Paket gleich installieren möchte.</p>
<p>Da eine .xpi-Datei im Grunde auch nur ein .zip Archiv ist, wird die Dateierweiterung entsprechend geändert und mit Winzip irgendwo hin ausgepackt.</p>
<p>In diesem Archiv ist eine Datei namens install.rdf &#8211; diese wird jetzt ein wenig angepasst.</p>
<p>In Zeile 16 ist bei mir das Tag-Paar &lt;em:updateURL&gt; . Hier wird http durch https ersetzt, weil Firefox sonst immer von unsicheren Updates spricht und die Toolbar nicht installieren mag.</p>
<p>In Zeile 22 wird bei &lt;em:maxVersion&gt; die Versionsnummer einfach von 2.0+ auf 3.0+ raufgesetzt. Fertig <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Jetzt wird alles wieder als zip verpackt und die Dateiendung auf .xpi geändert.</p>
<p>Diese neue .xpi Datei kann jetzt per drag-and drop auf die Adresszeile im Firefox gezogen werden &#8211; danach wird die Toolbar anstandslos installiert.</p>
<p>Ich würde zwar auch gerne meine Version online stellen, aber das ist bestimmt mal wieder nicht erlaubt <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sonores.de/2008/03/13/zend-studio-toolbar-fur-firefox-3/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Dojo Tutorial mit Grid &#8211; Teil 6 1/2: JSON mit PHP 4</title>
		<link>http://blog.sonores.de/2008/02/13/dojo-tutorial-mit-grid-teil-6-12-json-mit-php-4/</link>
		<comments>http://blog.sonores.de/2008/02/13/dojo-tutorial-mit-grid-teil-6-12-json-mit-php-4/#comments</comments>
		<pubDate>Wed, 13 Feb 2008 14:23:10 +0000</pubDate>
		<dc:creator>faddie</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[geeked]]></category>

		<guid isPermaLink="false">http://blog.sonores.de/2008/02/13/dojo-tutorial-mit-grid-teil-6-12-json-mit-php-4/</guid>
		<description><![CDATA[<br/>Ha, da bin ich doch noch einmal und zwar schneller als gedacht. Die Funktion json_encode, die ich die ganze Zeit im Tutorial verwendet habe, gibt&#8217;s ja noch gar nicht in PHP unter Version 5.2.0. PHP-Freunde lesen weiter Wenn wir also mit PHP-Servern kleiner 5.2 arbeiten, müssen wir eine externe PHP-Klasse einbinden. Bewährt hat sich die [...]]]></description>
			<content:encoded><![CDATA[<br/><p>Ha, da bin ich doch noch einmal und zwar schneller als gedacht.</p>
<p>Die Funktion json_encode, die ich die ganze Zeit im Tutorial verwendet habe, gibt&#8217;s ja noch gar nicht in PHP unter Version 5.2.0.</p>
<p>PHP-Freunde lesen weiter <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><span id="more-146"></span>Wenn wir also mit PHP-Servern kleiner 5.2 arbeiten, müssen wir eine externe PHP-Klasse einbinden.</p>
<p>Bewährt hat sich die folgende 
<a  href="http://pear.php.net/pepr/pepr-proposal-show.php?id=198" target="_blank" onclick="javascript:pageTracker._trackPageview('/external/pear.php.net/pepr/pepr-proposal-show.php');" >http://pear.php.net/pepr/pepr-proposal-show.php?id=198</a><br />
Download: 
<a  href="http://mike.teczno.com/JSON.tar.gz" target="_blank" onclick="javascript:pageTracker._trackPageview('/external/mike.teczno.com/JSON.tar.gz');" >http://mike.teczno.com/JSON.tar.gz </a></p>
<p>Hier ist nun der veränderte Programmteil der PHP-Seite.</p>
<pre name="code" class="php">	// Ist Javascript für den Browser aktiv?
	if (isset($_REQUEST['js_aktiv'])) {
		// Das Array für das Dojo-Grid aufbereiten
        $temp = Array ('identifier'=&gt;'lfdnr', 'items'=&gt;$ergebnis);
        // Wenn die Funktion json_encode nicht vorhanden ist, nachladen
			if (function_exists("json_encode")) {
			    echo json_encode($temp);
			}
            else {
                include ('./JSON.php');
				$json = new services_JSON();
				echo $json-&gt;encode($temp);
            }
	}
	// Anzeige ohne Javascript
	else {
	// und so weiter....
        }</pre>
<p>Jetzt läuft unser Beispiel auch mit älteren PHP-Versionen.</p>
<p>Step-JSON zum Runterladen:  
<a  href="http://blog.sonores.de/wp-content/uploads/2008/02/gridtut_request.php" title="Gridtutrequest-JSON">Gridtutrequest-JSON</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sonores.de/2008/02/13/dojo-tutorial-mit-grid-teil-6-12-json-mit-php-4/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dojo Tutorial mit Grid &#8211; Teil 6: Links im Grid</title>
		<link>http://blog.sonores.de/2008/02/13/dojo-tutorial-mit-grid-teil-6-links-im-grid/</link>
		<comments>http://blog.sonores.de/2008/02/13/dojo-tutorial-mit-grid-teil-6-links-im-grid/#comments</comments>
		<pubDate>Wed, 13 Feb 2008 12:24:48 +0000</pubDate>
		<dc:creator>faddie</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[geeked]]></category>

		<guid isPermaLink="false">http://blog.sonores.de/2008/02/13/dojo-tutorial-mit-grid-teil-6-links-im-grid/</guid>
		<description><![CDATA[<br/>Kommen wir nun (endlich) zum vorerst letzten Teil des Dojo-Tutorials. Der einzig fehlende Teil ist noch das Popup-Fenster, dass wir aus dem Grid heraus öffnen wollen. Dazu müssen wir in der View auf eine eigene Funktion verweisen. Wenn das hier fertig ist, kann ich auch endlich Rechtschreibfehler suchen gehen. Erinnern wir uns nochmal an die [...]]]></description>
			<content:encoded><![CDATA[<br/><p>Kommen wir nun (endlich) zum vorerst letzten Teil des Dojo-Tutorials. Der einzig fehlende Teil ist noch das Popup-Fenster, dass wir aus dem Grid heraus öffnen wollen. Dazu müssen wir in der View auf eine eigene Funktion verweisen.</p>
<p>Wenn das hier fertig ist, kann ich auch endlich Rechtschreibfehler suchen gehen.</p>
<p><span id="more-141"></span></p>
<p>Erinnern wir uns nochmal an die (das?) View vom Grid. Wir haben bei &#8220;name&#8221; den Spaltennamen angegeben und bei &#8220;field&#8221; den Namen im Modell (bzw. dem Array vom Webserver). Jetzt wollen wir aber aus dem Spalteninhalt einen Link generieren.</p>
<p>Es wäre auch möglich, bereits serverseitig den Link zu generieren und nur noch im Grid anzuzeigen. Allerdings würde die zu übertragende Datenmenge erheblich wachsen und somit das Laden verzögern.</p>
<p>Erweitern wir die Grid-View um eine Zusätzliche Spalte:</p>
<pre name="code" class="js">var view1 = {
 cells: [
 	[
 		{name: 'Kundennummer', field:'lfdnr'},
 		{name: 'Vorname', field:'vname'},
 		{name: 'Nachname', field:'nname'},
 		{name: 'Beruf', field:'beruf'},
 		{name: 'Alter', field:'alter'},
 		{name: 'Aktion', get: linkImGrid}
 	]
 ]
};</pre>
<p>Anstelle der Eigenschaft &#8220;field&#8221; verwenden wir &#8220;get&#8221;.  Diese gibt dem Grid an, dass der Inhalt für diese Spalte nicht aus dem Modell kommen soll, sonden von der Funktion &#8220;linkImGrid&#8221;.</p>
<p>Diese sieht wie folgt aus:</p>
<pre name="code" class="js">function linkImGrid(inRowIndex) {
 var zelle = grid.model.getDatum(inRowIndex,0);
 if (zelle == 0 || isNaN(zelle))
 	return '';
 else
 	return '&lt;a href="javascript:zeige_Popup('+zelle+')" title="Zeigen"&gt;Zeigen&lt;/a&gt;';
}</pre>
<p>Das Grid übergibt der Funktion völlig von selbst die Zeilennummer als Parameter, hier &#8220;inRowIndex&#8221;. Über die Funktion &#8220;grid.model.getDatum&#8221; holen wir uns den Wert der ersten Zelle, also die Kundennummer bzw. &#8220;ldfnr&#8221;. Anzumerken sei übrigens, dass getDatum ein etwas wiedersprüchlicher Name für die Funktion ist. Aber im Quelltext vom Grid steht, dass man das so machen soll &#8211; fragt sich natürlich, wie lange noch&#8230; dafür ist das leider DojoX (Experimental). Eine andere Funktion für diesen Zweck wüsste ich jedenfalls nicht, also getDatum, die alles holt, nicht nur das Datum.</p>
<p>Wenn die erste Zelle in der Zeile 0 oder leer ist, wird kein Link generiert, ansonsten schon. Man könnte auch noch mehr Entscheidungen einbauen, z.B. wenn das Alter über 60 ist, dann zeige den Link in Schriftgröße 20 an oder so <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /><br />
Zu guter Letzt noch die Popup-Funktion, die aber wirklich nichts besonderes macht:</p>
<pre name="code" class="js">function zeige_Popup(lfdnr) {
 var url = "gridtut_pop.html";
 var optionen = "width=650, height=650, left=0, top=0, scrollbars=1,location=0,statusbar=0,menu bar=0,resizable=1";
 win=window.open(url,"Zeige Kunden: " + lfdnr,optionen);
 win.focus();
}</pre>
<p>Mit dem Parameter könnte man auch sinnvollere Dinge anstellen, z.B. diesen per Get-Parameter an das Popup übertragen. usw.</p>
<p>Man könnte meinen, das wir jetzt fertig wären. Leider hat der Grid noch einen geringfügigen Bug (Dojo 1.0.2) &#8211; wenn man mit der Maus über eine Zeile fährt, drängt sich das Browser-Fenster in den Vordergrund. Das passiert zwar (natürlich) nur beim Internet Explorer, ist aber trotzdem sehr lästig und schließt die Verwendung von Popups eigentlich schon wieder aus.</p>
<p>Nun kann man entweder die Popups in Dojo-Dialoge einbetten oder folgenden Workaround einbauen.</p>
<p>In der createGrid-Funktion ändern wir die Zeile zum Erstellen des Grids wie folgt ab:</p>
<pre name="code" class="js">grid = new dojox.Grid({id: "DasGrid", model: ddata, onRowMouseOver: keepPopup});</pre>
<p>Wir geben also eine eigene Funktion für das Ereignis an, wenn die Maus über eine Zelle fährt.</p>
<pre name="code" class="js">function keepPopup(evt) {
 if (win &amp;&amp; !win.closed) win.focus();
}</pre>
<p>Damit das so funktioniert, muss die Variable für das Popup sich auch in den Club der globalen Variablen gesellen. Ungefähr so:</p>
<pre name="code" class="js">var win = false;</pre>
<p>Diese Funktion besagt folgendes: Wenn ein Popup existiert und noch nicht geschlossen wurde, dann bringe es wieder in den Vordergrund. So flackert das Popup natürlich, wenn man mit der Maus über die Zeilen geht, und das auch noch im völlig unschuldigen Firefox. <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_eek.gif' alt='8O' class='wp-smiley' /> Daher würde ich lieber auf einen Dojo-Dialog setzen, sofern man es sich leisten kann.</p>
<p>Beim Surfen ohne Javascript wird dieser Link noch nicht angezeigt, daher fügen wir ihn schnell serverseitig hinzu. Hier der entsprechende Teil für PHP:</p>
<pre name="code" class="php">	// Anzeige ohne Javascript
 else {
 	echo "&lt;table border='1'&gt;\n";
 	echo "&lt;tr&gt;&lt;td&gt;Kundennummer&lt;/td&gt;
 			&lt;td&gt;Vorname&lt;/td&gt;
 			&lt;td&gt;Nachname&lt;/td&gt;
 			&lt;td&gt;Beruf&lt;/td&gt;
 			&lt;td&gt;Alter&lt;/td&gt;
 			&lt;td&gt;Aktion&lt;/td&gt;";
 	echo "&lt;/tr&gt;\n";
 	foreach ($ergebnis as $zeile =&gt; $wert) {
 		echo "&lt;tr&gt;";
 		echo "&lt;td&gt;".$wert['lfdnr']."&lt;/td&gt;";
 		echo "&lt;td&gt;".$wert['vname']."&lt;/td&gt;";
 		echo "&lt;td&gt;".$wert['nname']."&lt;/td&gt;";
 		echo "&lt;td&gt;".$wert['beruf']."&lt;/td&gt;";
 		echo "&lt;td&gt;".$wert['alter']."&lt;/td&gt;";
 		echo "&lt;td&gt;&lt;a href=\"gridtut_pop.html\" target=\"_blank\" title=\"Zeigen\"&gt;Zeigen&lt;/a&gt;&lt;/td&gt;";
 		echo "&lt;/tr&gt;\n";
 	}
 	echo "&lt;/table&gt;\n";
 }</pre>
<p>So, damit kommen wir zum Ende. Ist doch alles etwas ausführlicher geworden, als ursprünglich geplant.</p>
<p>Step-9 zum Runterladen: 
<a  href="http://blog.sonores.de/wp-content/uploads/2008/02/step9-gridtut.js" title="Gridtut-9-js" onclick="javascript:pageTracker._trackPageview('/downloads/wp-content/uploads/2008/02/step9-gridtut.js');" >Gridtut-9-js</a> 
<a  href="http://blog.sonores.de/wp-content/uploads/2008/02/step-9-gridtut_request.php" title="Gridtut-9-php">Gridtut-9-php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sonores.de/2008/02/13/dojo-tutorial-mit-grid-teil-6-links-im-grid/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dojo Tutorial mit Grid &#8211; Teil 5: Events</title>
		<link>http://blog.sonores.de/2008/02/13/dojo-tutorial-mit-grid-teil-5-events/</link>
		<comments>http://blog.sonores.de/2008/02/13/dojo-tutorial-mit-grid-teil-5-events/#comments</comments>
		<pubDate>Wed, 13 Feb 2008 09:59:21 +0000</pubDate>
		<dc:creator>faddie</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[geeked]]></category>
		<category><![CDATA[activity indicator]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Dijit]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[Grid]]></category>

		<guid isPermaLink="false">http://blog.sonores.de/2008/02/13/dojo-tutorial-mit-grid-teil-5-events/</guid>
		<description><![CDATA[<br/>Heute kümmern wir uns um einen Ajax-Statusindikator. Das fördert die Usability unserer Seite, weil der Browser für Ajax-Aufrufe normalerweise keine Ladeanimation anzeigt (das Ding oben rechts im Browser). Also machen wir das selbst! Zunächst benötigen wir so ein animiertes .gif, dass wir als Statusindikator verwenden können. Auf dieser Seite hier gibt&#8217;s jede Menge davon: http://www.napyfab.com/ajax-indicators/ [...]]]></description>
			<content:encoded><![CDATA[<br/><p>Heute kümmern wir uns um einen Ajax-Statusindikator. Das fördert die Usability unserer Seite, weil der Browser für Ajax-Aufrufe normalerweise keine Ladeanimation anzeigt (das Ding oben rechts im Browser). Also machen wir das selbst!</p>
<p><span id="more-137"></span> Zunächst benötigen wir so ein animiertes .gif, dass wir als Statusindikator verwenden können. Auf dieser Seite hier gibt&#8217;s jede Menge davon:<strike> http://www.napyfab.com/ajax-indicators/</strike></p>
<p><strong>Update:</strong> Der obere Link hat sich in Rauch aufgelöst, in der Zwischenzeit kann hier Abhilfe geschaffen werden: 
<a  href="http://www.ajaxload.info/" title="Ajaxload" target="_blank" onclick="javascript:pageTracker._trackPageview('/external/www.ajaxload.info/');" >http://www.ajaxload.info/ </a></p>
<p>Ich habe mich für dieses auffällige Exemplar entschieden: <img src="http://blog.sonores.de/wp-content/uploads/2008/02/progressbar_long.gif" alt="Progressbar" /></p>
<p>Jetzt müssen wir es nur noch schaffen, dass diese Grafik immer dann angezeigt wird, wenn Dojo Inhalte vom Server nachlädt. Hierfür verwenden wir wieder Dojo Events, bloß diesmal nicht mit Browserereignissen (onClick usw.), sondern mit eigenen Ereignissen.</p>
<p>Kümmern wir uns aber erstmal um den HTML-Teil.</p>
<pre name="code" class="html">&lt;div class="warten" id="indikator"&gt;
	Bitte warten...&lt;br /&gt;
	&lt;img src="progressbar_long.gif" /&gt;
&lt;/div&gt;</pre>
<p>Wir haben hier einen einfachen &lt;div&gt;-Container. Ich habe bewusst keinen schickes Dialog Dijit verwendet, weil das hier auch angezeigt werden soll, wenn Dojo noch nicht geladen worden ist.</p>
<p>Damit es aber wenigstens ein bisschen was her macht, hier der CSS-Teil.</p>
<pre name="code" class="css">.warten {
	display:none;
	position:absolute;
	top:80px;
	left:20px;
	padding:10px;
	border:1px solid gray;
	background-color:white;
 	z-index:999;
}</pre>
<p>Wir legen den &lt;div&gt;-Container zum Teil über das Suchformular, damit der Indikator auch ins Auge springt. Damit uns der Indikator beim Surfen ohne Javascript nicht auf die Nerven geht, lassen wir ihn vorerst ausgeblenden (display:none).</p>
<p>Unter den &lt;style&gt;-Block kommt ein kleiner Javascript-Block hinzu, um das Element einzublenden:</p>
<pre>&lt;script type="text/javascript"&gt;document.write('&lt;style type="text/css"&gt;.warten{display:block;}&lt;/style&gt;');&lt;/script&gt;</pre>
<p>Jetzt können wir den HTML-Part verlassen und zum wirklichen Javascript-Teil übergehen.</p>
<p>In der Funktion &#8220;init&#8221;, die bekanntlich von Dojo nach dem vollständigen Laden der Seite, inkl. aller Scripts, aufgerufen wird, tragen wir folgendes ein:</p>
<pre name="code" class="js">topics[0] = dojo.subscribe("seiteAktiv", null, indikatorWechseln);</pre>
<p>Das Array &#8220;topics&#8221; sollte vorher natürlich präsent sein. Da wir ohnehin schon so viele globale Variablen haben, warum nicht noch eine mehr&#8230; setzen wir das Array doch hinter die globalen Grid-Variablen.</p>
<pre name="code" class="js">var ddata;
var grid;
var store;
var layout = [ view1 ];
var topics = [];</pre>
<p>Dojo verwendet für eigene Ereignisse einen Event-Queue. Man kann sich wie ein Abo vorstellen und Dojo ist der Postbote vom Postamt &#8220;topics&#8221; (jeder Abonnent bekommt einen eigenen Platz im Array topics).</p>
<p>Mit &#8220;dojo.subscribe&#8221; erstellt man einen Abonnenten, der ganz wahnsinnig oft in seinen Briefkasten guckt <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  Zusätzlich sagt man mit der Funktion noch, was der Abonnent mit dem Telegramm machen soll. Unser Abonnent heißt &#8220;seiteAktiv&#8221; und soll &#8220;indikatorWechseln&#8221; machen &#8211; abhängig davon, was in dem Telegramm steht.</p>
<p>Wir verschicken diese Telegramme mit der Funktion &#8220;dojo.publish&#8221;.</p>
<pre name="code" class="js">dojo.publish("seiteAktiv", ["ja"]);</pre>
<p>Unser leicht nervöser Abonnent schaut umgehend in den Briefkasten und findet sein Telegramm. Er ruft die Funktion &#8220;indikatorWechseln&#8221; mit dem Wert &#8220;ja&#8221; auf,  denn das stand ja in dem Telegramm.</p>
<p>Zusammenfassend etwas abstrakter: in ein Array, hier &#8220;topics[]&#8220;, werden die &#8220;listener&#8221; mit der Funktion &#8220;subscribe&#8221; erstellt. Mit dojo.publish werden diese dann angesprochen. Der &#8220;listener&#8221; ruft dann die Funktion auf mit dem übergebenen Wert aus, hier die Funktion &#8220;indikatorWechseln&#8221; mit dem Wert &#8220;ja&#8221;.</p>
<p>Die Funktion indikatorWechseln will natürlich auch erstellt sein:</p>
<pre name="code" class="js">function indikatorWechseln(evt) {
	if (evt=="ja") dojo.byId('indikator').style.display='block';
	else dojo.byId('indikator').style.display='none';
}</pre>
<p>Hier geschieht nicht viel, wenn der Wert vom Parameter &#8220;evt&#8221; &#8220;ja&#8221; ist, wird der &lt;div&gt;-Container eingeblendet, sonst nicht.</p>
<p>Wenn wir jetzt alles erstellt haben, brauchen wir nur noch in der &#8220;init&#8221;-Funktion am Ende das Telegramm versenden, dass die Seite nicht mehr aktiv ist &#8211; also folgendermaßen:</p>
<pre name="code" class="js">dojo.publish("seiteAktiv", ["nein"]);</pre>
<p>Jetzt können wir mit dojo.publish den Indikator so oft wir wollen an- und ausschalten. Sinnvoll ist das bei unserer &#8220;mein_submit&#8221;-Funktion: einmal vor der Kommunikation mit dem Server mit &#8220;ja&#8221; und einmal danach mit &#8220;nein&#8221;.</p>
<p>Wieder einmal die ganze mein_submit Funktion in ihrer ganzen Pracht <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<pre name="code" class="js">function mein_submit (event) {
	// Den Standard-Submit und das Verlassen
	// der Seite verhindern
	dojo.stopEvent(event);
	dojo.publish("seiteAktiv", ["ja"]);
	// das Textfeld auslesen
	var textfeld_name = dijit.byId("txt_name").getValue();
	// Prüfen, ob das Textfeld leer ist
	if (textfeld_name =='') {
		alert ('Sie müssen einen Namen eintragen');
		dojo.publish("seiteAktiv", ["nein"]);
		return false;
	}
	else {
		// Umlaute in HTML-Entitäten konvertieren
		textfeld_name = htmlFromUmlaut(textfeld_name);
		// Parameter für asynchrone Übertragung (Ajax)
		var kw = {
			// Hier liegt die dynamische Seite
			url: "gridtut_request.php",
			// wird bei Server-Antwort aufgerufen
			load: function(data){
					// Server-String auswerten und Grid updaten
					var ergebnis = eval('('+data+')');
					updateGrid(ergebnis);
					dojo.publish("seiteAktiv", ["nein"]);
			},
			// wird bei Server-Fehler aufgerufen
			error: function(data){
			        alert("Es ist ein Fehler aufgetreten: " + data);
			        dojo.publish("seiteAktiv", ["nein"]);

			},
			// Werte, die übertragen werden
			content: {  txt_name: textfeld_name,
						js_aktiv: 'ja'}
		};
		dojo.xhrPost(kw);
	}
}</pre>
<p>Man sieht, dass wir für jeden Ausstiegspunkt aus der Funktion auch dem Indikator bescheid geben müssen.</p>
<p>Wer noch mag, kann die &#8220;indikatorWechseln&#8221;-Funktion noch so aufboren, dass der Such-Button während der Aktivität deaktiviert ist. Sowas halte ich bei einer &#8220;Speichern&#8221;Funktion allerdings sinnvoller.</p>
<p>So, Events haben wir abgehakt! Bleibt noch das Popup im nächsten Teil.</p>
<p>Step-8 zum Runterladen: 
<a  href="http://blog.sonores.de/wp-content/uploads/2008/02/step8-gridtut.js" title="Gridtut-8-js" onclick="javascript:pageTracker._trackPageview('/downloads/wp-content/uploads/2008/02/step8-gridtut.js');" >Gridtut-8-js</a> 
<a  href="http://blog.sonores.de/wp-content/uploads/2008/02/step8-gridtut.html" title="Gridtut-8-html">Gridtut-8-html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sonores.de/2008/02/13/dojo-tutorial-mit-grid-teil-5-events/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Dojo Tutorial mit Grid &#8211; Teil 4: Grid updaten</title>
		<link>http://blog.sonores.de/2008/02/12/dojo-tutorial-mit-grid-teil-4/</link>
		<comments>http://blog.sonores.de/2008/02/12/dojo-tutorial-mit-grid-teil-4/#comments</comments>
		<pubDate>Tue, 12 Feb 2008 14:27:39 +0000</pubDate>
		<dc:creator>faddie</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[geeked]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Dijit]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[Grid]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Umlaut]]></category>
		<category><![CDATA[XHR]]></category>
		<category><![CDATA[xmlHttprequest]]></category>

		<guid isPermaLink="false">http://blog.sonores.de/2008/02/12/dojo-tutorial-mit-grid-teil-4/</guid>
		<description><![CDATA[<br/>Wir sind in den vorherigen Teilen soweit gekommen, dass wir ein Grid darstellen können und per Ajax mit dem Server kommunizieren können. Was noch fehlt, ist die Antwort vom Server an das Grid weiterzuleiten &#8211; noch geben wir die Antwort nur mit einem simplen Alert aus. Wer noch nicht aufgegeben hat, klickt sich weiter durch [...]]]></description>
			<content:encoded><![CDATA[<br/><p>Wir sind in den vorherigen Teilen soweit gekommen, dass wir ein Grid darstellen können und per Ajax mit dem Server kommunizieren können. Was noch fehlt, ist die Antwort vom Server an das Grid weiterzuleiten &#8211; noch geben wir die Antwort nur mit einem simplen Alert aus.</p>
<p>Wer noch nicht aufgegeben hat, klickt sich weiter durch <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><span id="more-132"></span>Wir benötigen zu der createGrid- Funktion noch eine update-Funktion. Diese sieht der create-Funktion sehr ähnlich:</p>
<pre name="code" class="js">function updateGrid(meineDaten) {
	store = new dojo.data.ItemFileReadStore({jsId: 'jsonStore',data: meineDaten});
	ddata = new dojox.grid.data.DojoData(null,store,{jsId: 'model', clientSort: true, query: { lfdnr: '*' }});
	grid.setModel(ddata);
	grid.update();
}</pre>
<p>Leider kann ein ReadStore meines Wissens zur Zeit noch nicht aktualisiert werden, daher müssen wir ihn neu erstellen. Daraufhin erstellen wir auch das Modell für das Grid neu und weisen diesem das neue Modell zu. Als letztes veranlassen wir, dass das Grid sich aktualisiert.</p>
<p>Ich muss zu meiner Schande gestehen, dass es sich hier nicht um den Königsweg handelt. Falls jemand eine bessere Lösung findet, würde ich mich über eine Nachricht freuen. Fakt ist jedoch, dass diese Methode am einfachsten nachzuvollziehen ist und vor allem funktioniert.</p>
<p>Unsere Update-Funktion binden wir nun einfach in die &#8220;mein_submit()&#8221; Funktion ein und schon sind wir fertig. Die &#8220;mein_submit()&#8221; sieht nun so aus:</p>
<pre name="code" class="js">function mein_submit (event) {
	dojo.stopEvent(event);
	var kw = {
		url: "gridtut_request.php",
		load: function(data){
				var ergebnis = eval('('+data+')');
				updateGrid(ergebnis);
		},
		error: function(data){
		        alert("Es ist ein Fehler aufgetreten: " + data);

		},
		form: "form_suche"
	};
	dojo.xhrPost(kw);
}</pre>
<p>Schauen wir noch einmal auf den Load-Abschnitt. Die eval-Funktion generiert uns aus dem Text-String vom Webserver ein Javascrip Objekt, das wir nun an die Update-Funktion übergeben. Um den Rest kümmert sich Dojo.</p>
<p>Fertig <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' />  &#8230; so könnte man meinen. Aber bisher haben wir ja auch nur nach &#8220;Petersen&#8221; gesucht. Was passiert bei &#8220;Schröder&#8221;?</p>
<p>Wer mir gefolgt ist und kein UTF-8 verwendet hat, bekommt nun ein Problem. Umlaute per Ajax übertragen ging zwar noch in der Version 0.4. Aber 0.9 &#8211; 1.0.2 wollen uns erziehen und haben das abgeschaltet (oder es ist ein Bug)</p>
<p>Nun wäre es aber ein gehöriger Entwicklungsaufwand, eine komplette Anwendung auf UTF-8 umzustricken, daher wandeln wir einfach den Inhalt des Input-Feldes in HTML-Entitäten (die Dinger mit ä ; ).</p>
<p>Daraus ergibt sich dann wiederum das Problem, dass wir in der Ajax-Funktion &#8220;mein_submit&#8221; nicht mehr mit der &#8220;form&#8221; Eigenschaft arbeiten können, sonder &#8220;content&#8221; verwenden müssen &#8211; aber dazu später.</p>
<p>Hier als erstes die Funktionen, in Javascript Umlaute in HTML-Entitäten umzuwandeln (und zurück)</p>
<pre name="code" class="js">function htmlToUmlaut(text) {
	text=text.split("&gt;").join("&gt;").split("&lt;").join("&lt;").split("ü").join("ü").split("ö").join("ö").split("ä").join("ä").split("Ü").join("Ü").split("Ö").join("Ö").split("Ä").join("Ä").split("ß").join("ß");
	return text;
}

function htmlFromUmlaut(text) {
	text=text.split("&gt;").join("&gt;").split("&lt;").join("&lt;").split("ü").join("ü").split("ö").join("ö").split("ä").join("ä").split("Ü").join("Ü").split("Ö").join("Ö").split("Ä").join("Ä").split("ß").join("ß");
	return text;
}</pre>
<p>Jetzt die angepasste &#8220;mein_submit&#8221; Funktion, zur Übersichtlichkeit diesmal besser kommentiert.</p>
<pre name="code" class="js">// Die neue Submit-Funktion
function mein_submit (event) {
	// Den Standard-Submit und das Verlassen
	// der Seite verhindern
	dojo.stopEvent(event);
	// das Textfeld auslesen
	var textfeld_name = dijit.byId("txt_name").getValue();
	// Prüfen, ob das Textfeld leer ist
	if (textfeld_name =='') {
		alert ('Sie müssen einen Namen eintragen');
		return false;
	}
	else {
		// Umlaute in HTML-Entitäten konvertieren
		textfeld_name = htmlFromUmlaut(textfeld_name);
		// Parameter für asynchrone Übertragung (Ajax)
		var kw = {
			// Hier liegt die dynamische Seite
			url: "gridtut_request.php",
			// wird bei Server-Antwort aufgerufen
			load: function(data){
					// Server-String auswerten und Grid updaten
					var ergebnis = eval('('+data+')');
					updateGrid(ergebnis);
			},
			// wird bei Server-Fehler aufgerufen
			error: function(data){
			        alert("Es ist ein Fehler aufgetreten: " + data);

			},
			// Werte, die übertragen werden
			content: {  txt_name: textfeld_name,
						js_aktiv: 'ja'}
		};
		dojo.xhrPost(kw);
	}
}</pre>
<p>Das Textfeld, das wir verwendet haben, ist ja ein sogenanntes Dijit. Diesen Umstand können wir uns zu nutze machen und mit der Funktion &#8220;dijit.byId(&#8220;txt_name&#8221;).getValue&#8221; den Wert aus dem Textfeld holen. Es gibt übrigens auch noch ein setValue, nicht verwechseln sollte man übrigens dijit.byId (für Dojo Widgets) und dojo.byId (für HTML-Elemente).<br />
In diesem Fall bräuchte man natürlich nicht zwingend mit getValue arbeiten, da das Textbox-Dijit ja nur ein hübsches HTML &lt;input&gt; Element ist. Bei dem FilteringSelect Dijit sähe das anders aus, das ist nämlich auch ein &lt;input&gt; Element, das ein Drop-Down simuliert&#8230; aber ich schweife schon wieder ab <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Also wir holen den Wert mit getValue, prüfen ob was drin steht und wenn ja, konvertieren wir noch die Umlaute.</p>
<p>Bei den Keywords von xhrPost verwenden wir anstelle von &#8220;form&#8221; die Eigenschaft &#8220;content&#8221;. Vor den Doppelpunkt schreiben wir, wie die Variable heißen soll, die an den Server übertragen wird, dahinter den Wert. Da wir das HTML-Element mit der Eigenschaft &#8220;name&#8221; schon &#8220;txt_name&#8221; genannt haben, sollten wir das hier auch so beibehalten. Dann müssen wir serverseitig nichts ändern. Als nächstes Wertepaar habe ich noch js_aktiv mit dazu geschrieben und auf &#8220;ja&#8221; gesetzt.</p>
<p>Wir erinnern uns: die Seite soll auch ohne Javascript einigermaßen funktionieren. Der Parameter &#8220;js_aktiv&#8221; kann nur an den Server übertragen werden, wenn Javascript auch wirklich aktiv ist. Sonst wird der Parameter nicht an der Server gesendet. So können wir es serverseitig einrichten, dass ohne Parameter eine HTML-Tabelle zurückgegeben wird und mit Parameter der JSON-String.</p>
<p><strong>Wichtig: </strong>Bei &#8220;content&#8221; möglichst auf Sonderzeichen verzichten, selbst ein Bindestrich führt zu einem Fehler (&#8220;js-aktiv&#8221; geht nicht)  Das Leben als Javascript-Entwickler ist hart <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Hier nun der veränderte PHP-Code, um zwischen Javascript und nicht-Javascript Browsern zu unterscheiden</p>
<pre name="code" class="php">	// Ist Javascript für den Browser aktiv?
	if (isset($_REQUEST['js_aktiv'])) {
		// Das Array für das Dojo-Grid aufbereiten
		$temp = Array ('identifier'=&gt;'lfdnr', 'items'=&gt;$ergebnis);
		echo json_encode($temp);
	}
	// Anzeige ohne Javascript
	else {
		echo "&lt;table&gt;\n";
		echo "&lt;tr&gt;&lt;td&gt;Kundennummer&lt;/td&gt;
				&lt;td&gt;Vorname&lt;/td&gt;
				&lt;td&gt;Nachname&lt;/td&gt;
				&lt;td&gt;Beruf&lt;/td&gt;
				&lt;td&gt;Alter&lt;/td&gt;";
		echo "&lt;/tr&gt;\n";
		foreach ($ergebnis as $zeile =&gt; $wert) {
			echo "&lt;tr&gt;";
			echo "&lt;td&gt;".$wert['lfdnr']."&lt;/td&gt;";
			echo "&lt;td&gt;".$wert['vname']."&lt;/td&gt;";
			echo "&lt;td&gt;".$wert['nname']."&lt;/td&gt;";
			echo "&lt;td&gt;".$wert['beruf']."&lt;/td&gt;";
			echo "&lt;td&gt;".$wert['alter']."&lt;/td&gt;";
			echo "&lt;/tr&gt;\n";
		}
		echo "&lt;/table&gt;\n";
	}</pre>
<p>Wenn wir immer noch gut sind, sieht die Seite jetzt schon so aus:</p>
<p><img src="http://blog.sonores.de/wp-content/uploads/2008/02/gridtut-step7.jpg" alt="Gridtut Step 7" /></p>
<p>Step-7 zum Runterladen: 
<a  href="http://blog.sonores.de/wp-content/uploads/2008/02/step7-gridtut.js" title="step7-gridtut.js" onclick="javascript:pageTracker._trackPageview('/downloads/wp-content/uploads/2008/02/step7-gridtut.js');" >step7-gridtut.js</a> 
<a  href="http://blog.sonores.de/wp-content/uploads/2008/02/step-7-gridtut_request.php" title="step-7-gridtut_request.php">step-7-gridtut_request.php</a></p>
<p>Im nächsten Teil geht&#8217;s dann darum, noch so einen coolen Ajax-Indikator einzubauen. Bis dahin&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sonores.de/2008/02/12/dojo-tutorial-mit-grid-teil-4/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dojo Tutorial mit Grid &#8211; Teil 3: Grid erstellen</title>
		<link>http://blog.sonores.de/2008/02/11/dojo-tutorial-mit-grid-teil-3/</link>
		<comments>http://blog.sonores.de/2008/02/11/dojo-tutorial-mit-grid-teil-3/#comments</comments>
		<pubDate>Mon, 11 Feb 2008 14:11:01 +0000</pubDate>
		<dc:creator>faddie</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[geeked]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[Grid]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[XHR]]></category>
		<category><![CDATA[xmlHttprequest]]></category>

		<guid isPermaLink="false">http://blog.sonores.de/2008/02/11/dojo-tutorial-mit-grid-teil-3/</guid>
		<description><![CDATA[<br/>Jetzt geht&#8217;s um Grid&#8230; endlich, nachdem wir uns so lange mit den Formalitäten beschäftigt haben 3.6 Das dojo.grid in Javascript Wenn wir in das Suchfeld unseres Formulars den Namen &#8220;Petersen&#8221; eingegeben, gibt uns die Webserver einen JSON-String wieder, wo alle Personen dieses Namens verzeichnet sind. Diesen gilt es jetzt auszuwerten. Kehren wir also zu unserer [...]]]></description>
			<content:encoded><![CDATA[<br/><p>Jetzt geht&#8217;s um Grid&#8230; endlich, nachdem wir uns so lange mit den Formalitäten beschäftigt haben <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h2><span id="more-116"></span> 3.6 Das dojo.grid in Javascript</h2>
<p>Wenn wir in das Suchfeld unseres Formulars den Namen &#8220;Petersen&#8221; eingegeben, gibt uns die Webserver einen JSON-String wieder, wo alle Personen dieses Namens verzeichnet sind. Diesen gilt es jetzt auszuwerten.</p>
<p>Kehren wir also zu unserer Datei gridtut.js zurück.</p>
<p>Mit der Anweisung <span><span class="keyword">&#8220;var</span><span> ergebnis = eval(</span><span class="string">&#8216;(&#8216;</span><span>+data+</span><span class="string">&#8216;)&#8217;</span><span>);&#8221; wird aus dem Text-String ein Array erzeugt und in der Variable &#8220;ergebnis&#8221; gespeichert.</span></span></p>
<p>Mit diesem Array können wir nun das Grid befüllen&#8230; doch halt, wir haben ja noch gar keins :-O</p>
<p>Als erstes müssen wir dem Grid sagen, wie Spalten wir verwenden wollen &#8211; in der Dojo-Terminologie ein &#8220;View&#8221;. Für unser Beispiel folgende View:</p>
<pre name="code" class="js">var view1 = {
	cells: [
		[
			{name: 'Kundennummer', field:'lfdnr'},
			{name: 'Vorname', field:'vname'},
			{name: 'Nachname', field:'nname'},
			{name: 'Beruf', field:'beruf'},
			{name: 'Alter', field:'alter'}
		]
	]
};</pre>
<p>Die Eigenschaft cells beinhaltet ein Array (daher die eckigen Klammern), in der Wieder kleine Objekte stecken. Deren Eigenschaft &#8220;name&#8221; gibt den Spaltennamen an, der angezeigt werden soll. Die Eigenschaft &#8220;field&#8221; bezeichnet den Namen im Array (richtiger &#8211; den Schlüssel zum passenden Wert).</p>
<p>Jetzt noch ein paar globale Variablen, damit wir schön bequem von allen Funktionen auf das Grid zugreifen können und zu guter letzt noch ein Dummy-Datensatz:</p>
<pre name="code" class="js">var ddata;
var grid;
var store;
var layout = [ view1 ];
var dummydaten = { "identifier": 'lfdnr',
				   "items":[
				     {	"lfdnr": 0,
				     	"vname":"Keine Daten",
				      	"nname":"vorhanden ",
				      	"beruf": "-",
				      	"alter": 0}
				   ]
};</pre>
<p>Hier  sind nun zwei spannende Dinge zu sehen (naja, spannend für Informatiker vielleicht <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> ) Das Dojo-Grid ist sehr flexibel und unterstützt zum Beispiel auch Spalten, Sub-Spalten usw. Das Spalten-Layout teilen wir dem Grid gleich mit der Variable &#8220;layout&#8221; mit und übergeben das oben erstellte View. Die eckigen Klammern müssen übrigens sein, da das Layout ein Array erwartet.</p>
<p>Zum leichteren Debuggen erstellen wir auch gleich noch einen Dummydatensatz, damit bei der ersten Fehlersuche der Webserver ausgeschlossen werden kann.  Außerdem sieht man gleich noch, wie man Daten für das Grid aufbereiten sollte. Wir geben mit der Eigenschaft &#8220;identifier&#8221; an, wo sozusagen der Primärschlüssel des Datensatzes liegt.</p>
<p>Wir brauchen pro Datensatz also immer eine eindeutige Eigenschaft, ich habe sie hier &#8220;lfdnr&#8221; genannt, so sticht sie besser heraus. In &#8220;items&#8221; können wir die Daten nun einbetten.</p>
<p>Als Datensatz wählen wir eine Leermeldung, dass keine Daten vorhanden wären.</p>
<p>Das ist gleichermaßen praktisch, weil wir das Grid beim Laden der Seite mit Leermeldung erstellen und beim Nachladen über die Suchfunktion Zeit sparen, da das Grid nur noch aktualisiert wird.</p>
<p>Folgende Funktion erstellt das Grid:</p>
<pre name="code" class="js">function createGrid(meineDaten) {
	store = new dojo.data.ItemFileReadStore({jsId: 'jsonStore',data: meineDaten});
	ddata = new dojox.grid.data.DojoData(null,store,{jsId: 'model', clientSort: true, query: { lfdnr: '*' }});
	grid = new dojox.Grid({id: "DasGrid", model: ddata});
	grid.setStructure(layout);
	dojo.byId("gridContainer").appendChild(grid.domNode);
	grid.startup();
}</pre>
<p>Hier geschieht so viel, dass wir das besser Zeilenweise durchgehen <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  Wir greifen übrigens auf die globalen Variablen von vorhin zu.</p>
<p><strong>Zeile 2:</strong> Als erstes nutzen wir das Dojo-Datenmodell und erstellen einen ItemFileReadStore. Der bekommt die Javascript-Id &#8220;jsonStore&#8221; (wie erwähnt, Dojo mag Ids). Als zweiten Parameter übergeben wir dem Store das Javascript Array. Damit die Funktion aber universell bleibt, lösen wir das über den Parameter &#8220;meineDaten&#8221;.</p>
<p><strong>Zeile 3:</strong> Wir haben nun den ItemFileReadStore, jetzt müssen wir das Grid damit irgendwie verbinden. Für die Datenanbindung kennt das Grid das Objekt grid.data.DojoData. und grid.data.Table.</p>
<p>Table ist ganz leicht und grundlegend. Hierfür bräuchte man auch keinen Readstore eröffnen. Man könnte einfach das Array direkt übergeben (auch ohne die Kapselung in Identifier und Items).</p>
<pre name="code" class="js">// Das hier reicht uns leider nicht...
ddata = new dojox.grid.data.Table(null, dummydaten);</pre>
<p>Aber was nicht schwierig ist, das taugt auch nichts <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Also nehmen wir DojoData, und übergeben unseren Store. Die Eigenschaft &#8220;clientSort&#8221; ermöglicht es, dass er Nutzer im Browser (lokal) sortieren kann. An der Eigenschaft query sieht man schon die Verbundenheit zur Datenbankterminologie. Wir sagen dem Modell, dass wir alle eindeutigen Datensätzen haben wollen, die sich in der laufenden Nummer unterscheiden &#8211; ein clientseitiger &#8220;SELECT *&#8221; sozusagen.</p>
<p><strong>Zeile 4:</strong>  Jetzt wird das Grid erstellt, bekommt eine Id und sowohl den Store, als auch das Modell übergeben &#8211; schließlich haben wir das ja eben mühevoll erstellt.</p>
<p><strong>Zeile 5:</strong> Auch geben wir mit &#8220;setStructure&#8221; noch das Layout an.</p>
<p><strong>Zeile 6:</strong> Wir haben bereits in der HTML-Datei einen Platzhalter für das Grid eingebaut (den &lt;div&gt;-Container), an diesen hängen wir nun das Grid.</p>
<p><strong>Zeile 7:</strong> Jetzt wird endlich das Grid gestartet.</p>
<p>So&#8230; jetzt könnte ein Grid erstellt werden. Damit das auch passiert müssen wir natürlich die Funktion aufrufen &#8211; am besten in der Funktion init.</p>
<pre name="code" class="js">createGrid(dummydaten);</pre>
<p>Jetzt fehlt nur noch ein winziges bisschen CSS, dass in die HTML-Datei kommt.:</p>
<pre name="code" class="css">&lt;style type="text/css"&gt;
	div.gridDiv {
	width: 600px;
	height: 450px;
	}
&lt;/style&gt;</pre>
<p>Leider müssen wir dem Grid nämlich sagen, wie viel Platz es einnehmen soll. Sonst sieht man gar nichts &#8211; eine sehr beliebte Quelle der Frustration <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Wenn wir jetzt gut waren, erscheint folgendes:</p>
<p><img src="http://blog.sonores.de/wp-content/uploads/2008/02/gridtut-step6.JPG" alt="Unser erstes Grid" /></p>
<p>Step-6 zum Runterladen: 
<a  href="http://blog.sonores.de/wp-content/uploads/2008/02/step6-gridtut.html" title="Gridtut-6-html">Gridtut-6-html</a> 
<a  href="http://blog.sonores.de/wp-content/uploads/2008/02/step6-gridtut.js" title="Gridtut-6-js" onclick="javascript:pageTracker._trackPageview('/downloads/wp-content/uploads/2008/02/step6-gridtut.js');" >Gridtut-6-js</a></p>
<p>Alles weitere demnächst im nächsten Teil&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sonores.de/2008/02/11/dojo-tutorial-mit-grid-teil-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dojo Tutorial mit Grid &#8211; Teil 2: Ajax und JSON</title>
		<link>http://blog.sonores.de/2008/02/11/dojo-tutorial-mit-grid-teil-2/</link>
		<comments>http://blog.sonores.de/2008/02/11/dojo-tutorial-mit-grid-teil-2/#comments</comments>
		<pubDate>Mon, 11 Feb 2008 10:43:44 +0000</pubDate>
		<dc:creator>faddie</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[geeked]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[Grid]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[XHR]]></category>
		<category><![CDATA[xmlHttprequest]]></category>

		<guid isPermaLink="false">http://blog.sonores.de/2008/02/11/dojo-tutorial-mit-grid-teil-2/</guid>
		<description><![CDATA[<br/>So, nach geringfügiger Schaffenspause geht&#8217;s weiter mit dem Dojo-Tutorial. 3.2 Step-2 Html-Formular erstellen Schauen wir uns doch einfach mal etwas Code an: &#60;form name="form_suche" id="form_suche" action="gridtut_request.php" method="post"&#62;&#60;input type="text" name="txt_name" id="txt_name" value="" dojoType="dijit.form.TextBox" trim="true" propercase="true" /&#62; &#60;input type="submit" id="finden" value="Finden!" /&#62; &#60;/form&#62; &#60;br /&#62; &#60;div id="gridContainer" class="gridDiv"&#62;&#60;/div&#62; Wie mal leicht sehen kann, machen wir&#8217;s uns leicht [...]]]></description>
			<content:encoded><![CDATA[<br/><p>So, nach geringfügiger Schaffenspause geht&#8217;s weiter mit dem Dojo-Tutorial.</p>
<h2><span id="more-109"></span>3.2 Step-2 Html-Formular erstellen</h2>
<p>Schauen wir uns doch einfach mal etwas Code an:</p>
<pre name="code" class="html">&lt;form name="form_suche"
 id="form_suche"
 action="gridtut_request.php"
 method="post"&gt;&lt;input type="text" name="txt_name"  id="txt_name"
 value=""
       <strong> dojoType="dijit.form.TextBox"</strong>
        trim="true"
        propercase="true" /&gt;
&lt;input type="submit" id="finden" value="Finden!" /&gt;
&lt;/form&gt;
&lt;br /&gt;
&lt;div id="gridContainer" class="gridDiv"&gt;&lt;/div&gt;</pre>
<p>Wie mal leicht sehen kann, machen wir&#8217;s uns leicht und bauen nur ein Suchfeld und einen Such-Button ein. Doch zuerst das Form-Tag.</p>
<p>Eigentlich sieht alles so aus, wie bisher. Das ist auch gut so, damit lässt sich die Seite auch ohne Javascript bedienen. Wir verwenden die typischen HTML-Elemente &lt;form&gt; und &lt;input&gt;. Diese werden beim Aufrufen der Webseite vom Dojo-Parser gelesen und die Eigenschaft &#8220;dojoType&#8221; (Groß- und Kleinschreibung!), hier fett markiert, entscheidet, was für Elemente tatsächlich angezeigt werden. In der Dojo-Nomenklatur heißen diese Elemente übrigens Dijits (Dojo Widgets). Über Widgets im genaueren können wir vielleicht in ein paar Wochen sprechen&#8230; mal sehen <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Daher könnte man anstelle von &lt;input&gt; auch &lt;div&gt; oder &lt;span&gt; benutzen, da der Parser das Element ohnehin neu in die Seite einbaut. Übrigens wäre der Seitenaufbau wesentlich schneller, wenn man die  Dijits direkt per Javascript erstellt &#8211; nur könnte man mit abgeschalteten Javascript nichts mehr erkennen. Auch Suchmaschinen finden dann kaum etwas auf der Seite.</p>
<p>Genug der Abschweifung <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  hinter dem Formular ist noch ein &lt;div&gt;-Container eingebaut, der als Platzhalter für das spätere Grid fungieren soll.</p>
<p>HTML-seitig sind wir jetzt schier, daher folgt jetzt der nächste Schritt in Javascript.</p>
<p>Step-2 zum Runterladen: 
<a  href="http://blog.sonores.de/wp-content/uploads/2008/02/step2-gridtut.html" title="Gridtut-2">Gridtut-2</a></p>
<h2>3.3 Step-3 Erstes Javascript</h2>
<p>Bislang gibt unser Tutorial noch ein enttäuschendes Bild ab. In der Datei gridtut.js befindet sich nur gähnende Leere. Dabei haben wir in der Html-Datei doch schon auf die Funktion &#8220;init&#8221; verwiesen &#8211; und somit einen Fehler provoziert. Das wird jetzt geändert!</p>
<pre name="code" class="js">// Erste Funktion, die aufgerufen wird
function init() {
 suchbutton = dojo.byId("finden");
 suchbuttonConnection = dojo.connect(suchbutton, 'onclick', null, mein_submit);
}function mein_submit(event) {
 dojo.stopEvent(event);
 alert('Huhu!');
}</pre>
<p>Die Funktion &#8220;init()&#8221; wird von Dojo aufgerufen, sobald der Parser fertig ist, die HTML-Seite einzulesen. Je mehr Code übrigens auf der HTML-Seite, desto länger braucht auch der Parser.</p>
<p>Wir verwenden nun die init-Funktion, um den Submit-Vorgang vom Formular gegen eine eigene Funktion zu ersetzen. Dojo arbeitet übrigens gerne mit den IDs der Elemente, nicht mit den Namen.</p>
<p>Mit dojo.connect verbinden wir den Suchbutton mit dem Browser-Ereignis onclick und geben als letzten Parameter die Funktion an, die tatsächlich ausgeführt werden soll</p>
<p>Die Anweisung &#8220;dojo.stopEvent(event)&#8221; verhindert den Submit, der sonst durchgeführt worden wäre. Damit das auch funktioniert, muss in den Funktionskopf ein Parameter eingebaut werden &#8211; hier &#8220;event&#8221; genannt.</p>
<p>dojo.connect übergibt diesen Parameter dann an die aufgeführte Funktion ohne unser zutun.</p>
<p>Wenn jetzt alles klappt, erscheint statt des Submits die Nachricht &#8220;Huhu!&#8221;.</p>
<p>Step-3 zum Runterladen: 
<a  href="http://blog.sonores.de/wp-content/uploads/2008/02/step3-gridtut.js" title="Gridtut-3" onclick="javascript:pageTracker._trackPageview('/downloads/wp-content/uploads/2008/02/step3-gridtut.js');" >Gridtut-3</a></p>
<h2>3.4 Step-4 Ajax kommt ins Spiel.</h2>
<p>Natürlich wollen wir noch ein wenig mehr. Auf Dojo sind wir ja vor allem wegen dem Ajax-Hype gekommen, also machen wir das auch so <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<pre name="code" class="js">function mein_submit (event) {
  dojo.stopEvent(event);
  var kw = {
    url: "gridtut_request.php",
    load: function(data){
   var ergebnis = eval('('+data+')');
  	  alert ("Da ist was gekommen: " + data);
    },
    error: function(data){
   alert("Es ist ein Fehler aufgetreten: " + data);
    },
    form: "form_suche"
  };
  dojo.xhrPost(kw);
}</pre>
<p>Das sieht jetzt gewaltiger aus, als es ist.</p>
<p>KW ist erstmal nur eine Abkürzung für keywords und völlig frei gewählt. Da man bei Dojo den Funktionen auch Javascript-Objekte übergeben kann, anstelle alle Parameter einzeln an die Funktion zu reichen, ist das ganz bequem. Mit &#8220;kw&#8221; bestimmen wir also die Parameter für &#8220;dojo.xhrPost&#8221;.</p>
<p>URL:<br />
Bei &#8220;url&#8221; geben wir unsere dynamische Web-Datei an, das kann auch gerne .jsp oder .asp sein &#8211; ich werde den php-Teil möglichst gering halten.</p>
<p>LOAD:<br />
Hier geben wir eine Funktion an, aufgerufen werden soll, wenn uns der Webserver einen JSON-String geliefert hat. Aus Faulheit habe ich hier eine anonyme Funktion verwendet, man kann ebenso auf eine Funktion verweisen, die irgendwo tiefer im Quelltext verborgen ist (das wäre vom Stil her auch besser). In dem Parameter &#8220;data&#8221; ist die Rückgabe vom Webserver enthalten</p>
<p>ERROR:<br />
Eigentlich wie bei load, wenn der Webserver wider erwartend einen Fehler sendet, wird diese Funktion aufgerufen</p>
<p>FORM:<br />
Das Formular, dessen Inhalte an den Server geschickt werden soll (wird mit der ID benannt)</p>
<p>Den ganzen Wust geben wir jetzt an die Funktion als Parameter: dojo.xhrPost(kw)</p>
<p>Damit haben wir jetzt sehr umständlich das erreicht, was pures HTML auch so für uns getan hätte <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /><br />
Allerdings nicht asynchron und ohne die Möglichkeit der Fehlerbehandlung.</p>
<p>Step-4 zum Runterladen: 
<a  href="http://blog.sonores.de/wp-content/uploads/2008/02/step4-gridtut.js" title="Gridtut-4" onclick="javascript:pageTracker._trackPageview('/downloads/wp-content/uploads/2008/02/step4-gridtut.js');" >Gridtut-4</a></p>
<h2>3.5 PHP &#8211; Generieren von JSON</h2>
<p>Für alle PHP-Freunde habe ich hier ein wenig Code, der für uns den JSON String erzeugen soll.</p>
<p>JSON bedeutet übrigens Javascript Object Notation und ist eine Möglichkeit neben XML, Daten zwischen Client und Server auszutauschen. Eigentlich handelt es sich bei JSON nur um ein Stück Javascript-Code, der, wenn er ausgeführt wird, ein Array erzeugt. Also machen wir aus unserem PHP-Array einen Bauplan für ein Javascript Array. Wichtig übrigens: Der String wird per &#8220;echo&#8221; ausgegeben, bzw. als Textausgabe an den Client geschickt.</p>
<pre name="code" class="php">&lt;?php
	// Ein paar Daten
	$data = array ();
	$data[] = array ('lfdnr' =&gt;1,
					 'nname' =&gt;'Petersen',
					 'vname' =&gt;'Klaus',
					 'beruf' =&gt;'Polizist',
					 'alter' =&gt;32);
	$data[] = array ('lfdnr' =&gt;2,
					 'nname' =&gt;'Petersen',
					 'vname' =&gt;'Elvis',
					 'beruf' =&gt;'Hundefänger',
					 'alter' =&gt;25);
	$data[] = array ('lfdnr' =&gt;3,
					 'nname' =&gt;'Petersen',
					 'vname' =&gt;'Rudi',
					 'beruf' =&gt;'Fotograf',
					 'alter' =&gt;52);
	$data[] = array ('lfdnr' =&gt;4,
					 'nname' =&gt;'Petersen',
					 'vname' =&gt;'Jörg',
					 'beruf' =&gt;'Deichgraf',
					 'alter' =&gt;61);
	$data[] = array ('lfdnr' =&gt;5,
					 'nname' =&gt;'Schröder',
					 'vname' =&gt;'Petra',
					 'beruf' =&gt;'Bäckerin',
					 'alter' =&gt;31);
	$data[] = array ('lfdnr' =&gt;6,
					 'nname' =&gt;'Schröder',
					 'vname' =&gt;'Elvira',
					 'beruf' =&gt;'Fleischerei-Fachverkäuferin',
					 'alter' =&gt;23);
	$data[] = array ('lfdnr' =&gt;7,
					 'nname' =&gt;'Schröder',
					 'vname' =&gt;'Martin',
					 'beruf' =&gt;'Koch',
					 'alter' =&gt;37);
	// Das zukünftige Ergebnis
	$ergebnis = false;
        // Array-Zähler, sonst ist die JSON-Funktion überfordert,
	// wenn man nicht von 0 an durchzählt.
	$counter = 0;
// Hauptteil
if (!empty($_REQUEST['txt_name'])) {
	// Suche nach dem Namen im Testdatensatz
	foreach ($data as $zeile =&gt; $wert) {
		if ($wert['nname'] == $_REQUEST['txt_name']){

			// Erster Sucherfolg
			if (!$ergebnis) $ergebnis = array();

			// Suchergebnis ins Array schieben
			$ergebnis[$counter]['lfdnr'] = $data[$zeile]['lfdnr'];
			$ergebnis[$counter]['nname'] = htmlentities($data[$zeile]['nname']);
			$ergebnis[$counter]['vname'] = htmlentities($data[$zeile]['vname']);
			$ergebnis[$counter]['beruf'] = htmlentities($data[$zeile]['beruf']);
			$ergebnis[$counter]['alter'] = $data[$zeile]['alter'];
			$counter++;
		}
	}
	// Wenn nichts gefunden wurde, leeres Ergebnis
	if (!$ergebnis) $ergebnis[] = array ('lfdnr' =&gt;0,
										'nname'=&gt;'Kein',
										'vname'=&gt;'Ergebnis',
										'beruf' =&gt;' ',
										'alter' =&gt;0);
	// Das Array für das Dojo-Grid aufbereiten
	$temp = Array ('identifier'=&gt;'lfdnr', 'items'=&gt;$ergebnis);
	echo json_encode($temp);
}
?&gt;</pre>
<p>Es wird also nach einen Nachnamen gesucht und das Ergebnis per JSON ausgegeben. Je nach Serversprache kann das natürlich anders aussehen.</p>
<p>Wichtig übrigens: Die JSON-Funktion von PHP kann keine Umlaute umwandeln, daher konvertiere ich alles in HTML-Schreibweise (also ä ;  usw.) Eigentlich sollte man alles in UTF-8 konvertieren, damit kommt Dojo am besten zurecht. Aber wer hat schon UTF-8 in vorhandenen Projekten.<br />
Wenn man neu anfängt, ist man UTF-8 auf jeden Fall gut beraten.</p>
<p>Wer gerade keinen Webserver zur Verfügung hat, der kann auch erstmal eine Textdatei nehmen und bei &#8220;URL&#8221; auf diese verweisen.</p>
<p>Hier ist die Textdatei mit JSON-String für die Suche nach Petersen <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<p>
<a  href="http://blog.sonores.de/wp-content/uploads/2008/02/json.txt" title="JSON-Text">JSON-Text</a></p>
<p>Step 5 findet damit sein Ende&#8230;<br />
Step-5 zum Runterladen: 
<a  href="http://blog.sonores.de/wp-content/uploads/2008/02/step-5-gridtut_request.php" title="Gridtut-5">Gridtut-5</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sonores.de/2008/02/11/dojo-tutorial-mit-grid-teil-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Dojo Tutorial mit Grid &#8211; Teil 1</title>
		<link>http://blog.sonores.de/2008/02/01/dojo-tutorial-mit-grid/</link>
		<comments>http://blog.sonores.de/2008/02/01/dojo-tutorial-mit-grid/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 11:40:16 +0000</pubDate>
		<dc:creator>faddie</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[geeked]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[Grid]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[XHR]]></category>
		<category><![CDATA[xmlHttprequest]]></category>

		<guid isPermaLink="false">http://blog.sonores.de/2008/02/01/dojo-tutorial-mit-grid/</guid>
		<description><![CDATA[<br/>Hallo liebe Freunde der leichten Unterhaltung. Leider fällt der heutige Tag in die Kategorie Tutorial. Deshalb kein voyeuristischer Frohsinn, sondern harte Fakten. Ich werde heute etwas über das Dojotoolkit schreiben, was ich im Netz noch nicht gefunden habe: über ein Suchfeld ein Grid befüllen und aus diesem ein Popup öffnen. Klingt leicht, ist es auch [...]]]></description>
			<content:encoded><![CDATA[<br/><p><img src="http://blog.sonores.de/wp-content/uploads/2008/02/dojo.thumbnail.gif" alt="Dojo Toolkit Logo" />Hallo liebe Freunde der leichten Unterhaltung. Leider fällt der heutige Tag in die Kategorie Tutorial. Deshalb kein voyeuristischer Frohsinn, sondern harte Fakten. Ich werde heute etwas über das Dojotoolkit schreiben, was ich im Netz noch nicht gefunden habe:  <strong>über ein Suchfeld ein Grid befüllen und aus diesem ein Popup öffnen</strong>.</p>
<p>Klingt leicht, ist es auch &#8211; bloß nicht ausreichend dokumentiert. Wen es interessiert klickt weiter.</p>
<p><span id="more-104"></span></p>
<h1>1. Zutaten</h1>
<p>Wir brauchen 3 bis 4 Dateien:</p>
<ul>
<li>eine HTML Datei</li>
<li>eine Javascript Datei für die Ordnung</li>
<li>eine dynamische Datei (ich kann nur PHP) für die Daten die später in das Grid geladen werden sollen</li>
<li>optional: eine html-Datei für ein Popup</li>
</ul>
<p>Außerdem brauchen wir noch das Dojotoolkit in der aktuellen Version 1.02. Freunde des Internet Explorers holen sich besser das nighly Build. Aber das machen wir gleich gemeinsam.</p>
<h2>2. Vorbereitung</h2>
<h2>2.1 Dojo holen</h2>
<p>Hier gibt&#8217;s den Download 
<a  href="http://dojotoolkit.org/downloads" title="Dojotoolkit download" target="_blank" onclick="javascript:pageTracker._trackPageview('/external/dojotoolkit.org/downloads');" >&lt;klick&gt;</a>. Für die Version 1.02 brauchen wir leider noch das nightly build um einige Bugs aus dem Grid zu vertreiben &#8211; das gibt&#8217;s hier: 
<a  href="http://archive.dojotoolkit.org/nightly/" title="Dojotoolkit nightly build download" target="_blank" onclick="javascript:pageTracker._trackPageview('/external/archive.dojotoolkit.org/nightly/');" >&lt;klick&gt;</a>.</p>
<h2>2.2 Ordnerstruktur</h2>
<p>Erstmal legen wir den Hauptordner an, und zwar so, dass der Apache (oder auch iis) darauf zugreifen kann.</p>
<p>In diesen Order wird dann das Archiv vom Dojotoolkit entpackt, zum Beispiel nach dojotoolkit-release-1.0.2. <em>Es hat sich übrigens bewährt, die Releasenummer im Ordner mitzunehmen, damit Releasewechsel später planbar und durchführbar werden.</em></p>
<p>Jetzt entpacken wir das nightly build irgendwohin und kopieren den dojox-Ordner heraus. Dieser wird dann einfach über den des 1.0.2 Releases kopiert. Fertig sieht es so aus:</p>
<pre>/gridtutorial</pre>
<pre>|---+ dojo-release-1.0.2</pre>
<pre>       |--- dijit</pre>
<pre>       |--- dojo</pre>
<pre>       |--- dojox <em>   (und zwar vom nightly build)</em></pre>
<pre>       |--- util</pre>
<p>Nun legen wir 4 Dateien an:</p>
<p>gridtut.html</p>
<p>gridtut.js</p>
<p>gridtut_request.php</p>
<p>gridtut_pop.html</p>
<p>Klar sind Popups aus der Mode gekommen und der Dojo.Dialog sieht auch sehr nett aus, allerdings besteht ja auch die große Kunst darin, Dojo in bestehende Anwendungen zu integrieren. Und da kann es gut vorkommen, dass man noch mit Popups auskommen muss.</p>
<h1>3.1 Step-1  Dojo einrichten</h1>
<p>So, ich glaube wir können anfangen <img src='http://blog.sonores.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Wie man eine HTML Datei schreibt, brauche ich hoffentlich keinem zu erklären, daher steigen wir gleich mit dem Einbinden von Dojo ein.</p>
<p>In den &lt;head&gt; gehören zum einen die CSS Dateien für Dojo:</p>
<pre name="code" class="html">&lt;link rel="stylesheet" href="./dojo-release-1.0.2/dijit/themes/tundra/tundra.css" type="text/css"&gt;
&lt;link rel="stylesheet" href="./dojo-release-1.0.2/dojo/resources/dojo.css" type="text/css"&gt;
&lt;link rel="stylesheet" href="./dojo-release-1.0.2/dojox/grid/_grid/tundraGrid.css" type="text/css"&gt;</pre>
<p>Damit haben wir das Aussehen für alle Dojo Widgets&#8230; äh Dijits erschlagen. Damit das Grid sich auch im Design von Dojo präsentiert binden wir das tundraGrid.css mit ein.</p>
<p>Dann geht es nun an das Einbinden des Javascripts.</p>
<pre name="code" class="html">&lt;script type="text/javascript" src="./dojo-release-1.0.2/dojo/dojo.js"
	djConfig="parseOnLoad: true,debugAtAllCosts: true"&gt;&lt;/script&gt;</pre>
<p>Alle weiteren Dateien bindet Dojo selbst ein. Wir können dojo  bei der Einbindung noch ein wenig konfigurieren,</p>
<pre>parseOnLoad - damit können wir Widgets bei HTML-Markup einbinden, der Dojo-Parser wandelt das dann in Javascript Code um</pre>
<pre>debugAtAllCosts - Debugging kann zu Anfang nie schaden, sollte aber zur Produktion entfernt werden.</pre>
<p>Als nächstes sagen wir dojo, was wir noch alles für Module für unser Beispiel benötigen.</p>
<pre name="code" class="js">&lt;script  type="text/javascript"&gt;
	dojo.require('dojo.parser');
	dojo.require("dojo.data.ItemFileReadStore");
	dojo.require('dijit.form.Button');
	dojo.require("dijit.form.TextBox");
	dojo.require("dijit.form.NumberTextBox");
	dojo.require("dijit.form.FilteringSelect");
	dojo.require("dojox.grid.Grid");
	dojo.require("dojox.grid._data.model");
&lt;/script&gt;</pre>
<p>Dieser Teil kann leider noch nicht in unsere .js Datei, weil dojo sonst mit den Pfadangaben durcheinander kommt bzw. kommen kann. Man sieht schon, dass wir auch noch ein paar Widgets für das Formular einbinden werden.</p>
<p>Zum Schluss noch der Rest.</p>
<pre name="code" class="html">&lt;script type="text/javascript" src="gridtut.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript"&gt;
	dojo.addOnLoad(init);
&lt;/script&gt;</pre>
<p>Fertig &#8211; die Reihenfolge ist hier übrigens sehr wichtig, die Datei gridtut.js muss schon vom Browser geladen worden sein, damit addOnLoad auch die Funktionen findet.</p>
<p>Step1 zum runterladen: 
<a  href="http://blog.sonores.de/wp-content/uploads/2008/02/step1-gridtut.html" title="Gridtut-1">Step-1</a></p>
<p>Weiter geht&#8217;s 
<a  href="http://blog.sonores.de/2008/02/11/dojo-tutorial-mit-grid-teil-2/" title="Dojo-Tutorial Teil 2">hier</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sonores.de/2008/02/01/dojo-tutorial-mit-grid/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

