neues formularmodul :: w3concepts.form.v1

Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Ergänzung zum Versand als vCard und Validierungstyp 'phone'

Beitrag von Dodger77 » Fr 22. Okt 2004, 19:37

Für einen Kunden musste ich zwei Features in ein Mailkontaktformular integrieren, die ich hier dann auch mal der Community zur Verfügung stellen möchte:

Beschreibung:

Code: Alles auswählen

w3concepts.form.v1 erweitert um:
1. Validierungstyp "phone" - Nutzung durch Angabe von "valid:phone"
   mögliche Formate sind z.B.:
   0123 456789
   012/3456789
   0123-456789
   +49 123 456789
   +49 986 4578-95

2. Versand der Daten zusätzlich als vCard, aktivierbar über die Templatekonfiguration der Kategorie. Die Nutzung entspricht der "Syntax der Formularfeldplatzhalter" von http://w3concepts.net/1/1/51/130.html:

vcard:vcardfeld
Mögliche Felder sind: name, vorname, organisation, titel, telefon, fax, strasse, plz, ort und email. Bei Aktivierung des vCard-Versands werden alle weiteren Felder des Formulars in die Notiz der vCard eingefügt.

3. Umstellung des Mailversands auf die in Contenido integrierte Mail-Klasse (phpmailer) um den Versand von Anhängen einfach zu ermöglichen
Input

Code: Alles auswählen

/***********************************************
* CONTENIDO MODUL - INPUT
*
* Modulname   :	    w3concepts.form.v1
* Author      :     Andreas Kummer
* Copyright   :     mumprecht & kummer w3concepts
* Created     :     20-08-2004
* Modified    :     22-10-2004 by Ingo van Peeren (www.van-peeren.de)
************************************************/


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 "<tr><td>Versand als vCard (z.B. für Outlook lesbar):</td>";
echo "<td><input type=\"checkbox\" name=\"CMS_VAR[5]\" value=\"1\" ";
if("CMS_VALUE[5]" == 1) echo "checked";
echo "/></td></tr>";

echo "</table>";
Output:

Code: Alles auswählen

<?php

/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname   :     w3concepts.form.v1
* Author      :     Andreas Kummer
* Copyright   :     mumprecht & kummer w3concepts
* Created     :     20-08-2004
* Modified    :     22-10-2004 by Ingo van Peeren (www.van-peeren.de)
************************************************/

//Integration der phpmailer-Klasse
include ("../contenido/classes/class.phpmailer.php");

class w3form {

	var $email, $aufgedroeselt, $form, $formularFeld;

	function w3form() {
	}

                // Umgestellt auf phpmailer und evtl. Aufruf der vCard-Erstellung und Anhang
	// PRIVATE
	function sendEmail() {
		$this->aufdroeseln($this->suppress('sent', 'sent', 'vcard'));
		$this->generateEmailMessage();

		if (!$_POST['vcard']) {
          $mail = new phpmailer();
          $mail->AddAddress($this->email['adresses']);
          $mail->From     = $this->email['from']['email'];
          $mail->FromName = $this->email['from']['name'];
          $mail->Subject  = $this->email['subject'];
          $mail->Body     = $this->email['message'];
          if(!$mail->Send()){
            $notsend .= $lngNews["mailcouldnotbesend1"].$to.$lngNews["mailcouldnotbesend2"] . "<br>";
          }
        }
        else {
          $datei_content = $this->generateVcard();
                    $mail = new phpmailer();
          $mail->AddAddress($this->email['adresses']);
          $mail->From     = $this->email['from']['email'];
          $mail->FromName = $this->email['from']['name'];
          $mail->Subject  = $this->email['subject'];
          $mail->Body     = $this->email['message'];
          $mail->AddStringAttachment($datei_content,"Kontakt.vcf","base64","text/x-vcard");
          if(!$mail->Send()){
            $notsend .= $lngNews["mailcouldnotbesend1"].$to.$lngNews["mailcouldnotbesend2"] . "<br>";
          }
            //echo $notsend;
        }
	}

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

