Kontakformular mit captcha erweitern (w3concept.form.v1)

jilalleinzuhaus
Beiträge: 44
Registriert: Sa 5. Jun 2004, 14:25
Wohnort: Frankfurt am Main
Kontaktdaten:

Kontakformular mit captcha erweitern (w3concept.form.v1)

Beitrag von jilalleinzuhaus » Di 25. Sep 2007, 15:49

Die Lösung meines Problems steht am Ende dieser Seite!!! Die Fragen haben sich erledigt! :lol:

Ich wollte versuchen in mein Kontaktformular ein Zahlen und Buchstaben Captcha einzubauen. Das Tutorial habe ich exakt nach den Angaben auf dieser Webseite Stoppt den Spam gemacht.

Das Kontaktformular soll nur um diesen Eintrag erweitert werden:

Code: Alles auswählen

<?php 
session_start(); 
if(isset($_SESSION['captcha_spam']) AND $_POST["sicherheitscode"] == $_SESSION['captcha_spam']){ 
unset($_SESSION['captcha_spam']); 

// 
// 
//Hier kommt das ursprüngliche Script hin. 
// 
// 

} 
?> 
Nach dem Einsetzen des PHP-Codes in das Script habe ich dann folgende Fehlermeldung erhalten:

Code: Alles auswählen

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /www/contenido/external/backendedit/front_content.php(890) : eval()'d code:114) in /www/contenido/external/backendedit/front_content.php(890) : eval()'d code on line 546
Was bedeutet die Meldung und woran könnte der Fehler liegen?
Zuletzt geändert von jilalleinzuhaus am Sa 13. Okt 2007, 21:04, insgesamt 1-mal geändert.

tinof
Beiträge: 197
Registriert: Mi 24. Jan 2007, 20:38
Wohnort: Kirchberg / Sa.
Kontaktdaten:

Beitrag von tinof » Di 25. Sep 2007, 16:32

Hallo,

Session - Befehle wie session_start() müssen ausgeführt werden, BEVOR der erste HTML - Code ausgegeben wird, also noch von <HTML><HEAD> usw.

Module wie z.B. das Kontaktformular sind aber in den 'laufenden' HTML - code eingebunden - siehe die <Container> - Tags in den Layouts.

Ich habe das Problem mit einem speziell auf diesen Fall angepasstes Layout gelöst:

Code: Alles auswählen

<container id="101" name="Captcha_Kopf" types="" default="" optional>Captcha_kopf</container>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
       "http://www.w3.org/TR/html4/strict.dtd">

<html>
  <head>
..... weiter wie bisher 
In diesem Layout wird bereits vor <HTML> etwas ausgegeben.

Dazu muß dann der Session -relevante Code in ein eigenes Modul ausgelagert werden - in Deinem Fall z.B.

Code: Alles auswählen

