<?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>Service2Max &#187; Ajax Archiv  &#8211; Blog für Programmierer und Software-Architekten</title>
	<atom:link href="http://blog.service2max.ch/category/ajax/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.service2max.ch</link>
	<description>Technik, die begeistert</description>
	<lastBuildDate>Sat, 14 May 2011 16:47:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Sortierbare Liste mit Drag &amp; Drop in Ajax</title>
		<link>http://blog.service2max.ch/sortierbare-liste-mit-drag-drop-in-ajax-tutorial/</link>
		<comments>http://blog.service2max.ch/sortierbare-liste-mit-drag-drop-in-ajax-tutorial/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 19:12:29 +0000</pubDate>
		<dc:creator>Patrick Matsumura</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.service2max.ch/?p=36</guid>
		<description><![CDATA[In diesem Tutorial möchte ich erklären, wie man mit script.aculo.us und dem Javascript Framework Prototype eine sortierbare Liste mit Drag &#38; Drop-Funktionalität aufbaut. Der Clou an der Sache ist, dass die Liste sich ihren Zustand dauerhaft merken wird. Damit das einwandfrei funktioniert, ist es notwendig die Informationen zu speichern. Als Datenspeicher dient eine MySQL Datenbank. [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.service2max.ch%2Fsortierbare-liste-mit-drag-drop-in-ajax-tutorial%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.service2max.ch%2Fsortierbare-liste-mit-drag-drop-in-ajax-tutorial%2F&amp;source=service2max&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>In diesem Tutorial möchte ich erklären, wie man mit <strong>script.aculo.us</strong> und dem <strong>Javascript Framework Prototype</strong> eine sortierbare Liste mit Drag &amp; Drop-Funktionalität aufbaut. Der Clou an der Sache ist, dass die Liste sich ihren Zustand dauerhaft merken wird. Damit das einwandfrei funktioniert, ist es notwendig die Informationen zu speichern. Als Datenspeicher dient eine MySQL Datenbank.<br />
<span id="more-36"></span><br />
Hier sind vorab die Links zur <a href="http://blog.service2max.ch/tutorials/sortable_ajax_list/sortable_list_ajax.php">Vorschau</a> und zum <a href="http://blog.service2max.ch/tutorials/sortable_ajax_list/sortable_ajax.zip">Download der Tutorialfiles</a>.</p>
<p>Zunächst braucht man <a href="http://www.prototypejs.org" target="_blank">Prototype</a> und <a href="http://script.aculo.us" target="_blank">script.aculo.us</a>. Danach werden die Javascript-Dateien in einen Ordner gespeichert und in die HTML-Datei eingebunden. Ich habe die Javascripts in den Ordner &#8220;js&#8221; gespeichert. Man sollte unbedingt darauf achten, dass Prototype <strong>VOR</strong> script.aculo.us eingebunden wird.</p>
<p>So bindet man die beiden Bibliotheken ein:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;script src=&quot;/js/prototype.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;/js/scriptaculous.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
</pre>
<p>Nachdem das Grundgerüst steht, kann ich mit der MySQL Datenbank anfangen. Dazu lege ich mir eine Tabelle mit folgendem Code an:</p>
<pre class="brush: sql; title: ; notranslate">
CREATE TABLE `sortable_ajax_list` (
`ID` TINYINT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`list_value` VARCHAR(64) NOT NULL ,
`sort_order` TINYINT(4) NOT NULL
) ENGINE = MYISAM
</pre>
<p>Ich erkläre kurz die Bedeutung der einzelnen Felder. ID wird benutzt um einen eindeutigen Bezeichner für jeden Datensatz zu haben. Dieser Wert erhöht sich durch das AUTO_INCREMENT automatisch um eins, sobald ein neuer Datensatz angelegt wird. Gleichzeitig ist ID auch der Primary Key. Im Feld list_value speichere ich den Wert des Listenelements und in sort_order wir die Sortierreihenfolge festgehalten.</p>
<p>Damit sind die beiden Bibliotheken eingebunden und Die MySQL Tabelle angelegt. Als nächstes werde ich eine HTML-Liste mit einem kleinen Stück PHP-Code generieren. Der Code soll die aktuelle Bezeichnung und die Reihenfolge der Listenelemente aus der Datenbank laden und entsprechend darstellen.</p>
<p>Aber vorher will ich noch eine kleine Konfigurationsdatei für alle weitern PHP-Scripts anlegen. In dieser Datei werden die Logindaten für die Datenbank eingetragen und die Verbindung hergestellt. Diese Datei nenne ich config.php und speichere sie in meinem Stammverzeichnis ab. </p>
<pre class="brush: php; title: ; notranslate">&lt;?

####
# Konfigurationsdaten für die Datenbank
####

$dbhost = 'localhost';
$dbuser = 'benutzer';
$dbpass = 'passwort';
$dbname = 'meine_db';

$connection = mysql_connect($dbhost, $dbuser, $dbpass); // Stellt die Verbindung zur Datenbank her

mysql_select_db($dbname, $connection); // Wählt die entsprechende Datenbank aus
?&gt;
</pre>
<p>Nachdem ich jetzt meine Konfiguration fertig habe, kann ich sie in die HTML-Datei einbinden. Auch kann ich meine MySQL-Datenbank abfragen und so die Liste erzeugen. Das sieht nun so aus:</p>
<pre class="brush: php; title: ; notranslate">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;title&gt;Sortable List in Ajax&lt;/title&gt;
&lt;script src=&quot;js/prototype.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/scriptaculous.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;ul id=&quot;ajax_liste&quot;&gt;

&lt;?php
	include_once('config.php'); //Konfigurationsdatei einbinden

    $result = mysql_query(&quot;SELECT * FROM sortable_ajax_list ORDER BY sort_order&quot;); // Anfrage an die Datenbank stellen und Ausgabe sortieren

    while($data = mysql_fetch_array($result))
    {
		echo '&lt;li id=&quot;item_'. $data[ID] .'&quot;&gt;'. $data[list_value] .'&lt;/li&gt;';
		echo &quot;\n&quot;;
	}
?&gt;

&lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Jetzt, wo die Liste vom PHP-Code generiert wurde, soll sie auch noch sortierbar sein und sich ihren Zustand merken. Das Speichern soll nicht &#8220;spürbar&#8221; sein und darum machen wir den Request mit Ajax.Request von Prototype. Die Aktualisierung soll nach jeder Änderung der Reihenfolge vorgenommen werden. Darum setze ich den Request in die onUpdate Methode und übermittle an die PHP-Datei &#8220;sort_function.php&#8221; die serialisierten Daten der Liste. Der Code dafür sieht so aus:</p>
<pre class="brush: jscript; title: ; notranslate">&lt;script type=&quot;text/javascript&quot;&gt;
Sortable.create(&quot;ajax_liste&quot;,
	{
	onUpdate:function()
		{
		new Ajax.Request('sort_function.php',
			{
			method: &quot;post&quot;,
			parameters: {data: Sortable.serialize(&quot;ajax_liste&quot;)}
			});
		}
	});
&lt;/script&gt;</pre>
<p><strong>Wichtig:</strong> Das Javascript muss im HTML-Code <strong>NACH</strong> der Liste kommen, sonst wird es nicht angewendet. Als nächstes brauche ich die Funktion zum Speichern der Reihenfolge. Diese schreibe ich in die Datei &#8220;sort_function.php&#8221; und speichere sie in meinem Stammverzeichnis. Das ganze sieht so aus:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
include_once('config.php');

parse_str($_POST['data']);

for ($i = 0; $i &lt; count($ajax_liste); $i++) {
	if(is_int($i)) {
		mysql_query(&quot;UPDATE sortable_ajax_list SET sort_order = $i WHERE ID = $ajax_liste[$i]&quot;);
	}
	else {
	exit;
	}
}

?&gt;</pre>
<p>Man sollte beachten, dass in diesem Codestück nur wenig Überprüfung der übermittelten Daten erfolgt. Das kann unter Umständen missbraucht werden, um schädlichen Code einzuschleusen. Also ist es wichtig, die Daten zuerst genauer zu prüfen und dann zu speichern.</p>
<p>Jetzt ist alles fertig und die Liste kann sortiert und ihr Zustand gespeichert werden. </p>
<p>Kommentare und Verbesserungsvorschläge sind erwünscht. </p>
<p>Bis zum nächsten Tutorial,</p>
<p>Patrick</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.service2max.ch/sortierbare-liste-mit-drag-drop-in-ajax-tutorial/feed/</wfw:commentRss>
		<slash:comments>52</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced (User agent is rejected)
Database Caching using disk: basic
Object Caching 394/435 objects using disk: basic

Served from: blog.service2max.ch @ 2012-02-07 22:24:08 -->
