ich habe ein neues modul erstellt, von dem ich annehme, dass es viele von euch interessieren dürfte.
das modul w3concepts.form.v1 erlaubt die erstellung von frei definierbaren formularen und hat folgende features:
- völlig freie formulargestaltung mit wysiwyg-editor
konfigurierbar über input-script
stringente kontrolle der eingabe auf server-ebene: auf übergabetyp (z.b. simpletext, text, integer, float, email, datum), auf mindest- und maximallänge, auf mindest- und maximalwert, auf vorhanden sein.
automatischer versand per email 
- (1) input-script in input-bereich kopieren
(2) output-script in output-bereich kopieren
(3) im template einem container das modul zuordnen
(4) artikel erstellen
(5) modul konfigurieren
(6) im editor das formular erstellen
(7) im editor den ausgabebereich erstellen 
im formularbereich kann ein formular z.b. auf basis einer tabelle erstellt werden. anstelle der formularfelder sind platzhalter einzugen. diese sehen wie folgt aus:
präfix: ###
suffix: ###
innerhalb dieser trennzeichen sind folgende angaben möglich oder erforderlich:
name:feldbezeichnung (pflicht)
type:text (pflicht; zur auswahl stehen: text, textarea, password, select, radio, checkbox)
valid:integer (optional; zur auswahl stehen: simpletext, text, integer, date, email, float)
mandatory:true (optional; zur auswahl stehen: true, false)
value:wert (optional; wert bezeichnet der vorgabewert)
size:12 (optional; breite des feldes)
cols:30 (optional; breite eines textarea-feldes)
rows:5 (optional; höhe eines textarea-feldes)
option:anzeigewert (pflicht bei select; wert, welcher im browser angezeigt wird)
optionvalue:speicherwert (optional; wert welcher bei selects übertragen wird)
minvalue:1 (optional; mindestwert, der einzugeben ist)
maxvalue:100 (optional; maximalwert, der eingegeben werden darf)
minlength:3 (optional; minimale anzahl zeichen, die eingegeben werden müssen)
maxlength:8 (optional; maximale anzahl zeichen, die eingegeben werden dürfen)
ein selectfeld mit vier werten sieht dann z.b. so aus:
Code: Alles auswählen
###name:land; type:select; valid:integer; size:1; option:bitte auswählen; optionvalue:0; option:Schweiz; optionvalue:1; option:Deutschland; optionvalue:2; option:Oesterreich; optionvalue:3;value:1;minvalue:1###Code: Alles auswählen
<TABLE style="WIDTH: 100%" width="100%" border=0>
<TBODY>
<TR>
<TD>Vorname / Nachname:</TD>
<TD>###name:vorname; type:text; valid:simpletext; size:15; mandatory:true### / ###name:nachname; type:text; valid:simpletext; size:15; mandatory:true###</TD></TR>
<TR>
<TD>Land:</TD>
<TD>###name:land; type:select; valid:integer; size:1; option:bitte auswählen; optionvalue:0; option:Schweiz; optionvalue:1; option:Deutschland; optionvalue:2; option:Oesterreich; optionvalue:3;value:1;minvalue:1###</TD></TR>
<TR>
<TD>Anzahl:</TD>
<TD>###name:anzahl;type:text;valid:integer;size:3;value:12; minvalue:5; maxvalue:100###</TD></TR>
<TR>
<TD>zweites Land:</TD>
<TD>###name:land2; type:select; valid:text; size:1; option:bitte auswählen; option:Schweiz; option:Deutschland; option:Oesterreich; value:Deutschland###</TD></TR>
<TR>
<TD class="" vAlign=top>Geschlecht:</TD>
<TD>###name:geschlecht;type:radio;valid:text; value:männlich; selected:true### männlich<BR>###name:geschlecht; type:radio; valid:text; value:weiblich### weiblich<BR>###name:geschlecht; type:radio; valid:text; value:geschlechtslos### geschlechtslos</TD></TR>
<TR>
<TD class="" vAlign=top>Interessen:</TD>
<TD>
<P>###name:interesse[0];type:checkbox; valid:text; value:sport### Sport<BR>###name:interesse[1]; type:checkbox; valid:text; value:unterhaltung### Unterhaltung<BR>###name:interesse[2]; type:checkbox; valid:text; value:geschichte### Geschichte<BR>###name:interesse[3]; type:checkbox; valid:text; value:internet; selected:true### Internet<BR>###name:interesse[4]; type:checkbox; valid:text; value:sonstiges### Sonstiges</P></TD></TR>
<TR>
<TD>Bemerkungen:</TD>
<TD>###name:bemerkungen; type:textarea; valid:text; rows:6; cols:30###</TD></TR>
<TR>
<TD></TD>
<TD></TD></TR>
<TR>
<TD colSpan=2>
<P align=center><INPUT type=submit value=senden></P></TD></TR></TBODY></TABLE>Code: Alles auswählen
/***********************************************
* CONTENIDO MODUL - INPUT
*
* Modulname   :	    w3concepts.form.v1
* Author      :     Andreas Kummer
* Copyright   :     mumprecht & kummer w3concepts
* Created     :     20-08-2004
* Modified    :     20-08-2004
************************************************/
echo "<table cellspacing=\"0\" cellpadding=\"10\" border=\"0\"><tr valign=\"top\">";
echo "<tr><td>Zieladresse (alias@mydomain.com):</td>";
echo "<td><input type=\"text\" name=\"CMS_VAR[0]\" value=\"CMS_VALUE[0]\" size=\"30\" /></td></tr>";
echo "<tr><td>Betreff:</td>";
echo "<td><input type=\"text\" name=\"CMS_VAR[1]\" value=\"CMS_VALUE[1]\" size=\"30\" /></td></tr>";
echo "<tr><td>Antwortadresse (alias@mydomain.com):</td>";
echo "<td><input type=\"text\" name=\"CMS_VAR[2]\" value=\"CMS_VALUE[2]\" size=\"30\" /></td></tr>";
echo "<tr><td>Emailname (z.B. Vorname Name):</td>";
echo "<td><input type=\"text\" name=\"CMS_VAR[3]\" value=\"CMS_VALUE[3]\" size=\"30\" /></td></tr>";
echo "<tr><td>Hintergrundfarbe bei Fehlern (z.B. red):</td>";
echo "<td><input type=\"text\" name=\"CMS_VAR[4]\" value=\"CMS_VALUE[4]\" size=\"30\" /></td></tr>";
echo "</table>";Code: Alles auswählen
<?php
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname   :     w3concepts.form.v1
* Author      :     Andreas Kummer
* Copyright   :     mumprecht & kummer w3concepts
* Created     :     20-08-2004
* Modified    :     20-08-2004
************************************************/
class w3form {
	var $email, $aufgedroeselt, $form, $formularFeld;
	function w3form() {
	}
	// PRIVATE
	function sendEmail() {
		$this->aufdroeseln($this->suppress('sent'));
		$this->generateEmailMessage();
		mail($this->email['adresses'],$this->email['subject'],$this->email['message'],"From: {$this->email['from']['name']} <{$this->email['from']['email']}>\nReply-To: {$this->email['from']['email']}\nX-Mailer: PHP/" . phpversion());
	}
	// PRIVATE
	function aufdroeseln($aufzudroeseln,$prefix = '') {
		foreach ($aufzudroeseln as $key => $value) {
			if (is_array($value)) {
				$this->aufdroeseln($value,$key." ");
			} else {
				$this->aufgedroeselt["{$prefix}{$key}"] = $value;
			}
		}
	}
	// PRIVATE
	function add2Message($key,$value) {
		if (strlen($key) > 25 OR strlen($value) > 54) {
			$this->email['message'] .= "$key\n$value\n";
		} else {
		$this->email['message'] .= $key;
		$this->email['message'] .= str_repeat(' ',25-strlen($key));
		$this->email['message'] .= "$value\n";
		}
	}
	// PRIVATE
	function generateEmailMessage() {
		if ($this->aufgedroeselt) foreach ($this->aufgedroeselt as $key => $value) {
			$this->add2Message($key,$value);
		}
	}
	// PRIVATE
	function suppress() {
		$suppress = func_get_args();
		foreach ($_POST as $key => $value) {
			if (array_search($key,$suppress) === false) $fields[$key] = $value;
		}
		return $fields;
	}
	// PUBLIC
	function addEmailAdress($email) {
		if (empty($this->emailAdresses)) {
			$this->email['adresses'] .= "$email";
		} else {
			$this->email['adresses'] .= ", $email";
		}
	}
	// PUBLIC
	function setEmailSubject($subject) {
		$this->email['subject'] = $subject;
	}
	// PUBLIC
	function setEmailFrom($email,$name) {
		$this->email['from']['email'] = $email;
		$this->email['from']['name'] = $name;
	}
	// PUBLIC
	function setForm($form) {
		$this->form['form'] = $form;
	}
	// PUBLIC
	function setAnswer($answer) {
		$this->form['answer'] = $answer;
	}
	// PUBLIC
	function setBackgroundError($color) {
		$this->form['colorError'] = $color;
	}
	// PRIVATE
	function formularInterpretation(&$formular) {
		$felder = split('###',$formular);
		for ($i=1;$i<count($felder);$i=$i+2) {
			$attributte = split(';',trim($felder[$i]));
			foreach ($attributte as $attribut) {
				$namewert = split(':',trim($attribut));
				if ($namewert[0] != 'option' && $namewert[0] != 'optionvalue') {
					$feld["{$felder[$i]}"]["{$namewert[0]}"] = $namewert[1];
				} else {
					$feld["{$felder[$i]}"]["{$namewert[0]}"][] = $namewert[1];
				}
			}
		}
		return $feld;
	}
	// PRIVATE
	function formularAusgabe($sent = false) {
		echo '<form action="" method="POST">';
		echo '<input type="hidden" name="sent" value="true" />';
		$formular = $this->form['form'];
		$formulardaten = $this->formularInterpretation(&$formular);
		$formular = split('###',$formular);
		foreach ($formular as $formularteil) {
			if (!empty($formulardaten["{$formularteil}"])) {
				$this->formularFeld($formulardaten["{$formularteil}"],$sent);
			} else {
				echo $formularteil;
			}
		}
		echo '</form>';
	}
	// PRIVATE
	function formularFeld($attribute,$sent) {
		$parameter = "name=\"{$attribute['name']}\"";
		if ($sent && !$this->formularFeldKorrekt(&$attribute)) $style ="style=\"background-color:{$this->form['colorError']};\"";
		switch ($attribute['type']) {
			case 'select':
			case 'password':
			case 'text':
				if (!empty($attribute['size'])) $parameter .= " size=\"{$attribute['size']}\"";
				break;
		}
		switch ($attribute['type']) {
			case 'textarea':
			case 'text':
				if (!empty($attribute['size'])) $parameter .= " size=\"{$attribute['size']}\"";
				if (!empty($attribute['value'])) $value = $attribute['value'];
				if (!empty($_POST["{$attribute['name']}"])) $value = $_POST["{$attribute['name']}"];
				break;
		}
		switch ($attribute['type']) {
			case 'text':
				echo "<input type=\"text\" $parameter value=\"$value\" $style />";
				break;
			case 'password':
				echo "<input type=\"password\" $parameter value=\"$value\" $style />";
				break;
			case 'textarea':
				echo "<textarea name=\"{$attribute['name']}\" cols=\"";
				echo (empty($attribute['cols']))?('20'):($attribute['cols']);
				echo "\" rows=\"";
				echo (empty($attribute['rows']))?('2'):($attribute['rows']);
				echo "\" wrap=\"virtual\" $style>$value</textarea>";
				break;
			case 'select':
				echo "<select $parameter $style>";
				for ($i=0;$i<count($attribute['option']);$i++) {
					if (!empty($attribute['optionvalue'][$i])) {
						if (!empty($_POST["{$attribute['name']}"]) && $_POST["{$attribute['name']}"] == $attribute['optionvalue'][$i]) {
							echo "<option value=\"{$attribute['optionvalue'][$i]}\" selected=\"selected\">{$attribute['option'][$i]}</option>\n";
						} else {
							if (empty($_POST["{$attribute['name']}"]) && !empty($attribute['optionvalue'][$i]) && $attribute['optionvalue'][$i] == $attribute['value']) {
								echo "<option value=\"{$attribute['optionvalue'][$i]}\" selected=\"selected\">{$attribute['option'][$i]}</option>\n";
							} else {
								echo "<option value=\"{$attribute['optionvalue'][$i]}\">{$attribute['option'][$i]}</option>\n";
							}
						}
					} else {
						if (!empty($_POST["{$attribute['name']}"]) && $_POST["{$attribute['name']}"] == $attribute['option'][$i]) {
							echo "<option selected=\"selected\">{$attribute['option'][$i]}</option>\n";
						} else {
							if (empty($_POST["{$attribute['name']}"]) && $attribute['option'][$i] == $attribute['value']) {
								echo "<option selected=\"selected\">{$attribute['option'][$i]}</option>\n";
							} else {
								echo "<option>{$attribute['option'][$i]}</option>\n";
							}
						}
					}
				}
				echo "</select>";
				break;
			case 'checkbox':
				$formularbezeichner = preg_split('[\[|\]]',$attribute['name']);
				if ($sent) {
					if ($_POST["{$formularbezeichner[0]}"]["{$formularbezeichner[1]}"] == $attribute['value']) {
						echo "<input type=\"checkbox\" $parameter value=\"{$attribute['value']}\" checked=\"checked\"/>";
					} else {
						echo "<input type=\"checkbox\" $parameter value=\"{$attribute['value']}\"/>";
					}
				} else {
					if (!empty($attribute['selected']) && $attribute['selected'] == 'true') {
						echo "<input type=\"checkbox\" $parameter value=\"{$attribute['value']}\" checked=\"checked\"/>";
					} else {
						echo "<input type=\"checkbox\" $parameter value=\"{$attribute['value']}\"/>";
					}
				}
				break;
			case 'radio':
				if (!empty($_POST["{$attribute['name']}"])) {
					if ($_POST["{$attribute['name']}"] == $attribute['value']) {
						echo "<input type=\"radio\" $parameter value=\"{$attribute['value']}\" checked=\"checked\"/>";
					} else {
						echo "<input type=\"radio\" $parameter value=\"{$attribute['value']}\" />";
					}
				} else {
					if (!empty($attribute['selected']) && $attribute['selected'] == 'true') {
						echo "<input type=\"radio\" $parameter value=\"{$attribute['value']}\" checked=\"checked\"/>";
					} else {
						echo "<input type=\"radio\" $parameter value=\"{$attribute['value']}\"/>";
					}
				}
				break;
		}
	}
	// PRIVATE
	function formularVollstaendig() {
		$formular = $this->form['form'];
		$felder = $this->formularInterpretation(&$formular);
		foreach ($felder as $feld) {
			if (!$this->formularFeldKorrekt(&$feld)) return false;
		}
		return true;
	}
	// PRIVATE
	function success() {
		$this->sendEmail();
		echo $this->form['answer'];
	}
	// PRIVATE
	function formularFeldKorrekt(&$feld) {
		// prüfung, ob pflichtfeld vorhanden
		if (!empty($feld['mandatory']) && $feld['mandatory'] == 'true' && empty($_POST["{$feld['name']}"])) return false;
		// wenn das formularfeld kein pflichtfeld und nicht vorhanden ist, true zurück geben
		if (empty($_POST["{$feld['name']}"])) return true;
		// regular expression prüfungen
		if (!empty($feld['valid']) && $feld['valid'] == 'simpletext' && !eregi("^[öäüéàèâêîça-z-]*$",$_POST["{$feld['name']}"])) return false;
		if (!empty($feld['valid']) && $feld['valid'] == 'text' && !eregi("^[ .,;!?()öäüéàèâêîça-z-]*$",$_POST["{$feld['name']}"])) return false;
		if (!empty($feld['valid']) && $feld['valid'] == 'integer' && !eregi("^[0-9]*$",$_POST["{$feld['name']}"])) return false;
		if (!empty($feld['valid']) && $feld['valid'] == 'float' && !eregi("^[0-9]*[.]{0,1}[0-9]*$",$_POST["{$feld['name']}"])) return false;
		if (!empty($feld['valid']) && $feld['valid'] == 'date' && !eregi("^[0-9]{1,2}.[0-9]{1,2}.[0-9]{2}$",$_POST["{$feld['name']}"])) return false;
		if (!empty($feld['valid']) && $feld['valid'] == 'email' && !eregi("^[öäüéàèâêîç_a-z0-9-]+(\.[öäüéàèâêîç_a-z0-9-]+)*@[öäüéàèâêîça-z0-9-]+(\.[öäüéàèâêîça-z0-9-]+)*$",$_POST["{$feld['name']}"])) return false;
		// grössenbereich bei integer und float prüfen
		if (!empty($feld['minvalue']) && $_POST["{$feld['name']}"] < $feld['minvalue']) return false;
		if (!empty($feld['maxvalue']) && $_POST["{$feld['name']}"] > $feld['maxvalue']) return false;
		// längenbereich bei allen typen prüfen
		if (!empty($feld['minlength']) && strlen($_POST["{$feld['name']}"]) < $feld['minlength']) return false;
		if (!empty($feld['maxlength']) && strlen($_POST["{$feld['name']}"]) > $feld['maxlength']) return false;
		return true;
	}
	//PUBLIC
	function process() {
		if (!isset($_POST['sent'])) {
			$this->formularAusgabe();
		} elseif ($this->formularVollstaendig()) {
			$this->success();
		} else {
			$this->formularAusgabe(true);
		}
	}
}
if ($edit) {
	echo "<h1>Formularkonfiguration</h1>";
	echo "<p>Hier ist das Formular sowie der Text einzugeben, der zusammen mit dem Formular ausgegeben werden soll:</p>";
	echo "CMS_HTML[0]";
	echo "<p>Hier ist die Ausgabe einzugeben, die erscheint, wenn das Formular erfolgreich prozessiert worden ist:</p>";
	echo "CMS_HTML[1]";
} else {
	$formular = new w3form();
	$formular->addEmailAdress("CMS_VALUE[0]");
	$formular->setEmailSubject("CMS_VALUE[1]");
	$formular->setEmailFrom("CMS_VALUE[2]","CMS_VALUE[3]");
	$formular->setBackgroundError("CMS_VALUE[4]");
	$formular->setForm("CMS_HTML[0]");
	$formular->setAnswer("CMS_HTML[1]");
	$formular->process();
}
?>gruss,
andreas
ps: hier kann man sich das beispielformular mal anschauen für eine begrenzte zeit:
http://www.w3concepts.net/cms/front_con ... &idart=129
tipp: einfach mal leer versenden, um zu sehen was passiert.