                // Erstellt eine vCard
	// PRIVATE
	function generateVcard() {
		if ($this->aufgedroeselt) foreach ($this->aufgedroeselt as $key => $value) {
			if ($key == $_POST['vcard']['name']) $vcard_name = $value;
			elseif ($key == $_POST['vcard']['vorname']) $vcard_vorname = $value;
			elseif ($key == $_POST['vcard']['organisation']) $vcard_organisation = $value;
			elseif ($key == $_POST['vcard']['titel']) $vcard_titel = $value;
			elseif ($key == $_POST['vcard']['telefon']) $vcard_telefon = $value;
			elseif ($key == $_POST['vcard']['fax']) $vcard_fax = $value;
			elseif ($key == $_POST['vcard']['strasse']) $vcard_strasse = $value;
			elseif ($key == $_POST['vcard']['plz']) $vcard_plz = $value;
			elseif ($key == $_POST['vcard']['ort']) $vcard_ort = $value;
			elseif ($key == $_POST['vcard']['email']) $vcard_email = $value;
            else $vcard_notizen .= $key . "     " . $value . "=0D=0A";
		}
        $vcard = "BEGIN:VCARD
VERSION:2.1
N:";
        if ($vcard_vorname) $vcard .= $name . ';' . $vcard_vorname . '
FN:' . $vcard_vorname . ' ' . $vcard_name . '
';
        else $vcard .= $vcard_name . '
FN:' . $vcard_name . '
';
        if ($vcard_organisation) $vcard .= 'ORG:' . $vcard_organisation . '
';
if ($vcard_notizen) {
$vcard_notizen = str_replace ("\r\n", "=0D=0A", $vcard_notizen);
$vcard_notizen = str_replace ("\n", "=0D=0A", $vcard_notizen);
}
        if ($vcard_notizen) $vcard .= "NOTE;ENCODING=QUOTED-PRINTABLE:" . $vcard_notizen. "=0D=0A
";
        if ($vcard_telefon) $vcard .= "TEL;WORK;VOICE:" . $vcard_telefon. "
";
        if ($vcard_fax) $vcard .= "TEL;WORK;FAX:" . $vcard_fax. "
";
        $vcard .= "ADR;HOME:;;". $vcard_strasse . ";" . $vcard_ort . ";;" . $vcard_plz . ";
";
        if ($vcard_email) $vcard .= "EMAIL;PREF;INTERNET:". $vcard_email . "
";
        $vcard .= "REV:" . date("Ymd") . "T" . date("H:i:s") ."Z
END:VCARD";
        return $vcard;
	}

	// 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) {
                                if ($sent) echo "<p><strong>Eine oder mehrere Eingaben von Ihnen fehlen oder sind nicht korrekt. Bitte überprüfen Sie die rot hinterlegten Felder!</strong></p>";
		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':
				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 "\" style=\"white-space: pre;\" $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 class=check type=\"checkbox\" $parameter value=\"{$attribute['value']}\" checked=\"checked\"/>";
					} else {
						echo "<input class=check type=\"checkbox\" $parameter value=\"{$attribute['value']}\"/>";
					}
				} else {
					if (!empty($attribute['selected']) && $attribute['selected'] == 'true') {
						echo "<input class=check type=\"checkbox\" $parameter value=\"{$attribute['value']}\" checked=\"checked\"/>";
					} else {
						echo "<input class=check type=\"checkbox\" $parameter value=\"{$attribute['value']}\"/>";
					}
				}
				break;
			case 'radio':
				if (!empty($_POST["{$attribute['name']}"])) {
					if ($_POST["{$attribute['name']}"] == $attribute['value']) {
						echo "<input class=radio type=\"radio\" $parameter value=\"{$attribute['value']}\" checked=\"checked\"/>";
					} else {
						echo "<input class=radio type=\"radio\" $parameter value=\"{$attribute['value']}\" />";
					}
				} else {
					if (!empty($attribute['selected']) && $attribute['selected'] == 'true') {
						echo "<input class=radio type=\"radio\" $parameter value=\"{$attribute['value']}\" checked=\"checked\"/>";
					} else {
						echo "<input class=radio type=\"radio\" $parameter value=\"{$attribute['value']}\"/>";
					}
				}
				break;
		}