session_start(); 
if(isset($_SESSION['captcha_spam']) AND $_POST["sicherheitscode"] == $_SESSION['captcha_spam']){ 
unset($_SESSION['captcha_spam']); 

schließlich noch ein Template aus dem Layout und dem Modul gebaut, alle anderen Container wie bisher belegen.

So geht das bei mir, so habe ich das auch produktiv im Einsatz.

Ich glaube aber, das das nicht ganz 'sauber' ist. da Contenido selbst auch session_start() aufruft, bevor es Seiten generiert. Man hat quasi 2 Sessions nacheinander - dabei habe ich immer ein ungutes Bauch - Gefühl (ich mach' noch nicht lange WEB Programmierung)

Es gibt hier aber auch einen langen Thread über das "kontaktformular mit Spamschutz", vielleicht findest du dort was besseres.
Für die Freizeit : www.hobbybrauer.de

jilalleinzuhaus
Beiträge: 44
Registriert: Sa 5. Jun 2004, 14:25
Wohnort: Frankfurt am Main
Kontaktdaten:

Beitrag von jilalleinzuhaus » Mi 26. Sep 2007, 19:57

Vielen Dank tinof,

deine Antwort hat mir einiges klarer werden lassen.

Ich hab den Thread über das Kontaktformular mit Spamschutz auch gelesen, aber da wird das Standard-Kontaktformular benannt. Ich arbeite aber mit dem w3concept.form.v1 damit mein Kunde selbst Textfelder eingeben kann und da sieht das mit der Einbindung schon wieder ganz anders aus.

Ich probier es aus und melde mich wieder.

jilalleinzuhaus
Beiträge: 44
Registriert: Sa 5. Jun 2004, 14:25
Wohnort: Frankfurt am Main
Kontaktdaten:

Beitrag von jilalleinzuhaus » Mi 26. Sep 2007, 20:15

Ich hab noch eine Frage:

Wenn ich den Code

Code: Alles auswählen

session_start(); 
if(isset($_SESSION['captcha_spam']) AND $_POST["sicherheitscode"] == $_SESSION['captcha_spam']){ 
unset($_SESSION['captcha_spam']);
in ein externes Modul auslagere, wie schließe ich dann diese Funktion?

Ich brauche doch am Ende noch das

Code: Alles auswählen

}
php>
um die Anweisung zu beenden.

Kannst du mir vielleicht deine Seite mal nennen, dann kann ich es besser nachvollziehen.

delinquent
Beiträge: 184
Registriert: Fr 17. Aug 2007, 12:15
Kontaktdaten:

Beitrag von delinquent » Mi 26. Sep 2007, 21:23

Mal eine andere Anregung:

Füg doch einfach mal Testweise in deine Layouts in der allerersten Zeile an erster Stelle

Code: Alles auswählen

<?php ob_start(); ?>
ein und an allerletzter Stelle in die letzte Zeile schreibst Du

Code: Alles auswählen

<?php ob_end_flush(); ?>

Dadurch wird die komplette Ausgabe gepuffert, bis alle Module Ihre Arbeit erledigt haben und dann erst wird der Puffer ausgegeben. Dadurch kannst Du theoretisch auch noch in Deinem Kontaktformular-Modul die session_start()-Methode aufrufen.

Versuch's mal, vielleicht hilft's ja.


Gruß,
delinquent

jilalleinzuhaus
Beiträge: 44
Registriert: Sa 5. Jun 2004, 14:25
Wohnort: Frankfurt am Main
Kontaktdaten:

Beitrag von jilalleinzuhaus » Mi 26. Sep 2007, 22:44

Hab's eingetragen, aber dann geht das komplette Formular flöten. :cry: D.h. bis auf die Grundstruktur wird nichts ausgegeben. Das Modul Kontaktformular wird gar nicht mehr ausgeführt.

Aber trotzdem Danke.

Sonst noch jemand 'ne Idee?

tinof
Beiträge: 197
Registriert: Mi 24. Jan 2007, 20:38
Wohnort: Kirchberg / Sa.
Kontaktdaten:

Beitrag von tinof » Do 27. Sep 2007, 05:08

Hallo nochmal,

ja, sorry, die PHP - Tags habe ich gleich unterschlagen.

Also, du machst ein Modul z.B. mit Namen "Chaptcha_Header" mit folgendem Code im Output (gemäß Deiner Vorlage):

Code: Alles auswählen

<?php 
session_start(); 
if(isset($_SESSION['captcha_spam']) AND $_POST["sicherheitscode"] == $_SESSION['captcha_spam']){ 
unset($_SESSION['captcha_spam']); 
?>
Im ursprünglichen Kontaktformular ergänzt du allen Code, der zum Erzeugen und Abfragen des Captchas notwendig ist. Insbesondere sollte dort irgendwo etwas in der Art stehen

Code: Alles auswählen

session_register('captcha_spam');
Dann legst du ein neues Template an, das das erweiterte Layout verwendet.
In der Template - Vorkonfiguration, ordnest du das neue Modul "Chaptcha_Header" im Container Nummer 101 (der neue) zu.
Das modifizierte Kontaktformular bleibt in dem Container, in dem es jetzt bereits zugeordnet ist - irgendwo im Content. Auch die anderen Module (Navigation ...) kommen in 'ihre' Container.

So sollte es gehen.
Für die Freizeit : www.hobbybrauer.de

jilalleinzuhaus
Beiträge: 44
Registriert: Sa 5. Jun 2004, 14:25
Wohnort: Frankfurt am Main
Kontaktdaten:

Beitrag von jilalleinzuhaus » Do 27. Sep 2007, 13:21

Hab alles mal so eingetragen wie du gesagt hast, aber die erste Anweisung

Code: Alles auswählen

<?php 
session_start(); 
if(isset($_SESSION['captcha_spam']) AND $_POST["sicherheitscode"] == $_SESSION['captcha_spam']){ 
unset($_SESSION['captcha_spam']); 
?>
wird dann vollkommen ignoriert.

Dieser Code soll ja eigentlich in das Modul (bzw. Script) Kontaktformular. Aber wichtig ist, dass die Abfrage stattfindet, bevor das Script verschickt wird. Ich bin mir nur nicht sicher, ob das in der Ausgabe-PHP-Datei vor <HTML> stehen muss oder doch im Modul kontaktformular.php.
Wenn der Code jetzt nur oben drin steht, dann fehlt ja im Prinzip noch die If-Abfrage, damit falls es nicht zutrifft was anderes passiert.

zu 2.
Der Code zum Erzeugen und Abfragen des Captchas liegt in einer eigenen PHP-Datei, die man laut Tutorial per FTP in ein Verzeichnis laden muss.

Könnte es daran liegen, dass Contenido mit der nur hochgeladenen und nicht im System eingetragenen Datei captcha.php Probleme hat? Muss ich den Code von dort in das Kontaktformular übernehmen?

Hier der captcha.php Code:

Code: Alles auswählen

<?php 
   session_start(); 
   unset($_SESSION['captcha_spam']); 

   function randomString($len) { 
      function make_seed(){ 
         list($usec , $sec) = explode (' ', microtime()); 
         return (float) $sec + ((float) $usec * 100000); 
      } 
      srand(make_seed());   
                        
      //Der String $possible enthält alle Zeichen, die verwendet werden sollen 
      $possible="ABCDEFGHJKLMNPRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789"; 
      $str=""; 
      while(strlen($str)<$len) { 
        $str.=substr($possible,(rand()%(strlen($possible))),1); 
      } 
   return($str); 
   } 

   $text = randomString(5);  //Die Zahl bestimmt die Anzahl stellen 
   $_SESSION['captcha_spam'] = $text; 
          
   header('Content-type: image/png'); 
   $img = ImageCreateFromPNG('captcha.PNG'); //Backgroundimage 
   $color = ImageColorAllocate($img, 0, 0, 0); //Farbe 
   $ttf = $_SERVER['DOCUMENT_ROOT']."/captcha/XFILES.TTF"; //Schriftart 
   $ttfsize = 25; //Schriftgrösse 
   $angle = rand(0,5); 
   $t_x = rand(5,30); 
   $t_y = 35; 
   imagettftext($img, $ttfsize, $angle, $t_x, $t_y, $color, $ttf, $text); 
   imagepng($img); 
   imagedestroy($img); 
?>

jilalleinzuhaus
Beiträge: 44
Registriert: Sa 5. Jun 2004, 14:25
Wohnort: Frankfurt am Main
Kontaktdaten:

Beitrag von jilalleinzuhaus » So 30. Sep 2007, 21:17

Ich bin jetzt zu dem Entschluß gekommen, das funktionierende Modul "Kontaktformular mit Captcha" zu nehmen und mein Kontaktformular dahingehend umzubauen.
Ist zwar auch ein Haufen Arbeit jedes Kästchen wieder in den PHP-Code einzubauen, aber besser als das lange Rumtüfteln und doch zu keinem Ergebnis kommen. Schade zwar, aber ändern kann ich's ja nun mal nicht. :cry:

jilalleinzuhaus
Beiträge: 44
Registriert: Sa 5. Jun 2004, 14:25
Wohnort: Frankfurt am Main
Kontaktdaten:

Lösung gefunden

Beitrag von jilalleinzuhaus » Sa 13. Okt 2007, 21:02

Ich konnte mich mit meinem Entschluß doch das andere Formular-Modul zu verwenden nicht abfinden und habe jetzt, dank einer guten Freundin, die fertige Lösung meines Problems. Die will ich Euch nicht vorhalten.

Ihr braucht für das Formular mit Captcha (und sogar der Möglichkeit des Dateianhangs) (Ursprung "w3concepts.form.v1"):

- einen Artikel mit dem Formular-Code, z.B.

Code: Alles auswählen

<table border="0" width="100%" align="center">
				<tr>
					<td valign="top"><font color="#ff9900">Bemerkung:</font></td>
					<td>###name:Bemerkung; type:textarea; rows:5; cols:50###</td>
				</tr>
				<tr>
					<td>&nbsp;</td>
					<td>&nbsp;</td>
				</tr>
				<tr>
					<td valign="top"><font color="#ff9900">Sicherheitscode:</font></td>
					<td>
						<p><strong>Bitte geben Sie folgenden Sicherheitscode in das Textfeld ein, damit das Formular versendet werden kann.</strong></p>
						<p><img src="captcha/captcha.php" border="0" alt="Sicherheitscode" title="Sicherheitscode" width="140" height="40" />&nbsp;&nbsp;&nbsp;###name:Sicherheitscode; type:text; size:5###</p>
					</td>
				</tr>
				<tr>
					<td>&nbsp;</td>
					<td>
						<input type="submit" value="Abschicken" />
						<input type="reset" value="Eintr&auml;ge l&ouml;schen" />
					</td>
				</tr>
			</table>
- das Kontaktformular-Modul
Input

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 class=\"text_medium\">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 class=\"text_medium\">Betreff:</td>";
echo "<td><input type=\"text\" name=\"CMS_VAR[1]\" value=\"CMS_VALUE[1]\" size=\"30\" /></td></tr>";

echo "<tr><td class=\"text_medium\">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 class=\"text_medium\">E-Mailname (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 class=\"text_medium\">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>";
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    :     20-08-2004 
************************************************/ 
#Includes 
cInclude("classes", "class.phpmailer.php"); 

class w3form { 

   var $email, $aufgedroeselt, $form, $formularFeld, $attachments; 
   
   function w3form() { 
   } 

   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 sendEmail() { 
#      global $attachments; 
#      $this->aufdroeseln($this->suppress('sent','anhang[]')); 
#      $this->generateEmailMessage(); 
#      $mail = new phpmailer; 	  
#      $mail->IsSMTP(); 
#      $mail->Host = "localhost"; 
#      $mail->From = $this->email['from']['email']; 
#      $mail->FromName = $this->email['from']['name']; 
#      $mail->AddAddress($this->email['adresses']); 
#      foreach($attachments as $key3 => $value3) { //loop the Attachments to be added … 
#         $mail->AddAttachment("upload/".$value3); 
#      } 
#      $mail->Subject = $this->email['subject']; 
#      $mail->Body = $this->email['message']; 
#      $mail->WordWrap = 1000; 
#      $mail->Send(); 
#      foreach($attachments as $key => $value) {//remove the uploaded files .. 
#         unlink("upload/".$value); 
#      } 
#   } 

   // 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); 
      } 
      $this->uploadFile(); 
   } 

function uploadFile() { 
   global $attachments; 
   $attachments = array(); 
   if(count($_FILES[anhang]['name']) > 0)	{
	   while(list($key2,$value2) = each($_FILES[anhang]['name'])) 
	   { 
	      if(!empty($value2)) 
	      { 
	         $filename = $value2; 
	         //the Array will be used later to attach the files and then remove them from server ! 
	         $attachments[] = $filename; 
	         $dir = 'upload/'.$filename; 
	         $success = copy($_FILES[anhang]['tmp_name'][$key2], $dir); 
	
	
	      } 
	   } 
	}
	
   #if ($success) { 
   #   echo "<p>Die Daten wurden erfolgreich hochgeladen.</p>"; 
   #} else { 
   #   echo "<p>Es wurden keine Daten hochgeladen.</p>"; 
   #} 

} 



   // 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" enctype="multipart/form-data">'; 
      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) { 
$anhaenge = array(); 
$parameter = "name=\"{$attribute['name']}\""; 

      #if ($sent && !$this->formularFeldKorrekt($attribute)) $style ="style=\"background-color:{$this->form['colorError']};\""; 
      if ($sent && !$this->formularFeldKorrekt($attribute) && $attribute['name'] == 'Sicherheitscode') $style ="style=\"background-color:{$this->form['colorError']};\"";       

      switch ($attribute['type']) { 
         case 'select': 
         case 'password': 
         case 'file': 
         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 'file': 
            echo "<input type=\"file\" name=\"anhang[]\" $style />"; 
            $anhaenge[] = $attribute['name']; 
            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']) { 			 
			   #if (array_search($attribute['value'], $_POST[$formularbezeichner[0]])) { 			 
                  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) { 
  
      // schauen, ob sicherheitscode richtig ist	 
	 if(!$_SESSION['captcha_spam'] OR $_POST["Sicherheitscode"] != $_SESSION['captcha_spam']) return false;
	  
      // 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 { 
	  	 echo '&nbsp;<font color="red">Sie haben den Sicherheitscode nicht richtig eingegeben. Bitte überprüfen Sie Ihre Angabe nocheinmal.<br></font>';
         $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(); 
} 

?>
- ein Template, dass das Kontaktformular-Modul enthält
- ein "Snippet", dass den Code

Code: Alles auswählen

<?php 
   session_start(); 
?>
im Head-Bereich der Ausgabe einfügt. (Wie man ein Snippet einbaut, könnt ihr hier lesen.)

- und dann noch die 3 wichtigen Dateien für das Captcha selbst. Die könnt ihr Euch hier downloaden:
- captcha.php
- captcha.PNG
- XFILES.TTF
Diese speichert ihr in einen Ordner "captcha" und ladet sie per FTP ins "cms"-Verzeichnis.

Ich hoffe, ich kann damit nun auch anderen helfen. Viel Erfolg beim Probieren.
Zuletzt geändert von jilalleinzuhaus am Sa 20. Okt 2007, 20:32, insgesamt 2-mal geändert.

derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Re: Lösung gefunden

Beitrag von derSteffen » Mo 15. Okt 2007, 07:59

Hallo jilalleinzuhaus, vielen Dank für deine Mühe, leider klappen die Links nicht (zumindes die ersten beiden nicht).

Sind denn viele Änderungen im Modul-Output vorzunehmen? Oder wäre es auch möglich das du nur die Passagen postest, welche Ihr geändert habt und wo diese Änderungen reinkommen? Das wäre fein.

Klasse Arbeit - Danke

jilalleinzuhaus
Beiträge: 44
Registriert: Sa 5. Jun 2004, 14:25
Wohnort: Frankfurt am Main
Kontaktdaten:

Beitrag von jilalleinzuhaus » Sa 20. Okt 2007, 20:29

Die Links hab ich korrigiert. Da war was mit der Groß- und Kleinschreibung nicht richtig. Das PHP-File musste ich als txt-Datei speichern, sonst kann man es nicht runterladen. Die Datei muss dann wieder von "captcha.php.txt" in "captcha.php" umbenannt werden.

Ich kann nur sagen, dass in dem Code dieser Bereich für das Captcha verantwortlich ist:

Code: Alles auswählen

// PRIVATE 
   function formularFeldKorrekt($feld) { 
  
      // schauen, ob sicherheitscode richtig ist    
    if(!$_SESSION['captcha_spam'] OR $_POST["Sicherheitscode"] != $_SESSION['captcha_spam']) return false;
Ich hab den Code nicht selbst geschrieben, sondern mir von einer Freundin helfen lassen.

derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Beitrag von derSteffen » Mo 22. Okt 2007, 09:40

tolle Freundin :)

kreativsteffi
Beiträge: 40
Registriert: Di 13. Mär 2007, 14:21
Wohnort: Jena
Kontaktdaten:

Beitrag von kreativsteffi » So 2. Dez 2007, 04:09

Hey,

ich komm hier einfach nicht weiter. Habe diesen Snippet als Modul eingebaut. Aber ich verstehe nicht, wo ich ihn platzieren muss, dass der mir das
<?php
session_start();
?>
im Headbereich der Ausgabe einfügt. Was muss ich da tun?

Liebe Grüße und danke Steffi

Tinu
Beiträge: 1
Registriert: Mi 19. Dez 2007, 14:34
Kontaktdaten:

Beitrag von Tinu » Mi 19. Dez 2007, 15:10

Vielen Dank für die Captcha Integration von jilalleinzuhaus in dieses wirklich sehr gute Formular-Modul von Kummer.

Was mir an "seiner" Captcha-Variante nicht so gefällt, ist dass im Output Code die Fehlerprüfung auskommentiert wurde.

Ich hab dann mit Copy/Paste folgendes zusammengeschustert:

Code: Alles auswählen


 // PRIVATE
function formularFeldKorrekt(&$feld) {

      // prüfung, ob pflichtfeld vorhanden
      if (!empty($feld['mandatory']) && $feld['mandatory'] == 'true' && empty($_POST["{$feld['name']}"])) return false;

// Sicherheitsfeld prüfen 
if(!$_SESSION['captcha_spam'] OR $_POST["Sicherheitscode"] != $_SESSION['captcha_spam']) 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;
   }
Dies würde dann bedeuten das am Original Outputmodul von Kummer nur eine Zeile hinzugefügt werden müsste ->

Code: Alles auswählen

// Sicherheitsfeld prüfen 
if(!$_SESSION['captcha_spam'] OR $_POST["Sicherheitscode"] != $_SESSION['captcha_spam']) return false;
Ansonsten funzt der Weg wie ihn jilalleinzuhaus beschrieben hat.

Merci!

Gesperrt