RSS Feed
Feb 17

Zeilen-Duplizierer mit AutoComplete Felder nutzen

Veröffentlich am Mittwoch, 17. Feb 2010 in Webentwicklung

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 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.

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:

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();
	}
}

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: Google Maps Suggest – Adress-Autovervollständigung mit Scriptaculous):

<form id="addressform" action="address_save.php" class="niceform">
	<fieldset>
		<legend>Choose an address</legend>
		<dl>
			<dt><label for="address">Address:</label></dt>
			<dd><input type="text" id="address" name="address[]" style="width: 300px;" /></dd>
		</dl>
	</fieldset>
	<fieldset>
		<input type="submit" value="Send!" />
	</fieldset>
</form>
<div id="adresse_choices" class="autocomplete"></div>
<script type="text/javascript">
	new Ajax.Autocompleter('address', 'adresse_choices', 'get_addresses.php');
</script>

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:

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');
}

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 "address1", "address11" usw. Das reicht aus um die Felder genau zu referenzieren.
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.

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:

<span class="add" onclick="addRow('#addressform dl', {reset : true, afterInsert: activateAutocomplete})">Adresse hinzufügen</span>

Es wird durch den Selektor "#addressform dl" die gesamte Definition inklusive des Label kopiert. Ihr könnt aber auch eine andere HTML Struktur wie z.B. eine unsortierte Liste verwenden.

Das war auch schon alles. Das Beispiel könnt ihr euch hier ansehen und auch den Quellcode dazu runterladen:

Beispiel
Download

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.

Feb 1

Internet Explorer 6 unter Windows 7 nutzen mit dem Windows XP Mode

Veröffentlich am Montag, 1. Feb 2010 in Software, Webentwicklung

Wer sich von euch jetzt fragen sollte “Wieso sollte ich den IE6 unter Windows 7 nutzen?” dem würde ich gerne “Willst du nicht!” antworten. Aber diejenigen unter uns, die Webseiten entwickeln und auch mit dem IE6 eine Website testen müssen, wird dieser Artikel wohl helfen.

Unter Windows kann ja bekanntermaßen immer nur eine Version des Internet Explorers installiert sein. Da der IE8 auch einen Kompatibilitätsmodus für den IE7 besitzt hat man so schon mal zwei Fliegen mit einer Klappe geschlagen. Aber wie soll man unter Windows 7 einen IE6 installieren. Zum Glück gibt es hier eine sehr einfache und sehr benutzerfreundliche Methode. Zum Testen des Chrome Frame für meinem letzen Artikel habe ich noch eine virtuelle Maschine mit Windows XP unter Suns VirtualBox verwendet. Es geht aber sehr viel einfacher und erfordert keine Zeitaufwändige Installation eines XP-Systems, für das man auch noch eine Lizenz benötigt. Wer also keine mehr rumliegen hat und nicht unbedingt eine XP-VM benötigt, kann sich trotzdem den IE6 für Win7 holen.

(weiterlesen…)

Jan 30

Blog oder Website fit machen für den IE6

Veröffentlich am Samstag, 30. Jan 2010 in Webentwicklung

Wie auf vielen News-Seiten zu lesen ist stellt Google ab Mitte des Jahres offiziell den Support für den Internet Explorer in der Version 6.0 ein. Unter den Besuchern meines Blog befindet sich zwar nur ein verschwindend geringer Prozentsatz an IE6 Nutzern, aber auch diese sollten meine Website einigermaßen ansehnlich präsentiert bekommen.

Das größte Problem ist oft, dass die schönen Themes nicht auf den IE6 angepasst wurden und daher zu sehr unschönen Darstellungen führen. Ich habe in einer virtuellen Maschine noch eine Installation vom Internet Explorer 6 laufen und damit mal selbst meinen Blog getestet. Das Ergebnis sah leider wie folgt aus:

Blog vor der Installation des Plugins

(weiterlesen…)

Jan 24

Arrays und andere komplexe Daten mit PHP in einer MySQL-Datenbank speichern

Veröffentlich am Sonntag, 24. Jan 2010 in Webentwicklung

Viele von euch werden wohl schon einmal vor dem Problem gestanden haben, dass sie ein Array oder ein Objekt in der Datenbank speichern mussten. Hier möchte ich ein paar Vorschläge unterbreiten, wie man das Problem nicht lösen sollte und wie es besser gehen kann.

Der schlechte Weg

Die einfachste und gleichzeitig auch schlechteste Methode wäre es, für jeden Index eines Arrays oder jede Eigenschaft eines Objekts eine neue Spalte zu erzeugen. Bei diesem Ansatz werden unter Umständen viele Zeilen erzeugt, die nicht immer einen Wert enthalten. Das ist zwar nicht so gravierend, aber durch diesen Ansatz erhöht sich auch die Anzahl der Spalten schnell auf eine unübersichtliche Anzahl. Zuletzt ist es hierbei bei jeder Änderung des Arrays oder Objekts notwendig die Datenbanktabelle anzupassen.