// Einfügen von versteckten Inputfeldern zur Übergabe der vCard-Felder
                          $vc = "CMS_VALUE[5]";
                          if ($vc) {
		switch ($attribute['vcard']) {
			case 'name':
                                 echo "<input type=\"hidden\" name=\"vcard[name]\" value=\"".$attribute['name']."\">";
				break;
			case 'vorname':
                                 echo "<input type=\"hidden\" name=\"vcard[vorname]\" value=\"".$attribute['name']."\">";
				break;
			case 'organisation':
                                 echo "<input type=\"hidden\" name=\"vcard[organisation]\" value=\"".$attribute['name']."\">";
				break;
			case 'titel':
                                 echo "<input type=\"hidden\" name=\"vcard[titel]\" value=\"".$attribute['name']."\">";
				break;
			case 'telefon':
                                 echo "<input type=\"hidden\" name=\"vcard[telefon]\" value=\"".$attribute['name']."\">";
				break;
			case 'fax':
                                 echo "<input type=\"hidden\" name=\"vcard[fax]\" value=\"".$attribute['name']."\">";
				break;
			case 'strasse':
                                 echo "<input type=\"hidden\" name=\"vcard[strasse]\" value=\"".$attribute['name']."\">";
				break;
			case 'plz':
                                 echo "<input type=\"hidden\" name=\"vcard[plz]\" value=\"".$attribute['name']."\">";
				break;
			case 'ort':
                                 echo "<input type=\"hidden\" name=\"vcard[ort]\" value=\"".$attribute['name']."\">";
				break;
			case 'email':
                                 echo "<input type=\"hidden\" name=\"vcard[email]\" value=\"".$attribute['name']."\">";
				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;

// Test auf Telefonnummern - Validierungstyp "phone"
                                if (!empty($feld['valid']) && $feld['valid'] == 'phone' && !eregi("^([+][ ]?[1-9][0-9][ ]?[-]?[ ]?|[(]?[0][ ]?)[0-9]{2,4}[-)/ ]?[ ]?[1-9][-0-9 ]{3,16}$",$_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();
}

?>
Ich hoffe, dass jemand die Erweiterungen von mir nutzen kann, und wünsche viel Spaß beim ausprobieren!

kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer » Sa 23. Okt 2004, 11:09

ich habe es zwar noch nicht ausprobiert - aber ich denke, das ist eine geile erweiterung des moduls! danke!

gruss,
andreas
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)

Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Beitrag von Dodger77 » Sa 23. Okt 2004, 11:48

kummer hat geschrieben:ich habe es zwar noch nicht ausprobiert - aber ich denke, das ist eine geile erweiterung des moduls! danke!
Danke für die Blumen :!:

uups
Beiträge: 116
Registriert: Fr 16. Jan 2004, 09:08
Kontaktdaten:

Beitrag von uups » So 24. Okt 2004, 10:08

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###
Tolles Modul! Funktioniert problemlos!

Eine Idee bzw. Wunsch hätte ich da noch: Schön wäre es, wenn bei der E-Mail die verschickt wird nicht die Zahl der gewählten Option übermittelt würde, sondern der Name der Option... (Im obigen Beispiel würde dann, wenn Österreich gewählt wurde nicht die Zahl 3 sondern Österrreich übermittelt)

Hat jemand eine Idee?


Uups...

Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Beitrag von Dodger77 » So 24. Okt 2004, 14:04

uups hat geschrieben: Eine Idee bzw. Wunsch hätte ich da noch: Schön wäre es, wenn bei der E-Mail die verschickt wird nicht die Zahl der gewählten Option übermittelt würde, sondern der Name der Option... (Im obigen Beispiel würde dann, wenn Österreich gewählt wurde nicht die Zahl 3 sondern Österrreich übermittelt)

Hat jemand eine Idee?
Was hälst du von:

Code: Alles auswählen

###name:land; type:select; valid:integer; size:1; option:bitte auswählen; optionvalue:0; option:Schweiz; optionvalue:Schweiz; option:Deutschland; optionvalue:Deutschland; option:Österreich; optionvalue:Oesterreich;value:1;minlength:7;###

uups
Beiträge: 116
Registriert: Fr 16. Jan 2004, 09:08
Kontaktdaten:

Beitrag von uups » So 24. Okt 2004, 14:29

Dodger77 hat geschrieben:
uups hat geschrieben: Eine Idee bzw. Wunsch hätte ich da noch: Schön wäre es, wenn bei der E-Mail die verschickt wird nicht die Zahl der gewählten Option übermittelt würde, sondern der Name der Option... (Im obigen Beispiel würde dann, wenn Österreich gewählt wurde nicht die Zahl 3 sondern Österrreich übermittelt)

Hat jemand eine Idee?
Was hälst du von:

Code: Alles auswählen

###name:land; type:select; valid:integer; size:1; option:bitte auswählen; optionvalue:0; option:Schweiz; optionvalue:Schweiz; option:Deutschland; optionvalue:Deutschland; option:Österreich; optionvalue:Oesterreich;value:1;minlength:7;###

Naja, hab ich ja auch probiert! Leider klappts aber mit der Validierung dann nicht mehr wirklich...

uups...

kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer » Mo 25. Okt 2004, 07:37

diese frage taucht immer wieder auf. es wird im email das ausgegeben, was der browser überträgt. will heissen: werden values angegeben, dann werden diese verwendet. wenn nicht, wird die bezeichnung der option verwendet. man stösst dabei naturgemäss häufig auf das validierungsproblem. manchmal kann man dieses über minlength und maxlength lösen; zuweilen geht das leider nicht. wenn ich dazu komme, werde ich das modul diesbezüglich anpassen. allerdings wird das mir wohl in den nächsten zwei drei tagen nicht möglich sein. ich bitte um einen moment geduld... :lol:
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)

kypta
Beiträge: 295
Registriert: Di 8. Jul 2003, 13:25
Kontaktdaten:

Error Log

Beitrag von kypta » Mo 25. Okt 2004, 14:59

Ich habe dieses Modul bei mir mal eingebaut zusammen mit dem "Demo-Formular". Das funktioniert soweit alles. Ich habe aber festgestellt, dass PHP-Warnungen auftreten wenn ich im Frontend das Formular lade:
[25-Oct-2004 15:39:42] PHP Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in /meinserver/cms/front_content.php(563) : eval()'d code on line 475
[25-Oct-2004 15:39:42] PHP Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in /meinserver/cms/front_content.php(563) : eval()'d code on line 490
[25-Oct-2004 15:39:42] PHP Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in /meinserver/cms/front_content.php(563) : eval()'d code on line 586
[25-Oct-2004 15:39:42] PHP Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in /meinserver/cms/front_content.php(563) : eval()'d code on line 589
Wenn ich es ausfülle und absende wieder - also bei jedem Aufruf des Formulars.

Herr Jeh
Beiträge: 12
Registriert: Mi 20. Okt 2004, 13:48
Kontaktdaten:

Beitrag von Herr Jeh » Mo 25. Okt 2004, 15:39

Hallo !

Mein Problem ist anderer Natur.

Ich habe das Modul erfolgreich installiert und meinen Bedürfnissen angepasst und in der Template-Konfiguration die richtige E-Mail-Adresse angegeben, wo die ausgefüllten Formulare hingeschickt werden sollen.

Wenn ich nun testweise ein Formular ausfülle und auf "senden" klicke, dauert es ziemlich lange, ehe die Sende-Bestätigung kommt (aber immerhin erscheint die schon mal ;) ).

