<?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; Prototype</title>
	<atom:link href="http://kau-boys.de/tag/prototype/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>
		<item>
		<title>Die magische select() Funktion!</title>
		<link>http://kau-boys.de/webentwicklung/die-magische-select-funktion?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=die-magische-select-funktion</link>
		<comments>http://kau-boys.de/webentwicklung/die-magische-select-funktion#comments</comments>
		<pubDate>Mon, 31 Aug 2009 17:17:16 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Prototype]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=218</guid>
		<description><![CDATA[Bei meinem vorherigen Post zum Zeilen-Duplizierer stand ich vor dem Problem, dass ich Elemente eines bestimmten Tags innerhalb eines ausgew&#228;hlten DOM-Elements finden musste. Da ich hierf&#252;r in den Utility Methods nicht gefunden habe, musste ich die Funktion getElementsByTagName() verwenden. Alleine hiermit konnte ich aber noch immer nicht auf die Elemente zugreifen. Dazu musste ich den [...]]]></description>
			<content:encoded><![CDATA[<p>Bei meinem vorherigen Post zum <a href="http://kau-boys.de/2009/08/27/einfacher-zeilen-duplizierer-mit-prototype/">Zeilen-Duplizierer</a> stand ich vor dem Problem, dass ich Elemente eines bestimmten Tags innerhalb eines ausgew&#228;hlten DOM-Elements finden musste. Da ich hierf&#252;r in den <a href="http://www.prototypejs.org/api/utility">Utility Methods</a> nicht gefunden habe, musste ich die Funktion <a href="http://de.selfhtml.org/javascript/objekte/document.htm#get_elements_by_tag_name">getElementsByTagName()</a> verwenden. Alleine hiermit konnte ich aber noch immer nicht auf die Elemente zugreifen. Dazu musste ich den Aufruf noch mit der <a href="http://www.prototypejs.org/api/utility/dollar-a">$A()</a> Funktion verwenden. Der gesamte Aufruf f&#252;r die drei Formularfelder sah dann wie folgt aus:</p>
<p><span id="more-218"></span></p>
<pre class="brush: jscript;">
$A(newRow.getElementsByTagName('select')).invoke('clear');
$A(newRow.getElementsByTagName('textarea')).invoke('clear');
$A(newRow.getElementsByTagName('input')).each(function(elm){
	elm.clear().checked = '';
});
</pre>
<p>Heute bin ich durch Zufall dann auf die seit Prototype 1.6 neue Funktion <a href="http://www.prototypejs.org/api/element/select">select()</a> gesto&#223;en. Damit konnte ich in einem ersten Versuch die gleiche Selektion mit folgenden Zeilen nachbilden:</p>
<pre class="brush: jscript;">
newRow.select('select').invoke('clear');
newRow.select('textarea').invoke('clear');
newRow.select('input')).each(function(elm){
	elm.clear().checked = '';
});
</pre>
<p>Aber selbst diese Vereinfachung ist noch zu umst&#228;ndlich. Die Funktion erlaubt das Selektrieren mit mehreren CSS-Selektoren. Dazu werden die CSS-Selektoren einfach als Parameter der Funktion &#252;bergeben:</p>
<pre class="brush: jscript;">
newRow.select('select', 'textarea', 'input')).each(function(elm){
	elm.clear().checked = '';
});
</pre>
<p>Diese Vereinfachung ist zwar nicht ganz sinnvoll, da hier auch f&#252;r Textfelder das &#8220;checked&#8221; Attribute geleert wird, aber es schadet auch an dieser Stelle nicht weiter.</p>
<p>Wie ihr also sehen k&#246;nnt bietet die select() Funktion eine sehr einfache Selektion innerhalb eines bereits selektierten Elements. Zus&#228;tzlich zu der bereits beschriebenen Funktionalit&#228;t erweitert die select() Funktion die Elemente zus&#228;tzlich noch mit der <a href="http://www.prototypejs.org/api/element/extend">extend()</a> Funktion um weitere Methoden. Sie einfacht also folgenden Aufruf auf lediglich einen Funktionsaufruf:</p>
<pre class="brush: jscript;">
// gew&#246;hnlicher Aufruf mit der getElementsByTagName() Funktion
$A(newRow.getElementsByTagName('input')).map(Element.extend);
// gleicher Aufruf mit Hilfe der select() Funktion
newRow.select('input');
</pre>
<p>Die select() Funktion erm&#246;glicht also im Prinzip das Anwenden der <a href="http://www.prototypejs.org/api/utility/dollar-dollar">$$()</a> Funktion erweitert um das Zusammenfassen der Elemente in einem Array. Dadurch l&#228;sst sich beim Verarbeiten von selektierten Elementen einiges an Mehraufwand einsparen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/die-magische-select-funktion/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Einfacher Zeilen-Duplizierer mit Prototype</title>
		<link>http://kau-boys.de/webentwicklung/einfacher-zeilen-duplizierer-mit-prototype?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=einfacher-zeilen-duplizierer-mit-prototype</link>
		<comments>http://kau-boys.de/webentwicklung/einfacher-zeilen-duplizierer-mit-prototype#comments</comments>
		<pubDate>Thu, 27 Aug 2009 15:54:47 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Prototype]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=196</guid>
		<description><![CDATA[Viele standen schon einmal vor dem Problem, dass in einem Formular zu einem Bereich mehrere Eingaben m&#246;glich sein sollten. Meist wird dies durch mehrere Text-Felder gel&#246;st, die in einer Tabelle angeordnet sind. Um nun aber dem Benutzer die M&#246;glichkeit zu geben eine weitere Zeile einzuf&#252;gen musste oft das Formular &#8220;abgeschickt&#8221; werden, wobei aber der Speicher-Algorithmus [...]]]></description>
			<content:encoded><![CDATA[<p>Viele standen schon einmal vor dem Problem, dass in einem Formular zu einem Bereich mehrere Eingaben m&#246;glich sein sollten. Meist wird dies durch mehrere Text-Felder gel&#246;st, die in einer Tabelle angeordnet sind. Um nun aber dem Benutzer die M&#246;glichkeit zu geben eine weitere Zeile einzuf&#252;gen musste oft das Formular &#8220;abgeschickt&#8221; werden, wobei aber der Speicher-Algorithmus umgangen wurde. Anschlie&#223;end wurde das gesamte Formular neu geladen mit einer neuen Zeile f&#252;r den entsprechenden Bereich.</p>
<p>Zum Gl&#252;ck sind wir heute wesentlich weiter. Zwar war eine L&#246;sung per JavaScript auch in der Vergangenheit schon m&#246;glich, aber durch die Verwendung modernen Frameworks wie Prototype l&#228;sst sich das gesamte Problem auf eine Zeile Code reduzieren:</p>
<p><span id="more-196"></span></p>
<pre class="brush: jscript; gutter: false;">
$$('#table tr').last().insert({'after' : this.cloneNode(true)});
</pre>
<p>Zugegeben, hier werden einige Funktionen in Reihe aufgerufen, aber diese Zeile Code l&#228;sst sich ohne weiteres per inline Eventhandler verwenden.</p>
<p>Doch der Reihe nach, was wird mit dieser Zeile eigentlich gemacht? Fangen wir einfach vorne bei der <a href="http://www.prototypejs.org/api/utility/dollar-dollar">$$()</a> Funktion an. Hier &#252;bergeben wir einen CSS-Selektor um alle TR Tags innerhalb der Tabelle mit der ID &#8220;table&#8221; zu selektrieren und bekommen durch anwenden der <a href="http://www.prototypejs.org/api/array/last">last()</a> Funktion die letzte davon ausgew&#228;hlt. Auf diese Zeile wenden wir nun die <a href="http://www.prototypejs.org/api/element/insert">insert()</a> Funktion an. Dabei wird die Zeile selbst &#252;bergeben und steht &#252;ber &#8220;this&#8221; zur Verf&#252;gung. Dies machen wir uns zu Nutze und duplizieren die letzte Zeile durch die Funktion <a href="http://de.selfhtml.org/javascript/objekte/node.htm#clone_node">cloneNode()</a>. Diese kopierte Zeile wird nun nach der vorherigen eingef&#252;gt, was durch die Angabe von &#8220;after&#8221; angegeben wird.</p>
<p>Da die letzte Zeile kopiert wird, werden auch alle Werte, die sich in Formluarfeldern dieser Zeile befinden mitkopiert. Um dies zu verhindern m&#252;ssten die Felder zur&#252;ckgesetzt werden. Das ganze in eine Funktion gepackt und mit zweit Callback-Funktionen erweitert sieht dann wie folgt aus:</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);
}
</pre>
<p>Wenn im Options Hash der reset Parameter auf true gesetzt wird, werden vor dem Einf&#252;gen der neuen Zeile alle Felder zur&#252;ckgesetzt. Dazu werden die Formular-Elemente mit der <a href="http://www.prototypejs.org/api/element/select">select()</a> Funktion ausgew&#228;hlt und mit Hilfe der <a href="http://www.prototypejs.org/api/enumerable/each">each()</a> Funktion wird jede Zeile durch die <a href="http://www.prototypejs.org/api/form/element/clear">clear()</a> Funktion zur&#252;ckgesetzt. Bei Radio-Buttons und Checkboxen werden zus&#228;tzlich die &#8220;checked&#8221; Attribute zur&#252;ckgesetzt.</p>
<p>Die Funktion kann nun jedem Beliebigen Element zugerdnet werden. Hier bietet sich ein Link, ein SPAN oder ein Bild an:</p>
<pre class="brush: xml; gutter: false;">
&lt;span onclick=&quot;addRow('table', {reset: true, beforeInsert: doSomeMagic})&quot;&gt;Zeile hinzuf&#252;gen&lt;/span&gt;
</pre>
<p>Bei diesem Beispiel-Button wurde der reset Parameter auf &#8220;true&#8221; gesetzt und zus&#228;tzlich der Name einer Callback-Funktion angegeben, die vor dem einf&#252;gen aufgerufen wird. Die Callback-Funktion &#8220;beforeInsert&#8221; bietet sich an, um z.B. LABEL Tags in der einzuf&#252;genden Zeile zu ersetzen. Die Callback-Funktion &#8220;afterInsert&#8221; kann verwendet werden, um z.B. Eventhander oder andere Funktionen einem Element der neuen Reihe zuzuordnen, was besser nach dem einf&#252;gen vorgenommen werden sollte. Beide Callbacks erhalten eine Referenz auf die einzuf&#252;gende Zeile.</p>
<p>Als kleines Beispiel habe ich das Formular aus meinem <a href="http://kau-boys.de/2009/08/20/formular-vorschau-mit-jquery-thickbox/">vorherigen Post</a> etwas umgebaut und die Funktion zum Hinzuf&#252;gen einer E-Mail-Adresse eingesetzt. Hier das Beispiel und der Quellcode dazu:</p>
<p><a href="http://kau-boys.de/beispiele/formpreview/form_addrow.php">Beispiel</a><br />
<a href="http://kau-boys.de/beispiele/formpreview/formpreview_addrow.zip">Download</a></p>
<p>Hierbei kommt ein sehr viel komplexerer CSS-Selektor zum Einsatz:</p>
<pre class="brush: xml; gutter: false;">
&lt;span onclick=&quot;addRow('form dl:first-of-type dd ul li', {reset: true})&quot;&gt;Add address&lt;/span&gt;
</pre>
<p>Wie Ihr also seht, k&#246;nnt ihr die Funktion f&#252;r beliebige Elemente verwenden, bei denen es Sinn macht, sie zeilenweise zu duplizieren.</p>
<p>Falls ein jQuery-Profi unter euch ist, w&#252;rde mich eine L&#246;sung in jQuery sehr interessieren. Ich habe leider noch nicht genug Erfahrung darin, um die Funktion ebenfalls in jQuery zu schreiben. Wenn ihr Anmerkungen zur Prototype-Version habt w&#252;rde mich diese aber auch interessieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/einfacher-zeilen-duplizierer-mit-prototype/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Kau-Boy&#8217;s AutoCompleter Plugin</title>
		<link>http://kau-boys.de/wordpress/kau-boys-autocompleter-plugin?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=kau-boys-autocompleter-plugin</link>
		<comments>http://kau-boys.de/wordpress/kau-boys-autocompleter-plugin#comments</comments>
		<pubDate>Thu, 02 Jul 2009 16:11:34 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Prototype]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=24</guid>
		<description><![CDATA[Dieses Plugin verwendet den Ajax.Autocompleter von script.aculo.us bzw. die jQuery Autocomplete Funktoin um Beitr&#228;ge zu finden, die den Suchbegriff im Titel oder Inhaltstext enthalten. Der eingegebene Text kann in den Titel der Beitr&#228;ge und/oder im Inhalt gesucht werden. Es kann zus&#228;tzlich die Formatierung der Ergebnisse &#252;ber eine eigene CSS Datei an den Blog angepasst werden. [...]]]></description>
			<content:encoded><![CDATA[<p>Dieses Plugin verwendet den Ajax.Autocompleter von script.aculo.us bzw. die jQuery Autocomplete Funktoin um Beitr&#228;ge zu finden, die den Suchbegriff im Titel oder Inhaltstext enthalten.</p>
<p>Der eingegebene Text kann in den Titel der Beitr&#228;ge und/oder im Inhalt gesucht werden. Es kann zus&#228;tzlich die Formatierung der Ergebnisse &#252;ber eine eigene CSS Datei an den Blog angepasst werden. Es kann jeweils der Titel oder zus&#228;tzlich ein Teil des Inhalts angegeben werden, wobei hier auch die L&#228;nge des auszugebenden Inhaltes eingestellt werden kann.</p>
<p><span id="more-24"></span></p>
<h2>Installation:</h2>
<h3>Installation &#252;ber die WordPress Adminstrator-Seiten:</h3>
<ol>
<li>Gehe zur Admin-Seite <code>Plugins -&gt; Installieren</code></li>
<li>Suche nach <code>kau-boy</code> und w&#228;hle das Plugin aus</li>
<li>W&#228;hle die Aktion <code>Jetzt installieren</code></li>
<li>Klicke auf <code>Jetzt installieren</code></li>
<li>Aktiviere das Plugin &#252;ber den <code>Plugins</code> Men&#252;punkt in WordPress</li>
<li>Du musst eventuell die Einstellungen anpassen, gerade wenn dein Suchfeld eine andere ID als <code>s</code> hat</li>
</ol>
<h3>Installation unter Verwendung der WordPress Adminstrator-Seiten:</h3>
<ol>
<li>Lade die zip-Datei des Plugins herunter: <a href="http://downloads.wordpress.org/plugin/kau-boys-autocompleter.2.2.zip">kau-boys-autocompleter.2.2.zip</a></li>
<li>Gehe zur Admin-Seite <code>Plugins -&gt; Installieren</code></li>
<li>W&#228;hle den Link <code>Hochladen</code> unter <code>Plugins Installieren</code> &#220;berschrift</li>
<li>W&#228;hle die zip-Datei aus und klicke <code>Jetzt installieren</code></li>
<li>Aktiviere das Plugin &#252;ber den <code>Plugins</code> Men&#252;punkt in WordPress</li>
<li>Du musst eventuell die Einstellungen anpassen, gerade wenn dein Suchfeld eine andere ID als <code>s</code> hat</li>
</ol>
<h3>Installation unter Verwendung von FTP</h3>
<ol>
<li>Lade die zip-Datei des Plugins herunter: <a href="http://downloads.wordpress.org/plugin/kau-boys-autocompleter.2.2.zip">kau-boys-autocompleter.2.2.zip</a></li>
<li>Entpacke es und lade es in dein <code>/wp-content/plugins/</code> Verzeichnis hoch</li>
<li>Aktiviere das Plugin &#252;ber den <code>Plugins</code> Men&#252;punkt in WordPress</li>
<li>Du musst eventuell die Einstellungen anpassen, gerade wenn dein Suchfeld eine andere ID als <code>s</code> hat</li>
</ol>
<h2>Screenshots:</h2>
<h3>Screenshot des Plugins in einem neuen WordPress blog</h3>
<p><img title="Screenshot des Plugins in einem neuen WordPress blog" src="http://kau-boys.de/wp-content/uploads/2009/08/screenshot-1.png" alt="Screenshot des Plugins" /></p>
<h3>Screenshot der Einstellungsseite (auch in englisch erh&#228;ltlich)</h3>
<p><img title="Screenshot der Einstellungsseite (auch in englisch erh&#228;ltlich)" src="http://kau-boys.de/wp-content/uploads/2009/08/screenshot-2-de.png" alt="Screenshot der Einstellungsseite" /></p>
<h2>Versionsgeschichte:</h2>
<ul>
<li><strong>2.2</strong> Deaktivieren der Suche f&#252;r Suchfelder im Adminbereich und Erm&#246;glichen der Verwendung zusammen mit dem relevanssi Plugin</li>
<li><strong>2.1</strong> Hinzuf&#252;gen einer neuen Version von jQuery Autocomplete</li>
<li><strong>2.0.1</strong> Entfernen von &#8220;short open tags&#8221;, die auf blogs die Fehler verursachen die &#8220;short_open_tag&#8221; nicht auf &#8220;On&#8221; gesetzt haben</li>
<li><strong>2.0</strong> Autocompleter mit mehreren Textfelder auf einer Seite nutzbar machen, verbessern der K&#252;rzung des Inhalt von Artikeln</li>
<li><strong>1.9</strong> Beheben von Problemen mit PHP4, funktioniert nun auch mit qTranslate im &#8220;Query-Modus&#8221; (?lang=de)</li>
<li><strong>1.8</strong> Hinzuf&#252;gen der Einstellung f&#252;r die L&#228;nge des Titels und des Inhalts in den Ergebnissen</li>
<li><strong>1.7</strong> Erstzen von jQuery suggest durch jQuery autocomplete, da das suggest Plugin HTML Auszeichnungen zerst&#246;rt</li>
<li><strong>1.6.1</strong> Verwendung des id Attributs als Standard anstelle des name Attributs</li>
<li><strong>1.6</strong> Hinzuf&#252;gen der M&#246;glichkeit das Suchfeldes anhand des name Atrrbiuts auszuw&#228;hlen</li>
<li><strong>1.5.2</strong> Hinzuf&#252;gen der richtigen Kodierung zu <code>html_entity_decode()</code> um das Zerteilen von XML Enit&#228;ten zu verhindern</li>
<li><strong>1.5.1</strong> Fehler im AJAX repsonse behoben, der die Einstellung f&#252;r die Ergebnisfelder nicht geladen hat</li>
<li><strong>1.5</strong> Hinzuf&#252;gen Auswahlm&#246;glichkeiten f&#252;r die Such- und Ergebnisfelder</li>
<li><strong>1.4.1</strong> Aktualisierung der &#220;bersetzungsdatei</li>
<li><strong>1.4</strong> Kombinieren der Styles f&#252;r jQuery und script.aculo.us, Hinzuf&#252;gen  einer Einstellung zur Multibyte-Kodierung</li>
<li><strong>1.3.5</strong> Fehler bei der <code>html_entity_decode()</code> Konvertierung beseitigt</li>
<li><strong>1.3</strong> Enfternen eines Kommentars in autocompleter.js.php, welcher eine PHP header warning  erzeugt hat</li>
<li><strong>1.2</strong> Verwendung von <code>html_entity_decode()</code> um das Zerteilen von Enit&#228;ten zu verhindern</li>
<li><strong>1.1</strong> Entfernen von WordPress shortcodes um leere oder falsche Seiten zu verhindern</li>
<li><strong>1.0</strong> M&#246;glichkeit jQuery ODER script.aculo.us zu verwenden, &#220;bersetzen der Einstellungsseite ins Deutsche</li>
<li><strong>0.4</strong> Hinzuf&#252;gen der Einstellung f&#252;r die Anzahl der Suchergebnisse und der eigenen CSS Date</li>
<li><strong>0.3</strong> Hinzuf&#252;gen der Einstellung f&#252;r die Suchfeld ID</li>
<li><strong>0.2</strong> Erste stabile Version</li>
</ul>
<p>Wenn dir dieses Plugin gef&#228;llt oder dir etwas fehlt, w&#252;rde ich mich freuen es zu erfahren. Hinterlasse einfach ein Kommentar auf dieser Seiter oder auf meiner <a href="http://wordpress.org/tags/kau-boys-autocompleter">WordPress Plugin Seite</a>.</p>
<p><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=6104701"><img style="border: 0pt none ;" src="http://kau-boys.de/wp-content/uploads/2009/07/btn_donate_LG_en_US.gif" alt="PayPal - The safer, easier way to pay online!" /></a> <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=6104638"><img style="border: 0pt none ;" src="http://kau-boys.de/wp-content/uploads/2009/07/btn_donate_LG_de_DE.gif" alt="PayPal - The safer, easier way to pay online!" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/wordpress/kau-boys-autocompleter-plugin/feed</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
	</channel>
</rss>