(weiterlesen…)

Jan 6

Microsoft tritt der W3C SVG Working Group bei

Veröffentlich am Mittwoch, 6. Jan 2010 in Webentwicklung

Wie Microsoft gestern auf seinem IEBlog mitgeteilt hat, werden sie der W3C SVG Working Group beitreten. Dies bedeutet, dass SVG für Microsoft in Zukunft einen höheren Stellenwert hat und sie sich damit nicht mehr auf VML beschränken.

Für uns als Webentwickler wird damit das Thema in Zukunft wohl interessanter werden. Bisher musste man einen Nutzer, der den Internet Explorer verwendent stets dazu nötigen sich ein Plugin von Adobe zu installieren, zu welchem aber im letzen Jahr die Weiterentwicklung eingestellt wurde.

(weiterlesen…)

Jan 4

PDF-Dokument ohne PDFlib mit PHP erzeugen

Veröffentlich am Montag, 4. Jan 2010 in Webentwicklung

Viele von euch werden wohl XAMPP benutzen, um lokal in PHP zu entwickeln und zu testen. In der Windows-Version enthält es auch die PHP-Extension PDFlib, die aber leider auf vielen Hostingpaketen mit Linux als Betriebssystem nicht enthalten ist. Da PDFlib mehrere hundert Euro Lizenzgebühren kostet stellen sich viele die Frage, ob es sinnvolle und kostenlose Alternativen gibt. Glücklicherweise gibt es Alternativen und eine sehr umfangreiche möchte ich euch kurz vorstellen.

Die kostenlose TCPDF Library

Nachdem ich ein paar kostenlose PDF Klassen für PHP getestet habe, hat sich ein klarer Sieger herausgestellt. Die Klasse TCPDF zeichnet sich nicht nur durch seinen großen Funktionsumfang, sondern auch durch seine sehr gute Quellcode-Kommentierung und die gute Dokumentation der Funktionen.

(weiterlesen…)

Okt 20

Große Rechtschreibreform im WWW: HTML 5 heißt jetzt HTML5

Veröffentlich am Dienstag, 20. Okt 2009 in Webentwicklung

Manche werden sich jetzt vermutlich wundern, was mit dem Titel gemeint ist. Heute haben sich die beiden Organisationen WHATWG (Web Hypertext Application Technology Working Group) und W3C (World Wide Web Consortium) auf einen einheitlichen Namen für die nächste HTML Version geeinigt.

Das W3C verwendete bisher die Schreibweise mit einem Leerzeichen und die WHATWG entsprechend ohne Leerzeichen. Nachdem die Meldung in vielen Foren und Newsseiten die Runde gemacht hat, wurde heute um 13:43 Uhr bereits der deutsche Wikipedia Artikel zu HTML5 geändert. Auch das W3C hat ihre Spezifikation zu HTML5 heute bereits angepasst.

(weiterlesen…)

Okt 7

Google Maps Suggest – Adress-Autovervollständigung mit Scriptaculous

Veröffentlich am Mittwoch, 7. Okt 2009 in Webentwicklung

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 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:

(weiterlesen…)

Sep 29

Die Grenzen der Frame-Weiterleitung sprengen

Veröffentlich am Dienstag, 29. Sep 2009 in Webentwicklung

Viele Hoster bieten günstige Domains ohne Webhosting Komponenten an. Bei einigen Hoster wie z.B. Strato handelt es sich aber leider nur um Domains mit der Möglichkeit der Frame-Weiterleitung. Das ist aber teilweise vor der Bestellung nicht zu sehen.

Manch einer wird sich eventuell darüber freuen, da er irgendwo ein kostenloses Hosting mit einer sehr langen URL hat und durch die Frameweiterleitung den Besuchern immer eine kurze Domain präsentieren kann. Doch die Sache hat auch ihre Haken.

(weiterlesen…)

Sep 8

Externe Links kennzeichnen mit CSS3

Veröffentlich am Dienstag, 8. Sep 2009 in Webentwicklung

Wer kennt nicht das Problem mit externen Links? Man möchte dem Benutzer kein target=”_blank” zumuten und lässt daher auch externe Links im gleichen Fenster öffnen. Damit der Benutzer aber sehen kann, dass es sich um einen externen Link handelt, möchte man die Links gerne markieren. Daruch kann der Benutzer ihn eventuell selbstständig in einem neuen Fenster/Tab öffnen.

Bisher habe ich schon viele Lösungen für dieses Problem gefunden. Einige davon wurden serverseitig vorgenommen, einige sehr aufwändig per JavaScript clientseitig. Meistens wurden dabei alle Links innerhalb einer Seite gesucht und dann per Script angepasst.

(weiterlesen…)

Impressum