<?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>Kau-Boys blog &#187; Scriptaculous</title>
	<atom:link href="http://kau-boys.de/tag/scriptaculous/feed" rel="self" type="application/rss+xml" />
	<link>http://kau-boys.de</link>
	<description>Webdevelopment and more</description>
	<lastBuildDate>Thu, 29 Jul 2010 22:09:53 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Tutorial: Drag-and-Drop mit Scriptaculous – Teil 2: Droppables</title>
		<link>http://kau-boys.de/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables</link>
		<comments>http://kau-boys.de/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables#comments</comments>
		<pubDate>Mon, 15 Mar 2010 15:29:16 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=830</guid>
		<description><![CDATA[Nachdem wir uns in Teil 1 des Tutorials mit der Draggable Klasse besch&#228;ftigt haben, wenden wir uns heute seinem Bruder der Droppables Klasse zu. Mit ihr k&#246;nnen wir auf ein aufgenommenes Element reagieren. Eine typische Anwendung sind Einkaufk&#246;rbe auf Online-Shops. Ich m&#246;chte daher einen einfachen Einkaufswagen demonstieren. Der Quellcode f&#252;r dieses Beispiel Zuerst einmal wieder [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem wir uns in <a href="http://kau-boys.de/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable">Teil 1 des Tutorials</a> mit der <a href="http://wiki.github.com/madrobby/scriptaculous/draggable">Draggable Klasse</a> besch&#228;ftigt haben, wenden wir uns heute seinem Bruder der <a href="http://wiki.github.com/madrobby/scriptaculous/droppables">Droppables Klasse</a> zu. Mit ihr k&#246;nnen wir auf ein aufgenommenes Element reagieren. Eine typische Anwendung sind Einkaufk&#246;rbe auf Online-Shops. Ich m&#246;chte daher einen einfachen Einkaufswagen demonstieren.</p>
<h2>Der Quellcode f&#252;r dieses Beispiel</h2>
<p>Zuerst einmal wieder der Quellcode f&#252;r dieses Beispiel. Ich werde wie auch schon im ersten Teil des Tutorials die wichtigen Zeilen etwas genauer erkl&#228;ren. Die Zeilen 1-34 enthalten das grundlegende Ger&#252;st der HTML-Seite sowie die Stylesheets, auf die ich nicht n&#228;her eingehen m&#246;chte:</p>
<p><span id="more-830"></span></p>
<pre class="brush: xml;">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; dir=&quot;ltr&quot; lang=&quot;de-DE&quot;&gt;
&lt;head&gt;
	&lt;head&gt;
		&lt;title&gt;Drag-and-Drop Part 2&lt;/title&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;prototype.js&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;scriptaculous.js&quot;&gt;&lt;/script&gt;
		&lt;style type=&quot;text/css&quot;&gt;
			.item {
				padding: 40px;
				border: 1px solid #000;
				cursor: move;
				display: inline-block;
				margin-right: 20px;
			}
			.blue {
				background-color: #39c;
			}
			.green {
				background-color: #292;
			}
			div#shopping_cart {
				width: 180px;
				height: 180px;
				background: #fff;
				border: 5px solid #ccc;
			}
			div#shopping_cart.hover {
				border: 5px dashed #aaa;
			}
		&lt;/style&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;h1&gt;Drag-and-Drop&lt;/h1&gt;
		&lt;div id=&quot;blue_box&quot; title=&quot;Blaue Box&quot; class=&quot;item blue&quot;&gt;&lt;/div&gt;
		&lt;div id=&quot;green_box&quot; title=&quot;Gr&#252;ne Box&quot; class=&quot;item green&quot;&gt;&lt;/div&gt;
		&lt;div id=&quot;shopping_cart&quot;&gt;
			&lt;ul id=&quot;items_in_cart&quot;&gt;&lt;/ul&gt;
		&lt;/div&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
			new Draggable('blue_box', {
				revert: true
			});
			new Draggable('green_box', {
				revert: true
			});
			Droppables.add('shopping_cart', {
				onDrop: addItem,
				hoverclass: 'hover'
			});
			function addItem(dragged, dropped, event){
				var itemCount = $('items_in_cart').select('li[id=&quot;item' +
									dragged.id + '&quot;] span').first();
				if(itemCount == undefined){
					$('items_in_cart').insert({
						bottom: '&lt;li id=&quot;item' + dragged.id +
								'&quot;&gt;&lt;span&gt;1&lt;/span&gt;x ' + dragged.title + '&lt;/li&gt;'
					});
				} else {
					itemCount.update(parseInt(itemCount.innerHTML) + 1);
				}
			}
		&lt;/script&gt;
	&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>In den Zeilen 35-39 sind zwei einfache &#8220;Artikel&#8221; aufgef&#252;hrt (in unserem Fall einfache farbige DIVs) sowie der &#8220;Warenkorb&#8221;, der eine leere unsortierte Liste enth&#228;lt. In diese f&#252;gen wir dann per Drag-and-Drop die Waren ein. Sehen wir uns nun aber den interessanten Teil des Quellcodes an, das JavaScript. Die Zeilen 41-46 sollten aus dem ersten Teil des Tutorials bekannt sein. Wir erzeugen hier zwei Draggables wobei wir die Option <code>reset</code> auf <code>true</code> setzen, damit die Artikel beim &#8220;loslassen&#8221; wieder auf ihre ursrp&#252;ngliche Position zur&#252;ckkehren. Nun aber zum neuen Teil der Droppables-Klasse:</p>
