<?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</title>
	<atom:link href="http://jg-webdesign.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://jg-webdesign.de</link>
	<description>Programmierer / freier Journalist / Buchautor - Ihr professioneller Diensleister seit 1995</description>
	<lastBuildDate>Sun, 03 Jan 2010 14:31:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>barrierefreie autovervollständigung</title>
		<link>http://jg-webdesign.de/artikel/barrierefreie-autovervollstaendigung/</link>
		<comments>http://jg-webdesign.de/artikel/barrierefreie-autovervollstaendigung/#comments</comments>
		<pubDate>Sun, 03 Jan 2010 14:20:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Artikel]]></category>

		<guid isPermaLink="false">http://jg-webdesign.de/?p=131</guid>
		<description><![CDATA[Der Inhalt für diesen Artikel folgt in den nächsten 1-2 Wochen.
Das Beispiel aus dem Artikel &#8220;Autovollkommen&#8221;, erschienen im Webstandards Magazin, kann unter der folgenen URL eingesehen werden:
http://jg-webdesign.de/jg-data/artikel/webstandardsmagazin/0409/
]]></description>
			<content:encoded><![CDATA[<p>Der Inhalt für diesen Artikel folgt in den nächsten 1-2 Wochen.</p>
<p>Das Beispiel aus dem Artikel &#8220;Autovollkommen&#8221;, erschienen im <a href="http://www.webstandards-magazin.de/index.php/news/49/15">Webstandards Magazin</a>, kann unter der folgenen URL eingesehen werden:</p>
<p><a href="http://jg-webdesign.de/jg-data/artikel/webstandardsmagazin/0409/">http://jg-webdesign.de/jg-data/artikel/webstandardsmagazin/0409/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jg-webdesign.de/artikel/barrierefreie-autovervollstaendigung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Virtuelle Hosts lokal bequem einrichten</title>
		<link>http://jg-webdesign.de/programmierung/virtuelle-hosts-lokal-bequem-einrichten/</link>
		<comments>http://jg-webdesign.de/programmierung/virtuelle-hosts-lokal-bequem-einrichten/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 17:59:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programmierung]]></category>

		<guid isPermaLink="false">http://jg-webdesign.de/?p=102</guid>
		<description><![CDATA[Zur Organisation der lokalen Entwicklungsumgebung bei Webprojekten, zählt auch der Einsatz von virtuellen Servern (Hosts). Damit läßt sich für jedes Projekt ein eigener Server mit individuellem Startverzeichnis und speziellen Eigenschaften betreiben. 
Kurze Einführung zu Apache 2 unter Windows
Um Apache 2 unter Windows zu betreiben gibt es unterschiedliche Ansätze. Zunächst gibt es den Server zum direkten [...]]]></description>
			<content:encoded><![CDATA[<p>Zur Organisation der lokalen Entwicklungsumgebung bei Webprojekten, zählt auch der Einsatz von virtuellen Servern (Hosts). Damit läßt sich für jedes Projekt ein eigener Server mit individuellem Startverzeichnis und speziellen Eigenschaften betreiben. </p>
<p><strong>Kurze Einführung zu Apache 2 unter Windows</strong></p>
<p>Um Apache 2 unter Windows zu betreiben gibt es unterschiedliche Ansätze. Zunächst gibt es den Server zum <a href="http://httpd.apache.org/download.cgi">direkten Download</a> von den Seiten der <a href="http://httpd.apache.org">Apache Software Foundation</a>.  In dieser Variante fehlen Ihnen aber noch die weiteren Zutaten wie Datenbank (z.B. mySQL, etc.) und Interpreter (z.B. Perl, PHP, etc.), diese müssen von Hand installiert werden. <span id="more-102"></span></p>
<p>Einfacher wird es mit Komplettpaketen wie <a href="http://www.wampserver.com/en/">WampServer</a>, <a href="ttp://www.apachefriends.org/de/xampp.html">XAMP</a> oder der <a href="http://www.zend.com/de/products/server/">Zend Server Community Edition</a>. Diese Pakete installieren mit wenigen Mausklicks eine komplette Enwicklungsumgebung mit Datenbank, Interpretersprachen, und vieles mehr. </p>
<p>Um einen virtuellen Host einzurichten müssen Sie die gewünschte Konfiguration in der Datei <code>/conf/httpd.conf</code> des Apache Webserver einfügen. Früher wurden diese Angaben am Ende der Datei untergebracht. Mittlerweile wird dazu die Datei <code>/conf/extra/httpd-vhosts.conf</code> verwendet. Damit dies korrekt funktioniert müssen Sie in der <code>httpd.conf</code> an entsprechender Stelle diese Datei referenzieren, indem Sie die Kommentarauszeichnung (<code>#</code>) davor entfernen. Suchen Sie dazu nach der folgenden Zeile:</p>
<p><code>Include conf/extra/httpd-vhosts.conf</code></p>
<p>Eine einfache Konfiguration eines virtuellen Hosts könnte sich beispielsweise wie folgt darstellen:</p>
<pre class="brush: plain; gutter: false;">
NameVirtualHost mein.server
&lt;VirtualHost 127.0.0.1&gt;
   DocumentRoot C:\Programme\Zend\Apache2\htdocs
   ServerName mein.server
   ServerAlias mein.server
&lt;/VirtualHost&gt;
</pre>
<p>Diese Einstellung besagt, dass beim Aufruf von &#8220;http://mein.server&#8221; die Webanwendung aus dem Verzeichnis der Eigenschaft <code>DocumentRoot </code> geladen wird. Für weitere Details zu den möglichen Einstellungen eines virtuellen Hosts möchte ich Sie auf die deutsche Dokumentation von Apache verweisen: <a href="http://httpd.apache.org/docs/2.2/de/vhosts/">http://httpd.apache.org/docs/2.2/de/vhosts/</a>.</p>
<p>Damit Sie einen virtuellen Host aufrufen können, müssen Sie den Servernamen in der <code>hosts</code>-Datei im Verzeichnis <code>C:\WINDOWS\system32\drivers\etc\</code> für Windows bekannt machen.  Dazu fügen Sie an das Ende der Datei die IP-Adresse und den dazugehörenden Namen für die Adressauflösung im System ein:</p>
<pre class="brush: plain; gutter: false;">
127.0.0.1       mein.server
</pre>
<p>Sie sollten nun auf Ihren neuen Entwicklungsserver mit der URL &#8220;http://mein.server&#8221; zugreifen können.  Beachten Sie, dass bei jeder Änderung der Apache Konfiguration der Webserver neu gestartet werden muss, damit diese wirksam wird. </p>
<p><strong>jogWinVhostBatch.bat</strong></p>
<p>Wenn man häufig neue virutelle Server anlegen muss, kann diese Aufgabe sehr lästig werden. Aus diesem Grund habe ich ein kleines Batch-Programm geschrieben, das mir diese Arbeit etwas erleichtert.  Das Tool hängt in der <code>httpd-vhosts.conf</code> einen neuen Eintrag an, welcher über ein Template zuvor bestimmt wird. Außerdem wird in der <code>hosts</code>-Datei von Windows der Nameserver ans Ende der Datei eingetragen. Und zu guter Letzt, werden beide Dateien zur weiteren Bearbeitung, bzw. Kontrolle geöffnet.  </p>
<p>Die Konfiguration des Batch-Tools erfolgt innerhalb von <code>jogWinVhostBatch.bat</code> anhand der folgenden Variablen:</p>
<pre class="brush: plain; gutter: false;">
  set TEMPL=vhost.txt
  set VHOST=C:\...\httpd-vhosts.conf
  set HOSTS=C:\WINDOWS\system32\drivers\etc\hosts
  set VHOST_KOMMENTAR=ZF Test Projekt
  set VIRTUAL_HOST=bsp.tld
  set ROOT_DIR=C:\testdomains\bsp.tld\public
</pre>
<p>Die Variablen <code>TEMPL</code>, <code>VHOST</code> und <code>HOSTS</code> verweisen auf den Systempfad der entsprechenden Dateien. Die restlichen Variablen werden mit den Platzhaltern in der Template-Datei ausgetauscht, die wie folgt vereinbart wurden:</p>
<p><code>{VARIABLEN_NAME}</code></p>
<p>Die Variable <code>VIRTUAL_HOST</code> hat die Besonderheit, dass ihr Inhalt als Nameserver in die <code>hosts</code>-Datei von Windows geschrieben wird. Achtung, der letzte Eintrag in dieser Datei muss eine neue Zeile sein, andernfalls wird beim ersten Ausführen der Batch-Datei der neue Eintrag in die gleiche Zeile ans Ende gesetzt. Beim nächsten Eintrag erfolgt ein korrekter Zeilenumbruch.</p>
<p>Mit Hilfe der Template-Datei können Sie Ihre eigene Konfiguration eines virtuellen Hosts bestimmen und beliebige Variablen nach diesem Muster einfügen. In der Standardvariante werden die Variablen <code>VHOST_KOMMENTAR</code>, <code>VIRTUAL_HOST</code> und <code>ROOT_DIR</code> ersetzt. Falls Sie eigene, bzw. zusätzliche Variablen verwenden möchten, müssen Sie pro zu ersetzende Variable den folgenden Befehl an geeigneter Stelle der Batch-Datei eintragen </p>
<pre class="brush: plain; gutter: false;">call :FncReplaseString &quot;{VARIABLEN_NAME}&quot;  &quot;%VARIABLEN_NAME%&quot;  %VHOST%</pre>
<p>Damit wird der Suchen&#038;Ersetzen Algorithmus aufgerufen und ausgeführt.</p>
<h2>Download</h2>
<p>Dieses kleine Batch-Tool wird kostenlos und ohne Einschränkung zum Download angeboten. Die Verwendung erfolgt auf eigene Gefahr, eine Gewährleistung wird nicht übernommen. </p>
<p><strong>Download Version 1.0:</strong> <a href="/jg-data/sh/jogWinVhostBatch.zip" target="_blank">jogWinVhostBatch.zip</a> (~2kb)</p>
<h2>Historie</h2>
<p>Version 1.0 &#8211; 30.10.2009</p>
]]></content:encoded>
			<wfw:commentRss>http://jg-webdesign.de/programmierung/virtuelle-hosts-lokal-bequem-einrichten/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zend Tool im Zend Studio 7</title>
		<link>http://jg-webdesign.de/zend/zend-tool-im-zend-studio-7/</link>
		<comments>http://jg-webdesign.de/zend/zend-tool-im-zend-studio-7/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 23:08:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Studio]]></category>

		<guid isPermaLink="false">http://jg-webdesign.de/?p=61</guid>
		<description><![CDATA[Die Pflege eines Projekts, welches mit Hilfe des Zend Framework erstellt wird, ist von Hand schon ziemlich lästig. Möchte man beispielsweise einen neuen Controller anlegen, muss man eine entsprechende PHP-Datei und eine Datei für den dazugehörigen View erzeugen. Noch umständlicher wird es, wenn man ein neues Modul anlegen muss, da hier diverse Verzeichnisse zu erzeugen [...]]]></description>
			<content:encoded><![CDATA[<p>Die Pflege eines Projekts, welches mit Hilfe des <a href="http://framework.zend.com">Zend Framework</a> erstellt wird, ist von Hand schon ziemlich lästig. Möchte man beispielsweise einen neuen Controller anlegen, muss man eine entsprechende PHP-Datei und eine Datei für den dazugehörigen View erzeugen. Noch umständlicher wird es, wenn man ein neues Modul anlegen muss, da hier diverse Verzeichnisse zu erzeugen sind. Alles lästige Aufgaben im Filesystem.</p>
<p>Das Zend Studio hilft diese Aufgabe etwas bequemer zu erledigen. Seit der Version 1.8 des Zend Frameworks gibt es das <a href="http://framework.zend.com/manual/de/zend.tool.project.html">Projekt &#8220;Zend Tool&#8221;</a> mit desse Hilfe man über die Kommandozeile ein entsprechendes Projekt verwalten kann. In Verbindung mit dem Zend Server wird diese Option zudem automatisch mit installiert, ohne das ein manuelle Konfiguration nötig ist.<br />
<span id="more-61"></span><br />
Was vielleicht nicht jeder weiß ist, dass man mit dem <a href="http://www.zend.com/de/products/studio/">Zend Studio 7</a> das &#8220;Zend Tool&#8221; über das Menü &#8220;<code>Project → Zend Tool</code>&#8221; direkt aufrufen kann. Noch einfacher über die Tastenkombination &#8220;<code>CTRL+2</code>&#8220;, worauf sich das folgende Fenster öffnet.</p>
<div id="attachment_63" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-63" title="zend-tool" src="http://jg-webdesign.de/wp-content/uploads/2009/10/zend-tool-300x213.png" alt="Integrierte Kommandozeile zum Zend Tool" width="300" height="213" /><p class="wp-caption-text">Integrierte Kommandozeile zum Zend Tool</p></div>
<p>Hier kann man nun mit entsprechenden Eingaben die gewünschten Aktionen ausführen. Für manche Optionen wird eine Hilfe mit kurzer Beschreibung eingeblendet. Zahlreiche Möglichkeiten sind bisher noch nicht dokumentiert oder funktionieren derzeit nicht. Im folgenden beschreibe ich einige der wichtigsten Befehle für das schnelle Arbeiten mit dem Zend Framework.</p>
<p><strong>zf create project PROJEKTNAME</strong></p>
<p>Mit diesem Befehl wird ein neues Projekt im aktuellen Arbeitsbereich erstellt. Dabei werden die Standardverzeichnisse und -dateien eines typischen Zend Framework Projekts anglegt:</p>
<pre><code>
├───application
│   │   Bootstrap.php
│   │
│   ├───configs
│   │       application.ini
│   │
│   ├───controllers
│   │       ErrorController.php
│   │       IndexController.php
│   │
│   ├───models
│   └───views
│       ├───helpers
│       └───scripts
│           ├───error
│           │       error.phtml
│           │
│           └───index
│                   index.phtml
│
├───library
├───public
│       .htaccess
│       index.php
│
└───tests
    │   phpunit.xml
    │
    ├───application
    │       bootstrap.php
    │
    └───library
            bootstrap.php
</code></pre>
<p>Das alles will man sicher nicht von Hand anlegen ;o) Für die weitere Arbeit müssen Sie in das aktuelle Projekt mit dem Befehl <code>cd PROJEKTNAME</code> wechseln. Dies wird mit der Meldung <code>context was set to /PROJEKTNAME</code> bestätigt.</p>
<p><strong>zf create controller CONTROLLERNAME</strong></p>
<p>Hiermit wird ein neuer Controller, die dazugehörige View sowie eine Test-Datei im aktuellen Projekt erzeugt. Ein Auszug aus der daraus resultierenden Verzeichnisstruktur soll dies verdeutlichen:</p>
<pre><code>
│   ├───controllers
│   │       <span style="color:#ff0000;">TestController.php</span>
│   └───views
│       └───scripts
│           ├───<span style="color:#ff0000;">test</span>
│           │       <span style="color:#ff0000;">test.phtml</span>
│
└───tests
    ├───application
    │   └───controllers
    │           <span style="color:#ff0000;">TestControllerTest.php</span>
</code></pre>
<p>Der neue Controller kann anschließend sofort ausgeführt werden, da eine leere Index-Action mit angelegt wird. Die entsprechende View wird per Default mit folgendem Inhalte gefüllt:</p>
<pre class="brush: xml; gutter: false;">
&lt;br /&gt;&lt;br /&gt;&lt;center&gt;View script for controller &lt;b&gt;Test&lt;/b&gt; and script/action name &lt;b&gt;index&lt;/b&gt;&lt;/center&gt;
</pre>
<p>Warum dazu das veraltete und in XHTML nicht mehr vorhandene <code>center</code>-Tag verwendet weiß ich nicht. Da hätte man dann auch gleich das <code>blink</code>-Tag wieder aufleben lassen können ;o)</p>
<p><strong>zf add action ACTIONNAME CONTROLLERNAME</strong></p>
<p>Dieser Befehl erzeugt eine neue Action im referenzierten Controller und legt zugleich ein entsprechendes Template im View-Ordner an. Der Inhalt des Controllers stellt sich anschließend wie folgt dar:</p>
<pre class="brush: php; gutter: false;">
&lt;?php

class TestController extends Zend_Controller_Action
{

    public function init()
    {
        /* Initialize action controller here */
    }

    public function indexAction()
    {
        // action body
    }

    public function ACTIONNAMEAction()
    {
        // action body
    }

}
</pre>
<p>Dieser Befehl muss für jede weitere Action erneut ausgeführt werden. Dabei fügt &#8220;Zend Tool&#8221; die entsprechende Method jeweils ans Ende im angegebenen Controller ein.</p>
<p><strong>zf create view ACTIONNAME VIEWNAME</strong></p>
<p>Mit dieser Angabe erstellen Sie ein View ohne zugleich einen Controller anzulegen.</p>
<p><strong>zf create module MODULLNAME</strong></p>
<p>Dieser Befehl erzeugt ein neues Modul im Verzeichnis <code>/modules</code> mit der folgenden Verzeichnisstruktur:</p>
<pre><code>
│   ├───modules
│   │   ├───Test
│   │   │   ├───controllers
│   │   │   ├───models
│   │   │   └───views
│   │   │       ├───filters
│   │   │       ├───helpers
│   │   │       └───scripts
</code></pre>
<p>Falls das Verzeichnis <code>/modules</code> bisher nicht vorhanden war, wird es beim ersten Aufruf des Befehls mit angelegt.</p>
<p><strong>Anmerkung</strong></p>
<p>Das waren aus meiner Sicht die wichtigsten und zugleich nützlichsten Befehle, welche in der aktuellen Version von &#8220;Zend Tool&#8221; angeboten werden. Die weitere Entwicklung zu diesem praktischen Werkzeug sollte man auf jeden Fall im Auge behalten.  Die Supportseite für das &#8220;Zend Tool&#8221;  findet man unter der URL <a href="http://framework.zend.com/issues/browse/ZF-6571">http://framework.zend.com/issues/browse/ZF-6571</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://jg-webdesign.de/zend/zend-tool-im-zend-studio-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arbeitsbereiche im Zend Studio</title>
		<link>http://jg-webdesign.de/zend/arbeitsbereiche-im-zend-studio/</link>
		<comments>http://jg-webdesign.de/zend/arbeitsbereiche-im-zend-studio/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 21:54:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Studio]]></category>

		<guid isPermaLink="false">http://jg-webdesign.de/?p=41</guid>
		<description><![CDATA[Bis zur Version 6.x des Zend Studios war ich nicht ganz so begeistert von dieser auf Eclipse basierenden IDE. Mir persönlich hatte das alte Zend Studio wesentlich besser gefallen. Mit der Version 7 in Verbindung mit dem Zend Server habe ich meine Meinung aber wieder geändert. Kurzum, ich bin aktuell rundum zufrieden. 
Ein Problem hatte [...]]]></description>
			<content:encoded><![CDATA[<p>Bis zur Version 6.x des <a href=“http://www.zend.com/de/products/studio/“>Zend Studios</a> war ich nicht ganz so begeistert von dieser auf Eclipse basierenden IDE. Mir persönlich hatte das alte Zend Studio wesentlich besser gefallen. Mit der Version 7 in Verbindung mit dem <a href=“http://www.zend.com/de/products/server/“>Zend Server</a> habe ich meine Meinung aber wieder geändert. Kurzum, ich bin aktuell rundum zufrieden. </p>
<p>Ein Problem hatte ich aber noch.<br />
<span id="more-41"></span> Da ich meine Projekte lokal unterschiedlich organisiere, fehlte mir noch die Möglichkeit, z.B. ein auf dem <a href=“http://framework.zend.com/“>Zend Framework</a> basierendes Projekt an einer bestimmte Stelle auf dem Dateisystem zu speichern. Zend Studio organisiert seine Projekte in sogenannte Arbeitsbereiche in einem bei der Installation vorgegebenen Verzeichnis. Möchte man nun sein eigenes Standardverzeichnis verwenden, kann dies mit der Option &#8220;Create project from existing source&#8221; auswählen werden. Dies hat jedoch den Nachteil, dass bei einem ZF Projekt die Grundstruktur nicht automatisch mit angelegt wird. </p>
<p><strong>Achtung: Falls man ein auf diese Art angelegtes Projekt in Zend Studio löscht, wird auch das übergeordnete Hautverzeichnis mit gelöscht!</strong></p>
<p>Eine auf den ersten Blick unscheinbare Option in den Einstellungen &#8220;<code>Window → Preferences</code>&#8221; des Zend Studios  ermöglicht es<br />
dem Anwender, beim Start einen neuen Arbeitsbereich anzugeben bzw. auszuwählen. Im Bereich &#8220;<code>General → Startup and Shutdown → Workspaces</code>&#8221; müssen Sie die Option &#8220;<code>Prompt for workspace on startup</code>&#8221; aktivieren. Die direkte Eingabe eines neuen Arbeitsbereiches ist in dieser Maske nicht möglich.</p>
<div id="attachment_43" class="wp-caption aligncenter" style="width: 310px"><img src="http://jg-webdesign.de/wp-content/uploads/2009/10/zend-workspace-1-300x264.png" alt="Zend Studio Workspace Einstellungen" title="zend-workspace-1" width="300" height="264" class="size-medium wp-image-43" /><p class="wp-caption-text">Zend Studio Workspace Einstellungen</p></div>
<p>Über &#8220;<code>File → Switch Workspace → ...</code>&#8221; kann man zwischen den Arbeitsbereichen umschalten. Dazu wird das Zend Studio neu geladen, da Eclipse intern über einen entsprechenden Parameter für den Arbeitsbereich gestartet wird.</p>
<div id="attachment_42" class="wp-caption aligncenter" style="width: 310px"><img src="http://jg-webdesign.de/wp-content/uploads/2009/10/zend-workspace-2-300x123.png" alt="Zend Studio Workspace wählen" title="zend-workspace-2" width="300" height="123" class="size-medium wp-image-42" /><p class="wp-caption-text">Zend Studio Workspace wählen</p></div>
<p>Arbeitsbereiche sind sehr praktisch, um Projekte in unterschiedlichen Ordnern zu organisieren. Alle Einstellungen der IDE werden für den jeweiligen Arbeitsbereich separat vorgenommen. Falls man für längere Zeit in einem bestimmten Arbeitsbereich arbeitet, kann man die Option &#8220;<code>Prompt for workspace on startup</code>&#8221; wieder deaktivieren oder die entsprechende Option im Startfenster aktiveren. </p>
]]></content:encoded>
			<wfw:commentRss>http://jg-webdesign.de/zend/arbeitsbereiche-im-zend-studio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>1</slash:comments>
		</item>
	</channel>
</rss>
