Es gibt Tage wie den heutigen, an denen bringt man Stunden damit zu sich über die inkompetenz von gewissen Softwarehäusern aufzuregen. Im Webinterface des BenchIT Projektes gibt es Seiten auf denen versendete Formulardaten abhängig von dem Button den der User klickt verarbeitet werden. Beispiel alle in einem Formular ausgewählen Benutzer können gesperrt oder gelöscht werden.

Soweit nicht weiter schlimm. Sieht doch die HTML Spezifikation der W3C vor das Elemente vom Typ button und input vor das mittel des Attributs value den dort hinterlegten Wert an den Webserver mitsenden. Beim input Element ist das leider nicht explizit in den Specs angegeben, daher wird es auch nicht von allen Browsern unterstützt. Bei der Mozilla Familie geht es ohne Probleme, Konqueror und andere machen es nicht. Darauf bin ich aber selbst schnell gestoßen und habe alle input type=”img”-Elemente gegen button Elemente ausgetauscht. Das ging dann in allen Browsern - außer dem Übermächtigen Internet Explorer.

Dieser schickt statt des Wertes der in value hinterlegt ist den inhalt an den Browser der im Rumpf des Elementes steckt. Die W3C Spec sagt dazu aber:

value       CDATA          #IMPLIED  -- sent to server when submitted --

Hmmm, schön Microsoft denn so ist es mit dem IE nahezu unmöglich mehrere grafische Buttons in einem Formular zu verwenden. Aber wozu hab ich denn einen 24 Stunden Tag wenn ich nichts finden würde. Google bracht mich leider nur zu den Seiten pubertierender HTML Programmierer die mir erklärten das man sowas doch nicht mit Buttons sondern Javascript macht.

JavaScript mag ich nun aber ganz und gar nicht, und eLinks und Co. auch nicht ;) Also habe ich mich ein wenig mit der Technik beschäftigt und rausgefunden das beim Absenden eine input type=image die X- und Y-Koordinaten der Stelle abgeschickt werden wo man auf dem Button geklickt hat. Verpackt wird das in zwei Variablen der Form elementname_x und elementname_y jeweils mit dem Positionswert. So ganz klar ist mir nicht wozu man das braucht außer statistisch zu erfassen auf welche Ecke des Buttons der Nutzer geklickt hat oder eine Serverseitige Imagemap zu realisieren aber das ganze hilft mir weiter :)

Wenn man nämlich den Wert der Variablen den man übermitteln will in den Namen des Elementes packt kann man diesen auf Serverseite mittels eines einfachen regulären Ausdrucks wieder rausfischen. Vorraussetzung ist nur das man den Elementen einen festen Präfix z.B. action verpasst und dannach den Wert anhängt. Dann kann man z.B. mit der folgenden PHP Funktion seine Daten versteckt übermitteln:

<?php
	echo imageButtonHandler( $_REQUEST );

	function imageButtonHandler( $PARAMETERS )
	{
		// fetch all submited item names
		$keys = array_keys( $PARAMETERS );
		// run throug all submited items
		foreach( $keys as $key )
		{
			// check if matching action item is present
			if( preg_match( '/^action(.*)_[xy]$/', $key, $matches ) )
			{
				// return the merged value in the item name
				return $matches[1];
			}
		}
	}
?>

<form action="submit.php" method="post">
	<input type="image" src="alpha.png" name="actionalpha">
	<input type="image" src="beta.png" name="actionbeta">
</form>

Im Beispiel oben ist das Präfix für alle Submitbuttons action und der versteckte wert also alles zwischen action und _x bzw. _y. Morgen werde ich mich also daran machen das ganze im BenchIT Webinterface zu verankern. Danke Microsoft für diese geistreiche umsetzung einer einfachen Spezifikation :) Ohne euch wäre ich nie auf diesen Hack gekommen *fg*


Kommentare