<pre class="brush: jscript; gutter: false;">
Droppables.add('shopping_cart', {
	onDrop: addItem,
	hoverclass: 'hover'
});
</pre>
<p>Wichtig ist hier, dass wir keine Instanz der Klasse durch das Schl&#252;sselwort <code>new</code> erzeugen. Es existiert vielmehr schon eine Instanz, der wir mit der <code>add()</code> Funktion eine neue &#8220;Drop-Zone&#8221; hinzuf&#252;gen. Es ist also m&#246;glich mehrere Bereiche einer Website f&#252;r die Reaktion auf Draggables zu verwenden. Es w&#228;re z.B. m&#246;glich einen &#8220;Papierkorb&#8221; einzurichten, mit dem man einenen bereits hinzugef&#252;gten Artikel wieder aus der Liste entfernen kann bzw. dessen Anzahl verringern.</p>
<p>Der add() Funktion k&#246;nnen auch mehrere Optionen &#252;bergeben werden, welche das sind k&#246;nnt ihr in der <a href="http://wiki.github.com/madrobby/scriptaculous/droppables">API zu Droppables</a> nachlesen. Ich verwende hier die <code>hoverClass</code> Option, die der &#8220;Drop-Zone&#8221; eine Klasse zu weist, wenn der Benutzer mit einem Draggable dar&#252;ber steht. Zus&#228;tzliche gebe ich eine Callback-Funktion f&#252;r das <code>onDrop</code> Event an. Wie ihr der Funktion <code>addItem()</code> entnehmen k&#246;nnte, bekommt die <code>onDrop()</code> Funktion eine Referenz auf das aufgenommene Elemente sowie auf die &#8220;Drop-Zone&#8221; und das Event selbst &#252;bergeben. In der Funktion selbst f&#252;gen wir den Artikel an die Liste an und setzen die Anzahl auf 1, sofern er noch nicht enthalten ist. Wenn er enthalten ist erh&#246;hen wir dir Anzahl um 1.</p>
<h2>Das Beispiel</h2>
<p>Das oben beschriebene Beispiel sieht dann wie folgt aus (es darf aber gerne unter Verwendung von Bildern anstelle von DIVs und mehr CSS noch ansprechender gestaltet werden):</p>
<div id="blue_box" title="Blaue Box" style="padding: 40px; border: 1px solid #000; cursor: move; display: inline-block; margin-right: 20px; background-color: #39c;"></div>
<div id="green_box" title="Gr&#252;ne Box" style="padding: 40px; border: 1px solid #000; cursor: move; display: inline-block; margin-right: 20px; background-color: #292;"></div>
<div id="shopping_cart" style="width: 180px; height: 180px; background: #fff; border: 5px solid #ccc;">
<ul id="items_in_cart">
<li style="display: none;">Warenkorb</li>
</ul>
</div>
<p><script type="text/javascript" src="http://kau-boys.de/wp-content/uploads/2010/03/part2.js"></script></p>
<p>Wie ihr also sehen k&#246;nnt ist es sehr einfach ein Element f&#252;r die Interaktion mit Draggables zu verwenden. Was ihr dabei mit den Elementen macht ist eurer Fantasie &#252;berlassen. Die M&#246;glichkeiten sind schier unbegrenzt. Ich m&#246;chte euch also dazu animieren einfach einmal mit der Funktion zu experimentieren.</p>
<p>Das war es dann auch schon wieder mit diesem Teil des Tutorials. Im n&#228;chsten Teil sehen wir uns einen sehr speziellen Fall von Drag-and-Drop an und zwar mit dem Sortieren von Elementen. Wie einfach so etwas m&#246;glich ist und wie leicht sich die Sortierreihenfolge auslesen l&#228;sst, das erwartet euch in Teil 3 des Tutorials. F&#252;r welche Einsatzzwecke habt ihr bisher Draggables und Droppables genutzt? &#220;ber einen Kommentar dazu w&#252;rde ich mich wie immer sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tutorial: Drag-and-Drop mit Scriptaculous &#8211; Teil 1: Draggable</title>
		<link>http://kau-boys.de/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable</link>
		<comments>http://kau-boys.de/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable#comments</comments>
		<pubDate>Tue, 02 Mar 2010 16:38:32 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=785</guid>
		<description><![CDATA[Heute m&#246;chte ich mein angek&#252;ndigtes Tutorial &#252;ber Drag-and-Drop starten. Das Ziel dieses Tutorials ist der Nachbau einer dynamischen Newsseite, wie ich sie in meinen Artikel &#214;ffentlich-rechtlich und vorbildhaft – So muss eine Web 2.0 zu Olympia aussehen vorgestellt habe. Da eine solche Seite mit vielen verschiedenen Techniken zusammengesetzt ist, werden wir immer kleine Teile auf [...]]]></description>
			<content:encoded><![CDATA[<p>Heute m&#246;chte ich mein angek&#252;ndigtes Tutorial &#252;ber Drag-and-Drop starten. Das Ziel dieses Tutorials ist der Nachbau einer dynamischen Newsseite, wie ich sie in meinen Artikel <a href="http://kau-boys.de/webentwicklung/oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen">&#214;ffentlich-rechtlich und vorbildhaft – So muss eine Web 2.0 zu Olympia aussehen</a> vorgestellt habe. Da eine solche Seite mit vielen verschiedenen Techniken zusammengesetzt ist, werden wir immer kleine Teile auf dem Schritt zur fertigen Seite nachvollziehen.</p>
<p>Im ersten Teil geht es um die Grundlage einer Seite mit Drag-and-Drop. Wir verwenden f&#252;r dieses Tutorial die Drag-and-Drop Funktionalit&#228;t von <a href="http://script.aculo.us">Scriptaculous</a>, welches eine Erweiterung des <a href="http://www.prototypejs.org">Prototype Frameworks</a> ist. Um die hier gezeigten Funktionen selbst nachprogrammieren zu k&#246;nnen ben&#246;tigt ihr also zuerst einmal die beiden Frameworks.</p>
<p><span id="more-785"></span></p>
<h2>Der Quellcode f&#252;r dieses Beispiel</h2>
<p>Beginnen wir also mit dem Beispiel. Zuerst einmal ben&#246;tigen wir etwas HTML in dem wir ein Element platzieren, welches wir dann aufnehmen m&#246;chten. F&#252;r das Element nehme ich exemplarisch ein DIV, aber ihr k&#246;nnt auch z.B. ein Bild verwenden:</p>
<pre class="brush: xml;">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; dir=&quot;ltr&quot; lang=&quot;de-DE&quot;&gt;
&lt;head&gt;
	&lt;head&gt;
		&lt;title&gt;Drag-and-Drop Teil 1&lt;/title&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;prototype.js&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;scriptaculous.js&quot;&gt;&lt;/script&gt;
		&lt;style type=&quot;text/css&quot;&gt;
			#draggable {
				width: 100px;
				height: 100px;
				padding: 30px;
				background-color: #39c;
				border: 1px solid #000;
				cursor: move;
			}
		&lt;/style&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;h1&gt;Drag-and-Drop&lt;/h1&gt;
		&lt;div id=&quot;draggable&quot;&gt;&lt;/div&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
			new Draggable('draggable');
		&lt;/script&gt;
	&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Wichtig f&#252;r das Aktivieren der Draggable Funktion auf ein Element ist eine ID f&#252;r das Element. Das DIV hat hier die ID &#8220;draggable&#8221;. Im Kopf werden die beiden JavaScript Dateien f&#252;r Prototype und Scriptaculous eingebunden. Wichtig ist hierbei, dass zuerst Prototype eingebunden wird. Zus&#228;tzlich ist noch etwas CSS angegeben um dem DIV einen Rahmen und eine Hintergrundfarbe zu verpassen. Alles was nun notwendig ist, um das DIV aufnehmbar zu machen ist eine einzige Zeile JavaScript:</p>
<pre class="brush: jscript; gutter: false;">
new Draggable('draggable');
</pre>
<p>Es wird hier eine neue Instanz des <a href="http://wiki.github.com/madrobby/scriptaculous/draggable">Draggable Objekts</a> erzeugt. Dem Konstruktor wird hierbei die ID des Elements &#252;bergeben, welches aufnehmbar sein soll.</p>
<h2>Ein Beispiel gef&#228;llig</h2>
<p>Da dieser Blog auch Prototype einsetzt, sollten wir es nicht bei einem Quellcode Auszug belassen, sondern einfach mal hier ein solches DIV einf&#252;gen. Also, hier kommt es:</p>
<div id="draggable" style="width: 100px; height: 100px; padding: 30px; background-color: #39c; border: 1px solid #000; cursor: move;"></div>
<p><script type="text/javascript">new Draggable('draggable')</script></p>
<p>Dieses DIV kann nun beliebig im Sichtbaren Bereich verschoben werden. Die Klasse bietet aber auch viele Optionen, die in einem Hash an die Funktion als zweiten Parameter &#252;bergeben werden k&#246;nnen. Wir k&#246;nnen z.B. die Bewegung eines Elements auf die horizontale beschr&#228;nken und zus&#228;tzlich das Element beim &#8220;Loslassen&#8221; des Elements wieder auf seine urspr&#252;ngliche Position zur&#252;cksetzen. Der JavaScript Befehl dazu sieht wie folgt aus:</p>
<pre class="brush: jscript; gutter: false;">
new Draggable('draggable2', {constraint: 'horizontal', revert: true});
</pre>
<p>Ich habe hier die ID um eine Zwei erweitert, damit ich auch dieses Beispiel hier vorf&#252;hren kann. Wichtig ist nat&#252;rlich immer, dass ihr f&#252;r die verschiedenen Elemente unterschiedliche IDs verwendet und niemals eine ID in zwei Instanzen verwendet. Das DIV verh&#228;lt sich dann wie folgt:</p>
<div id="draggable2" style="width: 100px; height: 100px; padding: 30px; background-color: #292; border: 1px solid #000; cursor: move;"></div>
<p><script type="text/javascript">new Draggable('draggable2', {constraint: 'horizontal', revert: true})</script></p>
<p>Da es hier in diesem Tutorial nicht darum geht alle m&#246;glichen Optionen zu erkl&#228;ren m&#246;chte ich euch gerne auf die <a href="http://wiki.github.com/madrobby/scriptaculous/draggable">API Referenz der Draggable Klasse</a> verweisen. Dort findet ihr eine Liste aller Optionen und einige weitere Beispiele.</p>
<p>Damit m&#246;chte ich auch schon den ersten Teil des Tutorials abschlie&#223;en. Ihr solltet einfach einmal die verschiedenen Optionen ausprobieren um zu sehen, wie sich das DIV dabei verh&#228;lt. Im zweiten Teil besch&#228;ftigen wir uns mit &#8220;dem Bruder&#8221; von Draggable. Dabei handelt es sich um die Droppables Klasse, die es erm&#246;glicht ein aufgenommenes Element &#8220;einzufangen&#8221; und auf das Element zu reagieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zeilen-Duplizierer mit AutoComplete Felder nutzen</title>
		<link>http://kau-boys.de/webentwicklung/zeilen-duplizierer-mit-autocomplete-felder-nutzen?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=zeilen-duplizierer-mit-autocomplete-felder-nutzen</link>
		<comments>http://kau-boys.de/webentwicklung/zeilen-duplizierer-mit-autocomplete-felder-nutzen#comments</comments>
		<pubDate>Wed, 17 Feb 2010 13:18:55 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=697</guid>
		<description><![CDATA[ich bekam heute in einem Kommentar die Frage gestellt, ob mein Zeilen-Duplizierer aus dem Beitrag: Einfacher Zeilen-Duplizierer mit Prototype auch auf Feldern funktioniert, die die Scriptaculous Ajax.AutoCompleter Funktion verwenden. Ich nutze den Duplizierer selbst in einem Formular, das solche Felder enth&#228;lt. Meine erste Fassung entsprach dabei dem Einzeiler aus dem vorherigen Beitrag. Das Problem dabei [...]]]></description>
			<content:encoded><![CDATA[<p>ich bekam heute in einem Kommentar die Frage gestellt, ob mein Zeilen-Duplizierer aus dem Beitrag: <a href="http://kau-boys.de/webentwicklung/einfacher-zeilen-duplizierer-mit-prototype">Einfacher Zeilen-Duplizierer mit Prototype</a> auch auf Feldern funktioniert, die die <a href="http://wiki.github.com/madrobby/scriptaculous/ajax-autocompleter">Scriptaculous Ajax.AutoCompleter</a> Funktion verwenden.</p>
<p>Ich nutze den Duplizierer selbst in einem Formular, das solche Felder enth&#228;lt. Meine erste Fassung entsprach dabei dem Einzeiler aus dem vorherigen Beitrag. Das Problem dabei ist allerdings, dass die AutoCompleter Funktion beim Erzeugen mit dem Felder verkn&#252;pft wird, auf das sie angewendet werden soll. Wenn man nun dieses Feld kopiert wird nicht eine neue Instanz des Ajax.AutoCompleter erzeugt, sondern die Referenz auf das alte Feld mit kopiert. Ein Eintrag im neu erzeugten Feld aktiviert also die AutoCompleter Funktion des vorherigen Feldes.</p>
<p><span id="more-697"></span></p>
<p>Um dieses Problem zu l&#246;sen hatte ich die erweiterte Funktion mit den beiden Callback-Funktionen erstellt. Damit ist es m&#246;glich die Referenz zum vorherigen Feld zu l&#246;sen und eine neue Instanz des Ajax.AutoCompleter nach dem Erzeugen der Kopie zu erstellen. Hier aber zuerst noch einmal die Funktion selbst. Ich habe mittlerweile auch eine Option zum Fokussieren des ersten Feldes in der Kopie hinzugef&#252;gt:</p>
<pre class="brush: jscript;">
function addRow(selector, options){
	var lastRow = $$(selector).last();
	var newRow = lastRow.cloneNode(true);
	if (options.reset) {
		newRow.select('select', 'textarea', 'input').each(function(elm){
			elm.clear().checked = '';
		});
	}
	if(options.beforeInsert) options.beforeInsert(newRow);
	lastRow.insert({'after': newRow});
	if(options.afterInsert) options.afterInsert(newRow);

	if (options.focusFirst) {
		newRow.select('input', 'select', 'textarea').first().focus();
	}
}
</pre>
<p>Um die Ajax.Autocompleter Funktion nutzen zu k&#246;nnen ben&#246;tigt jedes Feld eine eindeutige ID. Nehmen wir also an, wir haben folgendes erstes Feld f&#252;r unser Formular (hier ein Beispiel aus dem Artikel: <a href="http://kau-boys.de/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous">Google Maps Suggest – Adress-Autovervollst&#228;ndigung mit Scriptaculous</a>):</p>
<pre class="brush: xml;">
&lt;form id=&quot;addressform&quot; action=&quot;address_save.php&quot; class=&quot;niceform&quot;&gt;
	&lt;fieldset&gt;
		&lt;legend&gt;Choose an address&lt;/legend&gt;
		&lt;dl&gt;
			&lt;dt&gt;&lt;label for=&quot;address&quot;&gt;Address:&lt;/label&gt;&lt;/dt&gt;
			&lt;dd&gt;&lt;input type=&quot;text&quot; id=&quot;address&quot; name=&quot;address[]&quot; style=&quot;width: 300px;&quot; /&gt;&lt;/dd&gt;
		&lt;/dl&gt;
	&lt;/fieldset&gt;
	&lt;fieldset&gt;
		&lt;input type=&quot;submit&quot; value=&quot;Send!&quot; /&gt;
	&lt;/fieldset&gt;
&lt;/form&gt;
&lt;div id=&quot;adresse_choices&quot; class=&quot;autocomplete&quot;&gt;&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	new Ajax.Autocompleter('address', 'adresse_choices', 'get_addresses.php');
&lt;/script&gt;
</pre>
<p>Wichtig sind hierbei nat&#252;rlich die eckigen Klammern am Ende des Name Attributs, damit auch alle kopierten Werte mit&#252;bertragen werden. Damit wir einer Kopie dieses Feldes eine neue Instanz hinzuf&#252;gen k&#246;nnen, m&#252;ssen wir beim Kopieren auch die ID ver&#228;ndern. Dazu schreiben wir uns eine kleine Callback-Funktion, die genau das erledigt:</p>
<pre class="brush: jscript;">
function activateAutocomplete(newRow){
	var addressInput = $A(newRow.select('input')).first();
	addressInput.id += 1;
	addressInput.stopObserving();
	new Ajax.Autocompleter(addressInput.id, 'adresse_choices', 'get_addresses.php');
}
</pre>
<p>In der 2. Zeile selektieren wir das erste Element innerhalb der neuen Zeile (wir nehmen hier also an, dass es sich dabei um das AutoCompleter Feld handelt). Diesem f&#252;gen wir in der 3. Zeile zus&#228;tzlich zur ID eine 1 hinzu. Es entstehen also Felder nach dem Muster <code>"address1", "address11"</code> usw. Das reicht aus um die Felder genau zu referenzieren.<br />
In der 4. Zeile kommt die schon angesprochene Funktion zum Einsatz, die das Autocomplete f&#252;r das Feld deaktiviert. Zu guter Letzt erzeugen wir eine neue Instanz des Ajax.Autocompleter. Wir k&#246;nnen dabei als zweiten Parameter dasselbe DIV Element f&#252;r die Vorschl&#228;ge verwenden, da es ja nicht m&#246;glich ist, gleichzeitig in zwei Felder etwas einzutippen. Das DIV wird automatisch durch Scriptaculous unter das Feld positioniert, in dem es verwendet wird.</p>
<p>Damit das ganze nun auch dupliziert werden kann, f&#252;gen wir noch einen entsprechenden Link ein. Dieser muss dann die Callback-Funktion als zweiten Parameter in der Funktion erhalten. Ich verwende hier ein SPAN Element mit einem onclick Event. Es geht aber auch mit einem gew&#246;hnlichen Link:</p>
<pre class="brush: xml; gutter: false;">
&lt;span class=&quot;add&quot; onclick=&quot;addRow('#addressform dl', {reset : true, afterInsert: activateAutocomplete})&quot;&gt;Adresse hinzuf&#252;gen&lt;/span&gt;
</pre>
<p>Es wird durch den Selektor <code>"#addressform dl"</code> die gesamte Definition inklusive des Label kopiert. Ihr k&#246;nnt aber auch eine andere HTML Struktur wie z.B. eine unsortierte Liste verwenden.</p>
<p>Das war auch schon alles. Das Beispiel k&#246;nnt ihr euch hier ansehen und auch den Quellcode dazu runterladen:</p>
<p><a href="http://kau-boys.de/beispiele/google_maps_suggest/duplicate.html">Beispiel</a><br />
<a href="http://kau-boys.de/beispiele/google_maps_suggest/google_maps_suggest_duplicate.zip">Download</a></p>
<p>Ich hoffe, dass euch die erweiterte Anwendung gefallen hat und vielleicht auf neue Ideen gebracht hat. Wenn ihr eine andere Anwendung kennt, bei der Ihr nicht weiterkommt w&#252;rde ich mich wie immer &#252;ber einen Kommentar sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/zeilen-duplizierer-mit-autocomplete-felder-nutzen/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Google Maps Suggest &#8211; Adress-Autovervollst&#228;ndigung mit Scriptaculous</title>
		<link>http://kau-boys.de/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous</link>
		<comments>http://kau-boys.de/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous#comments</comments>
		<pubDate>Tue, 06 Oct 2009 22:22:36 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=364</guid>
		<description><![CDATA[Viele nutzen Autovervollst&#228;ndigungen auf ihrer Website. Es ist nicht nur eine sehr beeindruckende Technik, sondern zudem eine sehr nutzerfreundliche. Zus&#228;tzlich kann sie dazu dienen, dass in einem Formular m&#246;glichst g&#252;ltige Werte gespeichert werden. Selbstverst&#228;ndlich m&#252;ssen alle Daten serverseitig erneut &#252;berpr&#252;ft werden. Ich m&#246;chte heute zeigen, wie einfach es mit Scriptaculous m&#246;glich ist, eine Autovervollst&#228;ndigung mit [...]]]></description>
			<content:encoded><![CDATA[<p>Viele nutzen Autovervollst&#228;ndigungen auf ihrer Website. Es ist nicht nur eine sehr beeindruckende Technik, sondern zudem eine sehr nutzerfreundliche. Zus&#228;tzlich kann sie dazu dienen, dass in einem Formular m&#246;glichst g&#252;ltige Werte gespeichert werden. Selbstverst&#228;ndlich m&#252;ssen alle Daten serverseitig erneut &#252;berpr&#252;ft werden.</p>
<p>Ich m&#246;chte heute zeigen, wie einfach es mit Scriptaculous m&#246;glich ist, eine Autovervollst&#228;ndigung mit Google-Maps-Adressen umzusetzen. Da man per AJAX nicht auf fremde Website einen AJAX-Request durchf&#252;hren kann, m&#252;ssen wir ein Skript als Schnittstelle zwischen Google Maps und unserer Website verwenden. Fangen wir also dieses Mal mit der serverseitigen Script an:</p>
<p><span id="more-364"></span></p>
<pre class="brush: php;">
$json = json_decode(file_get_contents('http://maps.google.com/maps/geo?output=json&amp;oe=utf8&amp;sensor=false&amp;hl=de&amp;key=DEIN_GOOGLE_MAPS_API_KEY&amp;q='.urlencode($_REQUEST['address'])));

echo '&lt;ul&gt;';
if(!empty($json-&gt;Placemark)){
	foreach($json-&gt;Placemark as $value){
		echo '&lt;li&gt;'.$value-&gt;address.'&lt;/li&gt;';
	}
}
echo '&lt;/ul&gt;';
</pre>
<p>Zuerst stellen wir eine Suchanfrage an Google Maps, wobei wir den zu suchenden Text einfach im Parameter &#8220;q&#8221; &#252;bergeben. Der Parameter &#8220;output&#8221; gibt hierbei das von Google Maps zur&#252;ckgelieferte Format an. Ich habe hier JSON verwendet und wandle die Daten anschlie&#223;end mit der <a href="http://de.php.net/manual/de/function.json-decode.php">json_decode()</a> Funktion in ein Objekt um. Es kann aber genauso gut XML in Kombination mit einer XML Funktion sie <a href="http://de.php.net/manual/de/function.simplexml-load-string.php">simplexml_load_string()</a> verwendet werden. Da JSON da kompaktere Format ist habe ich mich in diesem Beispiel daf&#252;r entschieden.</p>
<p>Ein weiterer interessanter Parameter ist &#8220;hl&#8221;, der die Sprache der Adressen angibt. Viele werden den Parameter auch von der Google Suche kenne. Hier werden die Adressen also in deutsch zur&#252;ckgegeben. Mit Hilfe dieses einen Parameters k&#246;nnt ihr also sehr schnell die Funktion auf andere Spracheversionen eurer Seite anpassen.</p>
<p>Damit ihr &#252;berhaupt eine Anfrage an Google Maps stellen d&#252;rft, ben&#246;tigt ihr einen <a href="http://code.google.com/intl/de-DE/apis/maps/signup.html">kostenlosen Google Maps API Key</a>, den ihr an den &#8220;key&#8221; Parameter anh&#228;ngen m&#252;sst (Danke an paddy, der mich auf das Fehlen des Keys hingewiesen hat).</p>
<p>Nachdem die Daten von Google Maps empfangen wurden und im Objekt vorhanden sind, geben wir sie an die JavaScript Funktion zur&#252;ck. Dazu erzeugen wir einfach eine unsortierte Liste mit einem Eintrag pro gefundener Adresse.</p>
<p>Und jetzt kommen wir zum sehr umfangreichen clientseitigen Script. Dazu m&#252;ssen wir erst einmal ein Formular mit einem Textfeld erzeugen. Au&#223;erdem ben&#246;tigen wir ein DIV, in dem die Ergebnisse ausgegeben werden. Zu guter Letzt kommt dann noch das JavaScript, das den ganzen AJAX-Request und das Behandeln der Empfangenen Daten erledingen muss. Was aber sehr kompliziert klingt, ist recht kurz umgesetzt:</p>
<pre class="brush: xml; gutter: false;">
&lt;input type=&quot;text&quot; id=&quot;address&quot; name=&quot;address&quot; /&gt;
&lt;div id=&quot;adresse_choices&quot; class=&quot;autocomplete&quot;&gt;&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	new Ajax.Autocompleter('address', 'adresse_choices', 'get_addresses.php');
&lt;/script&gt;
</pre>
<p>Die ganze Sache l&#228;sst sich mit einer einzigen Zeile JavaScript erledigen. Selbstverst&#228;ndlich m&#252;ssen dazu noch im Kopfbereich die &#8220;prototype.js&#8221; sowie anschlie&#223;end die &#8220;scriptaculous.js&#8221; eingebunden werden. Die Funktion <a href="http://wiki.github.com/madrobby/scriptaculous/ajax-autocompleter">Ajax.Autocompleter()</a> geh&#246;rt hierbei zum Funktionsumfang von Scriptaculous. Das fertige Resultat sieht dann wie folgt aus:</p>
<p><img src="http://kau-boys.de/wp-content/uploads/2009/10/google_maps_suggest.png" alt="Google Maps Suggest" title="Google Maps Suggest Beispiel Formular" /></p>
<p>Die hier verwendete ABC-Stra&#223;e ist kein Witz, sondern die Adresse von Google Deutschland. Eine weitere sch&#246;ne Eigenschaft von Google Maps ist die automatische Rechtschreibkorrektur, die bei fehlehaften Eingaben durchgef&#252;hrt wird. Selbst eine Eingabe wie &#8220;plazt der luftbl&#246;cke&#8221; f&#252;hrt trotzdem zu dem gew&#252;nschten Platz vor dem ehemaligen Berliner Flughafen. Um die Sache testen zu k&#246;nnen, habe ich hier ein kleines Beipsiel erstellt, dass ihr euch auch gerne im Quellcode runterladen k&#246;nnt. Ich habe zus&#228;tzlich noch eine Funktion verwendet, die den Suchbegriff hervorhebt:</p>
<p><a href="http://kau-boys.de/beispiele/google_maps_suggest/maps.html">Beispiel</a><br />
<a href="http://kau-boys.de/beispiele/google_maps_suggest/google_maps_suggest.zip">Download</a></p>
<p>Wir ihr also sehen k&#246;nnt, ist es mit der Ajax.Autocompleter() Funktion und einem servreseitigen Skript sehr einfach m&#246;glich, auch Daten von anderen Seiten auszuliefern. Das dazu ben&#246;tigte PHP Skript kann durch kleine Ver&#228;nderungen an die entsprechende extrene Datenquelle und das zur&#252;ckgelieferte Format angepasst werden. Die Funktion l&#228;sst sich aber nat&#252;rlich auch genauso gut mit jQuery oder einem anderen Framework umsetzen. Dazu muss dann aber eventuell das zur&#252;ckgelieferte Format des PHP Skript auch noch angepasst werden.</p>
<p>Ich hoffe das Beispiel hat euch gezeigt, wie vielf&#228;ltig sich eine Autovervollst&#228;ndigung einsetzen l&#228;sst. Habt ihr auch schon einmal mit externen Daten gearbeitet? Oder habt ihr vielleicht eine Idee, konntet sie aber bisher nicht umsetzen? &#220;ber ein Kommentar dazu w&#252;rde ich mich sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
