<?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>Sun, 22 Jan 2012 17:33:25 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Tutorial: Drag-and-Drop mit Scriptaculous – Teil 2: Droppables</title>
		<link>http://kau-boys.de/830/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables</link>
		<comments>http://kau-boys.de/830/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äftigt haben, wenden wir uns heute seinem Bruder der Droppables Klasse zu. Mit ihr können wir auf ein aufgenommenes Element reagieren. Eine typische Anwendung sind Einkaufkörbe auf Online-Shops. Ich möchte daher einen einfachen Einkaufswagen demonstieren. Der Quellcode für dieses Beispiel Zuerst einmal wieder [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem wir uns in <a href="http://kau-boys.de/785/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ä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önnen wir auf ein aufgenommenes Element reagieren. Eine typische Anwendung sind Einkaufkörbe auf Online-Shops. Ich möchte daher einen einfachen Einkaufswagen demonstieren.</p>
<h2>Der Quellcode für dieses Beispiel</h2>
<p>Zuerst einmal wieder der Quellcode für dieses Beispiel. Ich werde wie auch schon im ersten Teil des Tutorials die wichtigen Zeilen etwas genauer erklären. Die Zeilen 1-34 enthalten das grundlegende Gerüst der HTML-Seite sowie die Stylesheets, auf die ich nicht näher eingehen möchte:</p>
<p><span id="more-830"></span></p>
<pre class="brush: xml; title: ; notranslate">
&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ü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ührt (in unserem Fall einfache farbige DIVs) sowie der &#8220;Warenkorb&#8221;, der eine leere unsortierte Liste enthält. In diese fü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üngliche Position zurückkehren. Nun aber zum neuen Teil der Droppables-Klasse:</p>
<pre class="brush: jscript; gutter: false; title: ; notranslate">
Droppables.add('shopping_cart', {
	onDrop: addItem,
	hoverclass: 'hover'
});
</pre>
<p>Wichtig ist hier, dass wir keine Instanz der Klasse durch das Schlü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ügen. Es ist also möglich mehrere Bereiche einer Website für die Reaktion auf Draggables zu verwenden. Es wäre z.B. möglich einen &#8220;Papierkorb&#8221; einzurichten, mit dem man einenen bereits hinzugefügten Artikel wieder aus der Liste entfernen kann bzw. dessen Anzahl verringern.</p>
<p>Der add() Funktion können auch mehrere Optionen übergeben werden, welche das sind kö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über steht. Zusätzliche gebe ich eine Callback-Funktion für das <code>onDrop</code> Event an. Wie ihr der Funktion <code>addItem()</code> entnehmen könnte, bekommt die <code>onDrop()</code> Funktion eine Referenz auf das aufgenommene Elemente sowie auf die &#8220;Drop-Zone&#8221; und das Event selbst übergeben. In der Funktion selbst fü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ö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ü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önnt ist es sehr einfach ein Element für die Interaktion mit Draggables zu verwenden. Was ihr dabei mit den Elementen macht ist eurer Fantasie überlassen. Die Möglichkeiten sind schier unbegrenzt. Ich mö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ä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öglich ist und wie leicht sich die Sortierreihenfolge auslesen lässt, das erwartet euch in Teil 3 des Tutorials. Für welche Einsatzzwecke habt ihr bisher Draggables und Droppables genutzt? Über einen Kommentar dazu würde ich mich wie immer sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/830/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/785/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable</link>
		<comments>http://kau-boys.de/785/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öchte ich mein angekündigtes Tutorial über Drag-and-Drop starten. Das Ziel dieses Tutorials ist der Nachbau einer dynamischen Newsseite, wie ich sie in meinen Artikel Ö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öchte ich mein angekündigtes Tutorial ü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/757/webentwicklung/oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen">Ö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ür dieses Tutorial die Drag-and-Drop Funktionalitä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önnen benötigt ihr also zuerst einmal die beiden Frameworks.</p>
