<?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>Johannes Gamperl &#187; Allgemein</title>
	<atom:link href="http://jg-webdesign.de/category/allgemein/feed/" rel="self" type="application/rss+xml" />
	<link>http://jg-webdesign.de</link>
	<description>Programmierer / freier Journalist / Buchautor - Ihr professioneller Dienstleister seit 1995</description>
	<lastBuildDate>Sun, 03 Jan 2010 14:31:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Voneinander abhängige Selectboxen</title>
		<link>http://jg-webdesign.de/allgemein/voneinander-abhaengige-selectboxen/</link>
		<comments>http://jg-webdesign.de/allgemein/voneinander-abhaengige-selectboxen/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 18:05:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://jg-webdesign.de/?p=1</guid>
		<description><![CDATA[Im Rahmen eines Projekts hatte ich im Backoffice die Anforderung, Abhängigkeiten mit Hilfe unterschiedlicher select-Elemente darzustellen. Ziel war es, dass der jeweils ausgewählte Inhalt eines Elements das nächste Element mit den dazu passenden Inhalten füllt. Das neu gefüllte Element ergänzt wiederum das nächste Element mit den passenden Inhalte usw. Das Folgeelement steht somit jeweils in [...]]]></description>
			<content:encoded><![CDATA[<p>Im Rahmen eines Projekts hatte ich im Backoffice die Anforderung, Abhängigkeiten mit Hilfe unterschiedlicher select-Elemente darzustellen. Ziel war es, dass der jeweils ausgewählte Inhalt eines Elements das nächste Element mit den dazu passenden Inhalten füllt. Das neu gefüllte Element ergänzt wiederum das nächste Element mit den passenden Inhalte usw. Das Folgeelement steht somit jeweils in Abhängigkeit zu dem vorangegangenen Element.<br />
<span id="more-1"></span><br />
Für diese Aufgabe sollten eigentlich zahlreiche Snippets im Web zu finden sein. Eine Suche führte mich zu zahlreiche Scripten, welche zwei select-Elemente mit einander verbanden. Weitaus weniger fand ich für drei miteinander verbundenen select-Elementen und dann hörte es schon auf. Was fast alle dieser Skripten gemeinsam haben, ist die umständliche Art und Weise, wie die Datensätze für die select-Elemente vorgehalten werden &#8211; meist mittels unübersichtlicher Array-Strukturen.</p>
<h2>jog.Form.NestedSelect()</h2>
<p>Kurzum, nachdem ich keine für mich brauchbaren Beispiele fand, habe ich selbst ein Objekt für diese Aufgabe geschrieben. Es hört auf den Namen <code>NestedSelect</code> und ist im Namespace <code>jog.Form</code> gefangen. Mit diesem Objekt ist es möglich, beliebig tief verschachtelte select-Elemente darzustellen. Als Datenquelle wird eine einfache Baumstruktur verwendet. Die Beziehung der Einträge zueinander wird dabei über die Eigenschaften <code>id</code> und <code>pid</code> gesteuert. Der Einsatz des <a href="http://de.wikipedia.org/wiki/Nested_Sets">&#8220;Nested-Set&#8221;-Models</a> erschien mir für diesen Zweck nicht nötig.</p>
<h3>Konstruktor</h3>
<p>Ein neues Objekt wird wie folgt instanziiert:</p>
<pre class="brush: jscript; gutter: false;">
new jog.Form.NestedSelect({options})
</pre>
<p>Die möglichen Eigenschaften werden über ein Objek-Literal vereinbart. Diese Klasse besitzt die folgenden Eigenschaften:</p>
<pre class="brush: jscript; gutter: false;">
{
	'prefix' : 'string',
	'db'     : [array],
	'sText'  : 'string',
	'sEmpty' : 'string'
}
</pre>
<h4>prefix</h4>
<p>Mit dieser Eigenschaft übergeben Sie das Prefix der Element-IDs ihrer gruppierten select-Elemente. Diese Elemente müssen nach einem vorgegebenen Muster aufgebaut sein. Dies ist die Prefix und eine nummerierte Reihenfolge <code>1...n</code>. Die name-Attribute dieser Elemente müssen ebenfalls mit der gleichen Prefix als Array benannt werden. Beachten Sie dabei auch die Groß-/Kleinschreibung.</p>
<pre class="brush: xml; gutter: false;">
&lt;select id=&quot;bsp1&quot; name=&quot;bsp[]&quot;&gt;&lt;/select&gt;
&lt;select id=&quot;bsp2&quot; name=&quot;bsp[]&quot;&gt;&lt;/select&gt;
...
</pre>
<p>Die Auszeichnung mittels einem id-Attribut hat den Vorteil, dass die Elemente an beliebiger Stelle und in willkürlicher Reihenfolge gesetzt werden können. Sie stehen trotzdem miteinander in logischer Verbindung.</p>
<h4>db</h4>
<p>Die Beziehungen der jeweiligen select-Elemente werden über die Ebenen der Baumstruktur hergestellt. Das folgende Beispiel stellt eine Baumstruktur mit einer Tiefe von drei Ebenen dar. Dies bedeutet, dass es ein &#8220;select-Set&#8221; mit drei Elementen geben wird.</p>
<pre class="brush: plain; gutter: false;">
	Nr. 1
		Nr. 1.1
			Nr. 1.1.1
			Nr. 1.1.2
			Nr. 1.1.3
		Nr. 1.2
		Nr. 1.3
	Nr. 2
		Nr. 2.1
	Nr. 3
</pre>
<p>Die Eigenschaft db bildet diesen Baum über ein einfaches Modell ab, wobei die Beziehung der Elemente über die Eigenschaft pid hergestellt wird. In <code>pid</code> wird die id des Eltern-Elements angegeben. Auf diese Weise entsteht eine <a href="http://de.wikipedia.org/wiki/Liste_%28Datenstruktur%29#Einfach_verkettete_Liste">einfach verkettete Liste</a>.</p>
<pre class="brush: jscript; gutter: false;">
	'db' : [
		{ 'id' : 1, 'pid' : 0, 'title' : 'Nr. 1'     },
		{ 'id' : 2, 'pid' : 1, 'title' : 'Nr. 1.1'   },
		{ 'id' : 3, 'pid' : 2, 'title' : 'Nr. 1.1.1' },
		{ 'id' : 4, 'pid' : 2, 'title' : 'Nr. 1.1.2' },
		{ 'id' : 5, 'pid' : 1, 'title' : 'Nr. 1.2'   },
		{ 'id' : 6, 'pid' : 1, 'title' : 'Nr. 1.3'   },
		{ 'id' : 7, 'pid' : 0, 'title' : 'Nr. 2'     },
		{ 'id' : 8, 'pid' : 0, 'title' : 'Nr. 3'     },
		{ 'id' : 9, 'pid' : 7, 'title' : 'Nr. 2.1'   }
	]
</pre>
<h4>sText und sEmpty</h4>
<p>Mit Hilfe dieser Eigenschaften können Sie den Standardtext für die jeweils erste Option der select-Elemente bestimmen. Per Default ist für <code>sText</code> der String &#8220;&#8211;SELECT&#8211;&#8221; und für <code>sEmpty</code> die Zeichenkette &#8220;&#8211;EMPTY&#8211;&#8221; eingerichtet.</p>
<h2>Beispiel</h2>
<p>Die folgenden Beispiele zeigen die unabhängige Verwendung dieser Klasse mit zwei unterschiedlichen &#8220;select-Sets&#8221;. Wie Sie erkennen können, ist es damit möglich, beliebig viele unabhängige verkettete select-Elemente zu erzeugen.</p>
<form>
<p><select id="a1" name="a[]" style="width:100px;"></select>
<select id="a2" name="a[]" style="width:100px;"></select>
<select id="a3" name="a[]" style="width:100px;"></select>
</p>
<p><select id="b1" name="b[]" style="width:100px;"></select>
<select id="b2" name="b[]" style="width:100px;"></select>
</p>
</form>
<p><script src="/jg-data/js/jog.Form.NestedSelect.js" type="text/javascript"></script><br />
<script type="text/javascript">
var a = new jog.Form.NestedSelect({
	'prefix' : 'a',
	'db' : [
		{ 'id' : 1, 'pid' : 0, 'title' : 'Nr. 1' },
		{ 'id' : 2, 'pid' : 1, 'title' : 'Nr. 1.1' },
		{ 'id' : 3, 'pid' : 2, 'title' : 'Nr. 1.1.1' },
		{ 'id' : 4, 'pid' : 2, 'title' : 'Nr. 1.1.2' },
		{ 'id' : 5, 'pid' : 1, 'title' : 'Nr. 1.2' },
		{ 'id' : 6, 'pid' : 1, 'title' : 'Nr. 1.3' },
		{ 'id' : 7, 'pid' : 0, 'title' : 'Nr. 2' },
		{ 'id' : 8, 'pid' : 0, 'title' : 'Nr. 3' },
		{ 'id' : 9, 'pid' : 7, 'title' : 'Nr. 2.1' }
	]
});
var b = new jog.Form.NestedSelect({
	'prefix' : 'b',
	'db' : [
		{ 'id' : 1, 'pid' : 0, 'title' : 'Auto' },
		{ 'id' : 2, 'pid' : 1, 'title' : 'Audi' },
		{ 'id' : 3, 'pid' : 1, 'title' : 'BMW' },
		{ 'id' : 4, 'pid' : 1, 'title' : 'Opel' },
		{ 'id' : 5, 'pid' : 0, 'title' : 'Farbe' },
		{ 'id' : 6, 'pid' : 5, 'title' : 'Grün' },
		{ 'id' : 7, 'pid' : 5, 'title' : 'Rot' }
	]
});
</script></p>
<p>Der Quellcode aus diesem Beispiel stellt sich wie folgt dar:</p>
<pre class="brush: jscript; html-script: true;">
&lt;form&gt;
&lt;p&gt;
	&lt;select id=&quot;a1&quot; name=&quot;a[]&quot; style=&quot;width:100px;&quot;&gt;&lt;/select&gt;
	&lt;select id=&quot;a2&quot; name=&quot;a[]&quot; style=&quot;width:100px;&quot;&gt;&lt;/select&gt;
	&lt;select id=&quot;a3&quot; name=&quot;a[]&quot; style=&quot;width:100px;&quot;&gt;&lt;/select&gt;
&lt;/p&gt;
&lt;p&gt;
	&lt;select id=&quot;b1&quot; name=&quot;b[]&quot; style=&quot;width:100px;&quot;&gt;&lt;/select&gt;
	&lt;select id=&quot;b2&quot; name=&quot;b[]&quot; style=&quot;width:100px;&quot;&gt;&lt;/select&gt;
&lt;/p&gt;
&lt;/form&gt;
&lt;script src=&quot;jog.Form.NestedSelect.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
var a = new jog.Form.NestedSelect({
	'prefix' : 'a',
	'db' : [
		{ 'id' : 1, 'pid' : 0, 'title' : 'Nr. 1' },
		{ 'id' : 2, 'pid' : 1, 'title' : 'Nr. 1.1' },
		{ 'id' : 3, 'pid' : 2, 'title' : 'Nr. 1.1.1' },
		{ 'id' : 4, 'pid' : 2, 'title' : 'Nr. 1.1.2' },
		{ 'id' : 5, 'pid' : 1, 'title' : 'Nr. 1.2' },
		{ 'id' : 6, 'pid' : 1, 'title' : 'Nr. 1.3' },
		{ 'id' : 7, 'pid' : 0, 'title' : 'Nr. 2' },
		{ 'id' : 8, 'pid' : 0, 'title' : 'Nr. 3' },
		{ 'id' : 9, 'pid' : 7, 'title' : 'Nr. 2.1' }
	]
});
var b = new jog.Form.NestedSelect({
	'prefix' : 'b',
	'db' : [
		{ 'id' : 1, 'pid' : 0, 'title' : 'Auto' },
		{ 'id' : 2, 'pid' : 1, 'title' : 'Audi' },
		{ 'id' : 3, 'pid' : 1, 'title' : 'BMW' },
		{ 'id' : 4, 'pid' : 1, 'title' : 'Opel' },
		{ 'id' : 5, 'pid' : 0, 'title' : 'Farbe' },
		{ 'id' : 6, 'pid' : 5, 'title' : 'Grün' },
		{ 'id' : 7, 'pid' : 5, 'title' : 'Rot' }
	]
});
&lt;/script&gt;
</pre>
<h2>Lizenz und Download</h2>
<p>Die JavaScript-Klasse <code>jog.Form.NestedSelect.js</code> ist unter einer &#8220;<a href="http://creativecommons.org/licenses/by-nc-nd/3.0/deed.de">Creative Commons-Lizenz</a>&#8221; lizenziert. Falls Sie diese Klasse in kommerziellen Projekten nutzen möchten, setzen Sie sich bitte mit mir per <a href="mailto:info@jg-webdesign.de?subject=jog.Form.NestedSelect Lizenz">Email</a> in Verbindung.</p>
<p><strong>Download Version 1.0:</strong> <a href="/jg-data/js/jog.Form.NestedSelect.js" target="_blank">jog.Form.NestedSelect.js</a> (2kb)</p>
<p><strong>Falls Sie diese Klasse für Ihre Projekte einsetzen, würde ich mich über einen <a href="mailto:info@jg-webdesign.de?subject=jog.Form.NestedSelect Hinweis">Hinweis</a> freuen.</strong></p>
<h2>Historie</h2>
<p>Version 1.0 &#8211; 21.09.2009</p>
]]></content:encoded>
			<wfw:commentRss>http://jg-webdesign.de/allgemein/voneinander-abhaengige-selectboxen/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