Schaue ich dann aber in mein E-Mail-Fach, ist dort eben keine E-Mail zu finden. Habe das mit mehreren E-Mail-Adressen probiert, ohne jemals Post von meinem Formular erhalten zu haben....

Das finde ich sehr schade, aber vielleicht kann mir ja jemand den entscheidenden Hinweis geben, wie ich dieses problem fixen kann.

Vielen Dank!

kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Re: Error Log

Beitrag von kummer » Mo 25. Okt 2004, 16:50

Thomas hat geschrieben:Ich habe dieses Modul bei mir mal eingebaut zusammen mit dem "Demo-Formular". Das funktioniert soweit alles. Ich habe aber festgestellt, dass PHP-Warnungen auftreten wenn ich im Frontend das Formular lade.
was verwendest du für eine php-version?
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)

kypta
Beiträge: 295
Registriert: Di 8. Jul 2003, 13:25
Kontaktdaten:

Beitrag von kypta » Mo 25. Okt 2004, 16:55

PHP Version 4.3.9 und Apache 1.3.27

kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer » Mo 25. Okt 2004, 17:17

diese warnung erscheint normalerweise nur dann, wenn die variablenübrgabe per referenz erfolgt, ohne dass die deklaration der funktion per referenz vorgenommen worden ist.

im vorliegenden script erwarten die folgenden beiden funktionen eine parameterübergabe per referenz:
  • formularInterpretation
    formularFeldKorrekt