<p><span id="more-785"></span></p>
<h2>Der Quellcode für dieses Beispiel</h2>
<p>Beginnen wir also mit dem Beispiel. Zuerst einmal benötigen wir etwas HTML in dem wir ein Element platzieren, welches wir dann aufnehmen möchten. Für das Element nehme ich exemplarisch ein DIV, aber ihr könnt auch z.B. ein Bild verwenden:</p>
<pre class="brush: xml; title: ; notranslate">
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&amp;gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; dir=&amp;quot;ltr&amp;quot; lang=&amp;quot;de-DE&amp;quot;&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;head&amp;gt;
		&amp;lt;title&amp;gt;Drag-and-Drop Teil 1&amp;lt;/title&amp;gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;prototype.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;scriptaculous.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
		&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;
			#draggable {
				width: 100px;
				height: 100px;
				padding: 30px;
				background-color: #39c;
				border: 1px solid #000;
				cursor: move;
			}
		&amp;lt;/style&amp;gt;
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;h1&amp;gt;Drag-and-Drop&amp;lt;/h1&amp;gt;
		&amp;lt;div id=&amp;quot;draggable&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
			new Draggable('draggable');
		&amp;lt;/script&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
</pre>
<p>Wichtig für das Aktivieren der Draggable Funktion auf ein Element ist eine ID für das Element. Das DIV hat hier die ID &#8220;draggable&#8221;. Im Kopf werden die beiden JavaScript Dateien für Prototype und Scriptaculous eingebunden. Wichtig ist hierbei, dass zuerst Prototype eingebunden wird. Zusä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; title: ; notranslate">
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 übergeben, welches aufnehmbar sein soll.</p>
<h2>Ein Beispiel gefä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ü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 übergeben werden können. Wir können z.B. die Bewegung eines Elements auf die horizontale beschränken und zusätzlich das Element beim &#8220;Loslassen&#8221; des Elements wieder auf seine ursprüngliche Position zurücksetzen. Der JavaScript Befehl dazu sieht wie folgt aus:</p>
<pre class="brush: jscript; gutter: false; title: ; notranslate">
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ühren kann. Wichtig ist natürlich immer, dass ihr für die verschiedenen Elemente unterschiedliche IDs verwendet und niemals eine ID in zwei Instanzen verwendet. Das DIV verhä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öglichen Optionen zu erklären mö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öchte ich auch schon den ersten Teil des Tutorials abschließen. Ihr solltet einfach einmal die verschiedenen Optionen ausprobieren um zu sehen, wie sich das DIV dabei verhält. Im zweiten Teil beschäftigen wir uns mit &#8220;dem Bruder&#8221; von Draggable. Dabei handelt es sich um die Droppables Klasse, die es ermöglicht ein aufgenommenes Element &#8220;einzufangen&#8221; und auf das Element zu reagieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/785/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/697/webentwicklung/zeilen-duplizierer-mit-autocomplete-felder-nutzen?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=zeilen-duplizierer-mit-autocomplete-felder-nutzen</link>
		<comments>http://kau-boys.de/697/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ä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/196/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ä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ü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ösen hatte ich die erweiterte Funktion mit den beiden Callback-Funktionen erstellt. Damit ist es möglich die Referenz zum vorherigen Feld zu lö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ügt:</p>
<pre class="brush: jscript; title: ; notranslate">
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önnen benötigt jedes Feld eine eindeutige ID. Nehmen wir also an, wir haben folgendes erstes Feld für unser Formular (hier ein Beispiel aus dem Artikel: <a href="http://kau-boys.de/364/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous">Google Maps Suggest – Adress-Autovervollständigung mit Scriptaculous</a>):</p>
<pre class="brush: xml; title: ; notranslate">
&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ürlich die eckigen Klammern am Ende des Name Attributs, damit auch alle kopierten Werte mitübertragen werden. Damit wir einer Kopie dieses Feldes eine neue Instanz hinzufügen können, müssen wir beim Kopieren auch die ID verändern. Dazu schreiben wir uns eine kleine Callback-Funktion, die genau das erledigt:</p>
<pre class="brush: jscript; title: ; notranslate">
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ügen wir in der 3. Zeile zusä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ür das Feld deaktiviert. Zu guter Letzt erzeugen wir eine neue Instanz des Ajax.Autocompleter. Wir können dabei als zweiten Parameter dasselbe DIV Element für die Vorschläge verwenden, da es ja nicht mö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ü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öhnlichen Link:</p>
<pre class="brush: xml; gutter: false; title: ; notranslate">
&lt;span class=&quot;add&quot; onclick=&quot;addRow('#addressform dl', {reset : true, afterInsert: activateAutocomplete})&quot;&gt;Adresse hinzufügen&lt;/span&gt;
</pre>
<p>Es wird durch den Selektor <code>"#addressform dl"</code> die gesamte Definition inklusive des Label kopiert. Ihr könnt aber auch eine andere HTML Struktur wie z.B. eine unsortierte Liste verwenden.</p>
<p>Das war auch schon alles. Das Beispiel könnt ihr euch hier ansehen und auch den Quellcode dazu runterladen:</p>
<p class="aligncenter">
<a href="http://kau-boys.de/beispiele/google_maps_suggest/duplicate.html" class="awesome large breakerbay">Beispiel</a> <a href="http://kau-boys.de/beispiele/google_maps_suggest/google_maps_suggest_duplicate.zip" class="awesome large breakerbay" style="margin-left:20px;">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ürde ich mich wie immer über einen Kommentar sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/697/webentwicklung/zeilen-duplizierer-mit-autocomplete-felder-nutzen/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Google Maps Suggest &#8211; Adress-Autovervollständigung mit Scriptaculous</title>
		<link>http://kau-boys.de/364/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous</link>
		<comments>http://kau-boys.de/364/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ändigungen auf ihrer Website. Es ist nicht nur eine sehr beeindruckende Technik, sondern zudem eine sehr nutzerfreundliche. Zusätzlich kann sie dazu dienen, dass in einem Formular möglichst gültige Werte gespeichert werden. Selbstverständlich müssen alle Daten serverseitig erneut überprüft werden. Ich möchte heute zeigen, wie einfach es mit Scriptaculous möglich ist, eine Autovervollständigung mit [...]]]></description>
			<content:encoded><![CDATA[<p>Viele nutzen Autovervollständigungen auf ihrer Website. Es ist nicht nur eine sehr beeindruckende Technik, sondern zudem eine sehr nutzerfreundliche. Zusätzlich kann sie dazu dienen, dass in einem Formular möglichst gültige Werte gespeichert werden. Selbstverständlich müssen alle Daten serverseitig erneut überprüft werden.</p>
<p>Ich möchte heute zeigen, wie einfach es mit Scriptaculous möglich ist, eine Autovervollständigung mit Google-Maps-Adressen umzusetzen. Da man per AJAX nicht auf fremde Website einen AJAX-Request durchführen kann, mü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; title: ; notranslate">
$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; übergeben. Der Parameter &#8220;output&#8221; gibt hierbei das von Google Maps zurückgelieferte Format an. Ich habe hier JSON verwendet und wandle die Daten anschließ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ü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ückgegeben. Mit Hilfe dieses einen Parameters könnt ihr also sehr schnell die Funktion auf andere Spracheversionen eurer Seite anpassen.</p>
<p>Damit ihr überhaupt eine Anfrage an Google Maps stellen dürft, benö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ängen mü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ü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üssen wir erst einmal ein Formular mit einem Textfeld erzeugen. Außerdem benö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; title: ; notranslate">
&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ässt sich mit einer einzigen Zeile JavaScript erledigen. Selbstverständlich müssen dazu noch im Kopfbereich die &#8220;prototype.js&#8221; sowie anschließend die &#8220;scriptaculous.js&#8221; eingebunden werden. Die Funktion <a href="http://wiki.github.com/madrobby/scriptaculous/ajax-autocompleter">Ajax.Autocompleter()</a> gehö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ße ist kein Witz, sondern die Adresse von Google Deutschland. Eine weitere schöne Eigenschaft von Google Maps ist die automatische Rechtschreibkorrektur, die bei fehlehaften Eingaben durchgeführt wird. Selbst eine Eingabe wie &#8220;plazt der luftblöcke&#8221; führt trotzdem zu dem gewünschten Platz vor dem ehemaligen Berliner Flughafen. Um die Sache testen zu können, habe ich hier ein kleines Beipsiel erstellt, dass ihr euch auch gerne im Quellcode runterladen könnt. Ich habe zusätzlich noch eine Funktion verwendet, die den Suchbegriff hervorhebt:</p>
<p class="aligncenter">
<a href="http://kau-boys.de/beispiele/google_maps_suggest/maps.html" class="awesome large breakerbay">Beispiel</a> <a href="http://kau-boys.de/beispiele/google_maps_suggest/google_maps_suggest.zip" class="awesome large breakerbay" style="margin-left:20px;">Download</a>
</p>
<p>Wir ihr also sehen könnt, ist es mit der Ajax.Autocompleter() Funktion und einem servreseitigen Skript sehr einfach möglich, auch Daten von anderen Seiten auszuliefern. Das dazu benötigte PHP Skript kann durch kleine Veränderungen an die entsprechende extrene Datenquelle und das zurückgelieferte Format angepasst werden. Die Funktion lässt sich aber natürlich auch genauso gut mit jQuery oder einem anderen Framework umsetzen. Dazu muss dann aber eventuell das zurückgelieferte Format des PHP Skript auch noch angepasst werden.</p>
<p>Ich hoffe das Beispiel hat euch gezeigt, wie vielfältig sich eine Autovervollständigung einsetzen lässt. Habt ihr auch schon einmal mit externen Daten gearbeitet? Oder habt ihr vielleicht eine Idee, konntet sie aber bisher nicht umsetzen? Über ein Kommentar dazu würde ich mich sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/364/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous/feed</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>Die magische select() Funktion!</title>
		<link>http://kau-boys.de/218/webentwicklung/die-magische-select-funktion?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=die-magische-select-funktion</link>
		<comments>http://kau-boys.de/218/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ählten DOM-Elements finden musste. Da ich hierfü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/196/webentwicklung/einfacher-zeilen-duplizierer-mit-prototype">Zeilen-Duplizierer</a> stand ich vor dem Problem, dass ich Elemente eines bestimmten Tags innerhalb eines ausgewählten DOM-Elements finden musste. Da ich hierfü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ür die drei Formularfelder sah dann wie folgt aus:</p>
<p><span id="more-218"></span></p>
<pre class="brush: jscript; title: ; notranslate">
$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ßen. Damit konnte ich in einem ersten Versuch die gleiche Selektion mit folgenden Zeilen nachbilden:</p>
<pre class="brush: jscript; title: ; notranslate">
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ändlich. Die Funktion erlaubt das Selektrieren mit mehreren CSS-Selektoren. Dazu werden die CSS-Selektoren einfach als Parameter der Funktion übergeben:</p>
<pre class="brush: jscript; title: ; notranslate">
newRow.select('select', 'textarea', 'input')).each(function(elm){
	elm.clear().checked = '';
});
</pre>
<p>Diese Vereinfachung ist zwar nicht ganz sinnvoll, da hier auch fü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önnt bietet die select() Funktion eine sehr einfache Selektion innerhalb eines bereits selektierten Elements. Zusätzlich zu der bereits beschriebenen Funktionalität erweitert die select() Funktion die Elemente zusä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; title: ; notranslate">
// gewö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ö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ässt sich beim Verarbeiten von selektierten Elementen einiges an Mehraufwand einsparen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/218/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/196/webentwicklung/einfacher-zeilen-duplizierer-mit-prototype?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=einfacher-zeilen-duplizierer-mit-prototype</link>
		<comments>http://kau-boys.de/196/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öglich sein sollten. Meist wird dies durch mehrere Text-Felder gelöst, die in einer Tabelle angeordnet sind. Um nun aber dem Benutzer die Möglichkeit zu geben eine weitere Zeile einzufü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öglich sein sollten. Meist wird dies durch mehrere Text-Felder gelöst, die in einer Tabelle angeordnet sind. Um nun aber dem Benutzer die Möglichkeit zu geben eine weitere Zeile einzufügen musste oft das Formular &#8220;abgeschickt&#8221; werden, wobei aber der Speicher-Algorithmus umgangen wurde. Anschließend wurde das gesamte Formular neu geladen mit einer neuen Zeile für den entsprechenden Bereich.</p>
<p>Zum Glück sind wir heute wesentlich weiter. Zwar war eine Lösung per JavaScript auch in der Vergangenheit schon möglich, aber durch die Verwendung modernen Frameworks wie Prototype lässt sich das gesamte Problem auf eine Zeile Code reduzieren:</p>
<p><span id="more-196"></span></p>
<pre class="brush: jscript; gutter: false; title: ; notranslate">
$$('#table tr').last().insert({'after' : this.cloneNode(true)});
</pre>
<p>Zugegeben, hier werden einige Funktionen in Reihe aufgerufen, aber diese Zeile Code lä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 ü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ä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 übergeben und steht über &#8220;this&#8221; zur Verfü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ü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üssten die Felder zurückgesetzt werden. Das ganze in eine Funktion gepackt und mit zweit Callback-Funktionen erweitert sieht dann wie folgt aus:</p>
<pre class="brush: jscript; title: ; notranslate">
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ügen der neuen Zeile alle Felder zurückgesetzt. Dazu werden die Formular-Elemente mit der <a href="http://www.prototypejs.org/api/element/select">select()</a> Funktion ausgewä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ückgesetzt. Bei Radio-Buttons und Checkboxen werden zusätzlich die &#8220;checked&#8221; Attribute zurü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; title: ; notranslate">
&lt;span onclick=&quot;addRow('table', {reset: true, beforeInsert: doSomeMagic})&quot;&gt;Zeile hinzufügen&lt;/span&gt;
</pre>
<p>Bei diesem Beispiel-Button wurde der reset Parameter auf &#8220;true&#8221; gesetzt und zusätzlich der Name einer Callback-Funktion angegeben, die vor dem einfügen aufgerufen wird. Die Callback-Funktion &#8220;beforeInsert&#8221; bietet sich an, um z.B. LABEL Tags in der einzufü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ügen vorgenommen werden sollte. Beide Callbacks erhalten eine Referenz auf die einzufügende Zeile.</p>
<p>Als kleines Beispiel habe ich das Formular aus meinem <a href="http://kau-boys.de/137/webentwicklung/formular-vorschau-mit-jquery-thickbox">vorherigen Post</a> etwas umgebaut und die Funktion zum Hinzufügen einer E-Mail-Adresse eingesetzt. Hier das Beispiel und der Quellcode dazu:</p>
<p class="aligncenter">
<a href="http://kau-boys.de/beispiele/formpreview/form_addrow.php" class="awesome large breakerbay">Beispiel</a> <a href="http://kau-boys.de/beispiele/formpreview/formpreview_addrow.zip" class="awesome large breakerbay" style="margin-left:20px;">Download</a>
</p>
<p>Hierbei kommt ein sehr viel komplexerer CSS-Selektor zum Einsatz:</p>
<pre class="brush: xml; gutter: false; title: ; notranslate">
&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önnt ihr die Funktion für beliebige Elemente verwenden, bei denen es Sinn macht, sie zeilenweise zu duplizieren.</p>
<p>Falls ein jQuery-Profi unter euch ist, würde mich eine Lö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ürde mich diese aber auch interessieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/196/webentwicklung/einfacher-zeilen-duplizierer-mit-prototype/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Kau-Boy&#8217;s AutoCompleter Plugin</title>
		<link>http://kau-boys.de/24/wordpress/kau-boys-autocompleter-plugin?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kau-boys-autocompleter-plugin</link>
		<comments>http://kau-boys.de/24/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[Plugin]]></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äge zu finden, die den Suchbegriff im Titel oder Inhaltstext enthalten. Der eingegebene Text kann in den Titel der Beiträge und/oder im Inhalt gesucht werden. Es kann zusätzlich die Formatierung der Ergebnisse über eine eigene CSS Datei an den Blog angepasst werden. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://codex.wordpress.org/AJAX_in_Plugins"></a><a href="http://codex.wordpress.org/AJAX_in_Plugins"></a>Dieses Plugin verwendet den Ajax.Autocompleter von script.aculo.us bzw. die jQuery Autocomplete Funktoin um Beiträge zu finden, die den Suchbegriff im Titel oder Inhaltstext enthalten.</p>
<p>Der eingegebene Text kann in den Titel der Beiträge und/oder im Inhalt gesucht werden. Es kann zusätzlich die Formatierung der Ergebnisse über eine eigene CSS Datei an den Blog angepasst werden. Es kann jeweils der Titel oder zusätzlich ein Teil des Inhalts angegeben werden, wobei hier auch die Länge des auszugebenden Inhaltes eingestellt werden kann.</p>
<p><span id="more-24"></span></p>
<h2>Installation:</h2>
<h3>Installation ü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ähle das Plugin aus</li>
<li>Wähle die Aktion <code>Jetzt installieren</code></li>
<li>Klicke auf <code>Jetzt installieren</code></li>
<li>Aktiviere das Plugin über den <code>Plugins</code> Menü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.zip">kau-boys-autocompleter.zip</a></li>
<li>Gehe zur Admin-Seite <code>Plugins -&gt; Installieren</code></li>
<li>Wähle den Link <code>Hochladen</code> unter <code>Plugins Installieren</code> Überschrift</li>
<li>Wähle die zip-Datei aus und klicke <code>Jetzt installieren</code></li>
<li>Aktiviere das Plugin über den <code>Plugins</code> Menü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.zip">kau-boys-autocompleter.zip</a></li>
<li>Entpacke es und lade es in dein <code>/wp-content/plugins/</code> Verzeichnis hoch</li>
<li>Aktiviere das Plugin über den <code>Plugins</code> Menü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ältlich)</h3>
<p><img title="Screenshot der Einstellungsseite (auch in englisch erhä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>3.1.2</strong> Zurücksetzen der vorherigen Änderungen, da sie das Problem nicht lösen sondern es eher auslösen</li>
<li><strong>3.1.1</strong> Ersetzen von appendTo() mit prependTo() im jquery.autocompleter plugin zum beheben von Überlagerungs-Problemen</li>
<li><strong>3.1</strong> Ausblenden von PHP Warnungen, wenn WP_DEBUG inaktiv ist und Einfügen des Ergebnis-DIV in den Kopf des BODY Tag</li>
<li><strong>3.0.4</strong> Beheben eines Tippfehlers in der jQuery URL</li>
<li><strong>3.0.3</strong> Beheben eines Tippfehlers im jQuery-Selektor</li>
<li><strong>3.0.2</strong> Retag als 3.0.2 aufgrund eines Deploment-Fehlers im Respository</li>
<li><strong>3.0.1</strong> Schneller bugfix für Prototype CSS und JavaScript</li>
<li><strong>3.0</strong> Einsatz von AJAX, so wie es hier beschrieben wird: <a href="http://codex.wordpress.org/AJAX_in_Plugins">http://codex.wordpress.org/AJAX_in_Plugins</a></li>
<li><strong>2.5</strong> Anpassen das Plugin an WordPress Installationen, bei denen die wp-config.php eine Orderebene über dem ROOT Verzeichnis liegt.</li>
<li><strong>2.4</strong> Fehler mit html Entitäten im Filter beheben</li>
<li><strong>2.3</strong> Fehler des JavaScript in IE8 in Verbindung mit Prototype beheben</li>
<li><strong>2.2</strong> Deaktivieren der Suche für Suchfelder im Adminbereich und Ermöglichen der Verwendung zusammen mit dem relevanssi Plugin</li>
<li><strong>2.1</strong> Hinzufü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ü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ügen der Einstellung für die Lä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ö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ügen der Möglichkeit das Suchfeldes anhand des name Atrrbiuts auszuwählen</li>
<li><strong>1.5.2</strong> Hinzufügen der richtigen Kodierung zu <code>html_entity_decode()</code> um das Zerteilen von XML Enitäten zu verhindern</li>
<li><strong>1.5.1</strong> Fehler im AJAX repsonse behoben, der die Einstellung für die Ergebnisfelder nicht geladen hat</li>
<li><strong>1.5</strong> Hinzufügen Auswahlmöglichkeiten für die Such- und Ergebnisfelder</li>
<li><strong>1.4.1</strong> Aktualisierung der Übersetzungsdatei</li>
<li><strong>1.4</strong> Kombinieren der Styles für jQuery und script.aculo.us, Hinzufü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ä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öglichkeit jQuery ODER script.aculo.us zu verwenden, Übersetzen der Einstellungsseite ins Deutsche</li>
<li><strong>0.4</strong> Hinzufügen der Einstellung für die Anzahl der Suchergebnisse und der eigenen CSS Date</li>
<li><strong>0.3</strong> Hinzufügen der Einstellung für die Suchfeld ID</li>
<li><strong>0.2</strong> Erste stabile Version</li>
</ul>
<p>Wenn dir dieses Plugin gefällt oder dir etwas fehlt, wü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/24/wordpress/kau-boys-autocompleter-plugin/feed</wfw:commentRss>
		<slash:comments>65</slash:comments>
		</item>
	</channel>
</rss>