ich habe nun alles gecheckt; aber es taucht nirgends eine andere übrgabe per rerferenz auf als bei diesen beiden funktionen. von mir aus gesehen, dürfte es diese warnungen nicht geben.

es ist auch seltsam, dass die zeilennummern nicht stimmen. das script hat gar nicht so viele zeilen.

tut mir leid, ich sehe kein problem, das ich lösen könnte.

gruss,
andreas
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)

kypta
Beiträge: 295
Registriert: Di 8. Jul 2003, 13:25
Kontaktdaten:

Beitrag von kypta » Di 26. Okt 2004, 13:37

Also, ich habe das ganze nochmals gecheckt:
Wenn ich das Formular nicht verwende, dann funktioniert alles ohne Fehlermeldung. Sobald ich das Formular verwende sind die Fehler da.

Ich habe daraufhin den OUTPUT-Bereich des Formulares gelöscht und auch alle Fehlermeldungen im System. Danach habe ich den Output wieder in das Modul eingefügt: Folgendes steht dann im Error-log:
[26-Okt-2004 14:25:34] PHP Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in /meinserver/contenido/includes/functions.mod.php(155) : eval()'d code on line 125
[26-Okt-2004 14:25:34] PHP Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in /meinserver/contenido/includes/functions.mod.php(155) : eval()'d code on line 140
[26-Okt-2004 14:25:34] PHP Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in /meinserver/contenido/includes/functions.mod.php(155) : eval()'d code on line 236
[26-Okt-2004 14:25:34] PHP Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in /meinserver/contenido/includes/functions.mod.php(155) : eval()'d code on line 239
[26-Okt-2004 14:25:35] PHP Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in /meinserver/contenido/includes/functions.mod.php(155) : eval()'d code on line 125
[26-Okt-2004 14:25:35] PHP Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in /meinserver/contenido/includes/functions.mod.php(155) : eval()'d code on line 140
[26-Okt-2004 14:25:35] PHP Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in /meinserver/contenido/includes/functions.mod.php(155) : eval()'d code on line 236
[26-Okt-2004 14:25:35] PHP Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in /meinserver/contenido/includes/functions.mod.php(155) : eval()'d code on line 239
Der Code, den ich reingepastet habe ist dieser hier:

Code: Alles auswählen

<?php

/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname   :     w3concepts.form.v1
* Author      :     Andreas Kummer
* Copyright   :     mumprecht & kummer w3concepts
* Created     :     20-08-2004
* Modified    :     21-10-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-z0-9-]*$",$_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();
}

?>
Modified daher, weil ich die Änderungen von Andreas Kummer noch eingefügt habe.

Code: Alles auswählen

if (!empty($feld['valid']) && $feld['valid'] == 'text' && !eregi("^[ .,;!?()öäüéàèâêîça-z0-9-]*$",$_POST["{$feld['name']}"])) return false;
Ich habe PHP Version 4.3.9 und Apache 1.3.27.
Eigentlich müsste das jetzt von anderen auch reproduzierbar sein...

SkyBlader
Beiträge: 303
Registriert: Do 18. Mär 2004, 16:23
Wohnort: Ratingen / NRW
Kontaktdaten:

Beitrag von SkyBlader » Di 26. Okt 2004, 14:11

den fehler hab ich bekommen als ich das 4.5.x snapshot vom 22. auf meinen server in der kaserne aufsetzen wollte.


Eine Änderung in der PHP.INI hilft da am schnellsten:
If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer
Einfach in der pHP.ini nach allow_call_time_pass_reference suchen und von off auf true setzen.

Wenn du kein Zugriff drauf hast, wende dich an deinen Provider.

Ansonsten müsste man wohl den Code überarbeiten.

Gruß

Stefan
Contenido 4.4.4/4.4.5 - Contenido 4.5.x

Module:sn_multinav für 4.5.x

kypta
Beiträge: 295
Registriert: Di 8. Jul 2003, 13:25
Kontaktdaten:

Beitrag von kypta » Di 26. Okt 2004, 15:20

Well, ich habe allow_call_time_pass_reference via .htaccess auf true gestellt. Somit bin ich die Warnungen los. Hier der Code:

Code: Alles auswählen

# um php-warnungen zu unterdrücken muss
# allow_call_time_pass_reference 
# auf true gestellt werden
php_value allow_call_time_pass_reference 1

Gesperrt