]> git.p6c8.net - form-email.git/commitdiff
Bisherige Aenderungen ins SVN kopiert:
authorPatrick Canterino <patrick@patshaping.de>
Fri, 2 Dec 2011 20:17:36 +0000 (20:17 +0000)
committerPatrick Canterino <patrick@patshaping.de>
Fri, 2 Dec 2011 20:17:36 +0000 (20:17 +0000)
- Anderer Programmierstil
- Lizenz zur Artistic License 2.0 geaendert
- Erster Versuch fuer die individuellen Formularfelder
- Template-Klasse auf 2.5 aktualisiert

form-email/captcha.php
form-email/class.Template.php
form-email/config.php
form-email/functions.php
form-email/mailer.php

index f796b465293e91b665d33af1082b06d4077681b2..2672cc3d6df643cb55830ebf24e3c2d729b35179 100644 (file)
 <?php\r
 \r
 #\r
-# Form E-Mail 3.4.1 - captcha.php\r
+# Form E-Mail 3.5 - captcha.php\r
 #\r
 # Generieren eines Captcha-Bilds\r
 #\r
 # Autor:            Patrick Canterino <patrick@patshaping.de>\r
-# Letzte Aenderung: 11.1.2009\r
+# Letzte Aenderung: 7.11.2011\r
 #\r
 # Copyright (C) 2002-2011 Patrick Canterino\r
 #\r
-# Diese Datei kann unter den Bedingungen der "Artistic License 1.0"\r
+# Diese Datei kann unter den Bedingungen der "Artistic License 2.0"\r
 # weitergegeben und / oder veraendert werden.\r
 # Siehe:\r
-# http://www.opensource.org/licenses/artistic-license-1.0.php\r
+# http://www.opensource.org/licenses/artistic-license-2.0\r
 #\r
 \r
 require('config.php');\r
 require('functions.php');\r
 require('class.Template.php');\r
 \r
-if($captcha_enable)\r
-{\r
- session_start();\r
+if($captcha_enable) {\r
+    session_start();\r
 \r
- if($captcha_max && isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed'] >= $captcha_max)\r
- {\r
-  show_fatal($err_captcha_max);\r
- }\r
- else\r
- {\r
-  unset($_SESSION['captcha']);\r
+    if($captcha_max && isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed'] >= $captcha_max) {\r
+        show_fatal($err_captcha_max);\r
+    }\r
+    else {\r
+        unset($_SESSION['captcha']);\r
 \r
-  # Zufaellige Zeichenkette erzeugen\r
+        # Zufaellige Zeichenkette erzeugen\r
 \r
-  $captcha_string = '';\r
+        $captcha_string = '';\r
 \r
-  $x = 0;\r
-  srand();\r
+        $x = 0;\r
+        srand();\r
 \r
-  while($x<$captcha_length)\r
-  {\r
-   $rand = rand(0,strlen($captcha_possible)-1);\r
-   $captcha_string .= $captcha_possible[$rand];\r
+        while($x<$captcha_length) {\r
+            $rand = rand(0,strlen($captcha_possible)-1);\r
+            $captcha_string .= $captcha_possible[$rand];\r
 \r
-   $x++;\r
-  }\r
+            $x++;\r
+        }\r
 \r
-  $_SESSION['captcha'] = $captcha_string;\r
+        $_SESSION['captcha'] = $captcha_string;\r
 \r
-  # Ein Bild mit dem generierten Text erzeugen\r
+        # Ein Bild mit dem generierten Text erzeugen\r
 \r
-  if($captcha_image_bg && file_exists($captcha_image_bg))\r
-  {\r
-   # Es wurde ein Hintergrundbild angegeben\r
+        if($captcha_image_bg && file_exists($captcha_image_bg)) {\r
+            # Es wurde ein Hintergrundbild angegeben\r
 \r
-   $captcha_img = imagecreatefrompng($captcha_image_bg);\r
+            $captcha_img = imagecreatefrompng($captcha_image_bg);\r
 \r
-   $image_size = getimagesize($captcha_image_bg);\r
-   $captcha_width = $image_size[0];\r
-   $captcha_height = $image_size[1];\r
-  }\r
-  else\r
-  {\r
-   # Es wurde kein Hintergrundbild angegeben\r
+            $image_size = getimagesize($captcha_image_bg);\r
+            $captcha_width = $image_size[0];\r
+            $captcha_height = $image_size[1];\r
+        }\r
+        else {\r
+            # Es wurde kein Hintergrundbild angegeben\r
 \r
-   $captcha_img = imagecreate($captcha_width,$captcha_height);\r
-  }\r
+            $captcha_img = imagecreate($captcha_width,$captcha_height);\r
+        }\r
 \r
-  $white = imagecolorallocate($captcha_img,$captcha_color_bg[0],$captcha_color_bg[1],$captcha_color_bg[2]);\r
-  $black = imagecolorallocate($captcha_img,$captcha_color_text[0],$captcha_color_text[1],$captcha_color_text[2]);\r
+        $white = imagecolorallocate($captcha_img,$captcha_color_bg[0],$captcha_color_bg[1],$captcha_color_bg[2]);\r
+        $black = imagecolorallocate($captcha_img,$captcha_color_text[0],$captcha_color_text[1],$captcha_color_text[2]);\r
 \r
-  $angle = rand($captcha_angle[0],$captcha_angle[1]);\r
-  $t_x = rand($captcha_x[0],$captcha_y[1]);\r
-  $t_y = rand($captcha_y[0],$captcha_y[1]);\r
\r
-  imagettftext($captcha_img,$captcha_font_size,$angle,$t_x,$t_y,$black,$captcha_font,$captcha_string);\r
+        $angle = rand($captcha_angle[0],$captcha_angle[1]);\r
+        $t_x = rand($captcha_x[0],$captcha_y[1]);\r
+        $t_y = rand($captcha_y[0],$captcha_y[1]);\r
 \r
-  # Zufaellige Linien einfuegen\r
+        imagettftext($captcha_img,$captcha_font_size,$angle,$t_x,$t_y,$black,$captcha_font,$captcha_string);\r
 \r
-  $y = 0;\r
+        # Zufaellige Linien einfuegen\r
 \r
-  while($y<$captcha_lines)\r
-  {\r
-   $begin_x = rand(0,$captcha_width);\r
-   $begin_y = rand(0,$captcha_height);\r
-   $end_x = rand(0,$captcha_width);\r
-   $end_y = rand(0,$captcha_height);\r
+        $y = 0;\r
 \r
-   imageline($captcha_img,$begin_x,$begin_y,$end_x,$end_y,$black);\r
+        while($y<$captcha_lines) {\r
+            $begin_x = rand(0,$captcha_width);\r
+            $begin_y = rand(0,$captcha_height);\r
+            $end_x = rand(0,$captcha_width);\r
+            $end_y = rand(0,$captcha_height);\r
 \r
-   $y++;\r
-  }\r
+            imageline($captcha_img,$begin_x,$begin_y,$end_x,$end_y,$black);\r
 \r
-  # Bild ausgeben\r
+            $y++;\r
+        }\r
 \r
-  header('Content-type: image/png');\r
-  imagepng($captcha_img);\r
+        # Bild ausgeben\r
 \r
-  imagedestroy($captcha_img);\r
- }\r
+        header('Content-type: image/png');\r
+        imagepng($captcha_img);\r
+\r
+        imagedestroy($captcha_img);\r
+    }\r
 }\r
-else\r
-{\r
- show_fatal($err_captcha_disabled);\r
+else {\r
+    show_fatal($err_captcha_disabled);\r
 }\r
 \r
 #\r
index ad6dc0ecc98875c3f38d32d2a53b3e5b6291d946..5b43d0b5ff9d4d7b62f5142d2a7819182ab5ccbe 100644 (file)
 <?php\r
 \r
 #\r
-# Template (Version 2.0)\r
+# Template (Version 2.5)\r
 #\r
 # Klasse zum Parsen von Templates\r
 #\r
 # Autor:            Patrick Canterino <patrick@patshaping.de>\r
-# Letzte Aenderung: 3.7.2006\r
+# Letzte Aenderung: 25.11.2011\r
+#\r
+# Copyright (C) 2002-2011 Patrick Canterino\r
+#\r
+# Diese Datei kann unter den Bedingungen der "Artistic License 2.0"\r
+# weitergegeben und / oder veraendert werden.\r
+# Siehe:\r
+# http://www.opensource.org/licenses/artistic-license-2.0\r
 #\r
 \r
-class Template\r
-{\r
- var $file;\r
- var $template;\r
- var $original;\r
- var $vars = array();\r
- var $defined_vars = array();\r
- var $loop_vars = array();\r
-\r
- # get_template()\r
- #\r
- # Kompletten Vorlagentext zurueckgeben\r
- #\r
- # Parameter: -keine-\r
- #\r
- # Rueckgabe: Kompletter Vorlagentext (String)\r
-\r
- function get_template()\r
- {\r
-  return $this->template;\r
- }\r
-\r
- # set_template()\r
- #\r
- # Kompletten Vorlagentext aendern\r
- #\r
- # Parameter: Vorlagentext\r
- #\r
- # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
-\r
- function set_template($text)\r
- {\r
-  $this->template = $text;\r
- }\r
-\r
- # add_text()\r
- #\r
- # Vorlagentext ans Template-Objekt anhaengen\r
- #\r
- # Parameter: Vorlagentext\r
- #\r
- # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
-\r
- function add_text($text)\r
- {\r
-  $this->set_template($this->get_template().$text);\r
- }\r
-\r
- # read_file()\r
- #\r
- # Einlesen einer Vorlagendatei und {INCLUDE}-Anweisungen ggf. verarbeiten\r
- # (Text wird an bereits vorhandenen Text angehaengt)\r
- #\r
- # Parameter: 1. Datei zum Einlesen\r
- #            2. Status-Code (Boolean):\r
- #               true  => {INCLUDE}-Anweisungen nicht verarbeiten\r
- #               false => {INCLUDE}-Anweisungen verarbeiten (Standard)\r
- #\r
- # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
-\r
- function read_file($file,$not_include=0)\r
- {\r
-  $this->file = $file;\r
-\r
-  if(filesize($file) > 0)\r
-  {\r
-   $fp = fopen($file,'r');\r
-   if(!$fp) die;\r
-   $content = fread($fp,filesize($file));\r
-   fclose($fp);\r
-  }\r
-  else $content = '';\r
-\r
-  $this->add_text($content);\r
-  $this->save_state();\r
-\r
-  if(!$not_include) $this->parse_includes();\r
- }\r
-\r
- # set_var()\r
- #\r
- # Wert einer Variable setzen\r
- #\r
- # Parameter: 1. Name der Variable\r
- #            2. Wert, den die Variable erhalten soll\r
- #\r
- # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
-\r
- function set_var($var,$content)\r
- {\r
-  $this->vars[$var] = $content;\r
- }\r
-\r
- # get_var()\r
- #\r
- # Wert einer Variable zurueckgeben\r
- #\r
- # Parameter: (optional) Variablenname\r
- #\r
- # Rueckgabe: Wert der Variable;\r
- #            wenn die Variable nicht existiert, false;\r
- #            wenn kein Variablenname angegeben wurde, wird ein\r
- #            Array mit den Variablennamen zurueckgegeben\r
-\r
- function get_var($var=false)\r
- {\r
-  if($var !== false)\r
-  {\r
-   if(isset($this->vars[$var]))\r
-   {\r
-    return $this->vars[$var];\r
-   }\r
-   else\r
-   {\r
-    return false;\r
-   }\r
-  }\r
-  else\r
-  {\r
-   return array_keys($this->vars);\r
-  }\r
- }\r
-\r
- # set_loop_data()\r
- #\r
- # Daten fuer eine Schleife setzen\r
- #\r
- # Parameter: 1. Name der Schleife\r
- #            2. Array mit den Arrays mit den Variablen fuer\r
- #               die Schleifendurchgaenge\r
- #\r
- # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
-\r
- function set_loop_data($loop,$data)\r
- {\r
-  $this->loop_vars[$loop] = $data;\r
- }\r
-\r
- # add_loop_data()\r
- #\r
- # Daten fuer einen Schleifendurchgang hinzufuegen\r
- #\r
- # Parameter: 1. Name der Schleife\r
- #            2. Array mit den Variablen fuer den\r
- #               Schleifendurchgang\r
- #\r
- # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
-\r
- function add_loop_data($loop,$data)\r
- {\r
-  if(isset($this->loop_vars[$loop]) && is_array($this->loop_vars[$loop]))\r
-  {\r
-   array_push($this->loop_vars[$loop],$data);\r
-  }\r
-  else\r
-  {\r
-   $this->loop_vars[$loop] = array($data);\r
-  }\r
- }\r
-\r
- # parse()\r
- #\r
- # In der Template definierte Variablen auslesen, Variablen\r
- # ersetzen, {IF}- und {TRIM}-Bloecke parsen\r
- #\r
- # Parameter: -nichts-\r
- #\r
- # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
-\r
- function parse()\r
- {\r
-  # Zuerst die Schleifen parsen\r
-\r
-  if(is_array($this->loop_vars) && ($loops = array_keys($this->loop_vars)))\r
-  {\r
-   foreach($loops as $loop)\r
-   {\r
-    $this->parse_loop($loop);\r
-   }\r
-  }\r
-\r
-  # Normale Variablen durchgehen\r
-\r
-  if(($vars = $this->get_var()) !== false && is_array($vars))\r
-  {\r
-   foreach($vars as $var)\r
-   {\r
-    $val = $this->get_var($var);\r
-\r
-    $this->parse_if_block($var,$val);\r
-\r
-    if(is_array($val))\r
-    {\r
-     $this->fillin_array($var,$val);\r
+class Template {\r
+    var $file;\r
+    var $template;\r
+    var $original;\r
+    var $old_parsing = 0;\r
+    var $vars = array();\r
+    var $defined_vars = array();\r
+    var $loop_vars = array();\r
+\r
+    # get_template()\r
+    #\r
+    # Kompletten Vorlagentext zurueckgeben\r
+    #\r
+    # Parameter: -keine-\r
+    #\r
+    # Rueckgabe: Kompletter Vorlagentext (String)\r
+\r
+    function get_template() {\r
+        return $this->template;\r
     }\r
-    else\r
-    {\r
-     $this->fillin($var,$val);\r
+\r
+    # set_template()\r
+    #\r
+    # Kompletten Vorlagentext aendern\r
+    #\r
+    # Parameter: Vorlagentext\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+    function set_template($text) {\r
+        $this->template = $text;\r
     }\r
 \r
-    unset($val);\r
-   }\r
-  }\r
-\r
-  # Jetzt dasselbe mit denen, die direkt in der Template-Datei definiert\r
-  # sind, machen. Ich weiss, dass das eine ziemlich unsaubere Loesung ist,\r
-  # aber es funktioniert\r
-\r
-  $this->get_defined_vars();\r
-\r
-  foreach($this->defined_vars as $var)\r
-  {\r
-   $val = $this->get_var($var);\r
-\r
-   $this->parse_if_block($var,$val);\r
-   $this->fillin($var,$val);\r
-\r
-   unset($val);\r
-  }\r
-\r
-  # {TRIM}-Bloecke entfernen\r
-\r
-  $this->parse_trim_blocks();\r
- }\r
-\r
- # fillin()\r
- #\r
- # Variablen durch Text ersetzen\r
- #\r
- # Parameter: 1. Variable zum Ersetzen\r
- #            2. Text, durch den die Variable ersetzt werden soll\r
- #\r
- # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
-\r
- function fillin($var,$text)\r
- {\r
-  $template = $this->get_template();\r
-  $template = str_replace('{'.$var.'}',$text,$template);\r
-\r
-  $this->set_template($template);\r
- }\r
-\r
- # fillin_array()\r
- #\r
- # Variable durch Array ersetzen\r
- #\r
- # Parameter: 1. Variable zum Ersetzen\r
- #            2. Array, durch das die Variable ersetzt werden soll\r
- #            3. Zeichenkette, mit der das Array verbunden werden soll\r
- #               (Standard: '')\r
- #\r
- # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
-\r
- function fillin_array($var,$array,$glue='')\r
- {\r
-  $this->fillin($var,implode($glue,$array));\r
- }\r
-\r
- # to_file()\r
- #\r
- # Template in Datei schreiben\r
- #\r
- # Parameter: Datei-Handle\r
- #\r
- # Rueckgabe: Status-Code (Boolean)\r
-\r
- function to_file($handle)\r
- {\r
-  return @fwrite($handle,$this->get_template());\r
- }\r
-\r
- # reset()\r
- #\r
- # Den gesicherten Stand des Template-Textes sichern\r
- #\r
- # Parameter: -nichts-\r
- #\r
- # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
-\r
- function reset()\r
- {\r
-  $this->template = $this->original;\r
- }\r
-\r
- # save_state()\r
- #\r
- # Aktuellen Stand des Template-Textes sichern\r
- # (alte Sicherung wird ueberschrieben)\r
- #\r
- # Parameter: -nichts-\r
- #\r
- # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
-\r
- function save_state()\r
- {\r
-  $this->original = $this->template;\r
- }\r
-\r
- # parse_loop()\r
- #\r
- # Eine Schleife parsen\r
- #\r
- # Parameter: Name der Schleife\r
- #\r
- # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
-\r
- function parse_loop($name)\r
- {\r
-  $template = $this->get_template();\r
-  if(strpos($template,'{LOOP '.$name.'}') === false) return;\r
-\r
-  $offset   = 0;\r
-  $name_len = strlen($name);\r
-\r
-  while(($begin = strpos($template,'{LOOP '.$name.'}',$offset)) !== false)\r
-  {\r
-   if(($end = strpos($template,'{ENDLOOP}',$begin+6+$name_len)) !== false)\r
-   {\r
-    $block   = substr($template,$begin,$end+9-$begin);\r
-    $content = substr($block,$name_len+7,-9);\r
-\r
-    $parsed_block = '';\r
-\r
-    for($x=0;$x<count($this->loop_vars[$name]);$x++)\r
-    {\r
-     $loop_data = $this->loop_vars[$name][$x];\r
-     $loop_vars = array_keys($loop_data);\r
-\r
-     $ctpl = new Template;\r
-     $ctpl->set_template($content);\r
-\r
-     foreach($loop_vars as $loop_var)\r
-     {\r
-      $ctpl->set_var($name.'.'.$loop_var,$loop_data[$loop_var]);\r
-     }\r
-\r
-     $ctpl->parse();\r
-     $parsed_block .= $ctpl->get_template();\r
-\r
-     unset($ctpl);\r
+    # add_text()\r
+    #\r
+    # Vorlagentext ans Template-Objekt anhaengen\r
+    #\r
+    # Parameter: Vorlagentext\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+    function add_text($text) {\r
+        $this->set_template($this->get_template().$text);\r
     }\r
 \r
-    $template = str_replace($block,$parsed_block,$template);\r
-    $offset   = $begin+strlen($parsed_block);\r
-   }\r
-   else break;\r
-  }\r
-\r
-  $this->set_template($template);\r
- }\r
-\r
- # get_defined_vars()\r
- #\r
- # In der Template-Datei definierte Variablen auslesen\r
- #\r
- # Parameter: -nichts-\r
- #\r
- # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
-\r
- function get_defined_vars()\r
- {\r
-  $template = $this->get_template();\r
-  if(strpos($template,'{DEFINE ') === false) return;\r
-\r
-  $offset = 0;\r
-\r
-  while(strpos($template,'{DEFINE ',$offset) !== false)\r
-  {\r
-   $begin  = strpos($template,'{DEFINE ',$offset)+8;\r
-   $offset = $begin;\r
-\r
-   $name    = '';\r
-   $content = '';\r
-\r
-   $var_open     = 0;\r
-   $name_found   = 0;\r
-   $define_block = 0;\r
-\r
-   for($x=$begin;$x<strlen($template);$x++)\r
-   {\r
-    if($template[$x] == "\012" || $template[$x] == "\015")\r
-    {\r
-     # Wenn in einem {DEFINE}-Block ein Zeilenumbruch gefunden wird,\r
-     # brechen wir mit dem Parsen des Blockes ab\r
-\r
-     break;\r
+    # read_file()\r
+    #\r
+    # Einlesen einer Vorlagendatei und {INCLUDE}-Anweisungen ggf. verarbeiten\r
+    # (Text wird an bereits vorhandenen Text angehaengt)\r
+    #\r
+    # Parameter: 1. Datei zum Einlesen\r
+    #            2. Status-Code (Boolean):\r
+    #               true  => {INCLUDE}-Anweisungen nicht verarbeiten\r
+    #               false => {INCLUDE}-Anweisungen verarbeiten (Standard)\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+    function read_file($file,$not_include=0) {\r
+        $this->file = $file;\r
+\r
+        if(filesize($file) > 0) {\r
+            $fp = fopen($file,'r');\r
+            if(!$fp) die;\r
+            $content = fread($fp,filesize($file));\r
+            fclose($fp);\r
+        }\r
+        else $content = '';\r
+\r
+        $this->add_text($content);\r
+        $this->save_state();\r
+\r
+        if(!$not_include) $this->parse_includes();\r
     }\r
 \r
-    if($var_open == 1)\r
-    {\r
-     if($template[$x] == '"')\r
-     {\r
-      # Der Inhalt der Variable ist hier zu Ende\r
+    # set_var()\r
+    #\r
+    # Wert einer Variable setzen\r
+    #\r
+    # Parameter: 1. Name der Variable\r
+    #            2. Wert, den die Variable erhalten soll\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+    function set_var($var,$content) {\r
+        $this->vars[$var] = $content;\r
+    }\r
 \r
-      $var_open = 0;\r
+    # get_var()\r
+    #\r
+    # Wert einer Variable zurueckgeben\r
+    #\r
+    # Parameter: (optional) Variablenname\r
+    #\r
+    # Rueckgabe: Wert der Variable;\r
+    #            wenn die Variable nicht existiert, false;\r
+    #            wenn kein Variablenname angegeben wurde, wird ein\r
+    #            Array mit den Variablennamen zurueckgegeben\r
+\r
+    function get_var($var=false) {\r
+        if($var !== false) {\r
+            if(isset($this->vars[$var])) {\r
+                return $this->vars[$var];\r
+            }\r
+            else {\r
+                return false;\r
+            }\r
+        }\r
+        else {\r
+            return array_keys($this->vars);\r
+        }\r
+    }\r
 \r
-      if($template[$x+1] == '}')\r
-      {\r
-       # Hier ist der Block zu Ende\r
+    # set_vars()\r
+    #\r
+    # Komplettes Variablen-Array mit einem anderen Array ueberschreiben\r
+    #\r
+    # Parameter: Array\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
 \r
-       if($this->get_var($name) === false)\r
-       {\r
-        # Die Variable wird nur gesetzt, wenn sie nicht bereits gesetzt ist\r
+    function set_vars($vars) {\r
+        $this->vars = $vars;\r
+    }\r
 \r
-        $this->set_var($name,$content);\r
-        array_push($this->defined_vars,$name);\r
-       }\r
+    # add_vars()\r
+    #\r
+    # Zum bestehenden Variablen-Array weitere Variablen in Form eines Arrays\r
+    # hinzufuegen\r
+    #\r
+    # Parameter: Array\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+    function add_vars($vars) {\r
+        $this->vars = array_merge($this->vars,$vars);\r
+    }\r
 \r
-       # {DEFINE}-Block entfernen\r
+    # set_loop_data()\r
+    #\r
+    # Daten fuer eine Schleife setzen\r
+    #\r
+    # Parameter: 1. Name der Schleife\r
+    #            2. Array mit den Arrays mit den Variablen fuer\r
+    #               die Schleifendurchgaenge\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+    function set_loop_data($loop,$data) {\r
+        $this->loop_vars[$loop] = $data;\r
+    }\r
 \r
-       $pre  = substr($template,0,$begin-8);\r
-       $post = substr($template,$x+2);\r
+    # add_loop_data()\r
+    #\r
+    # Daten fuer einen Schleifendurchgang hinzufuegen\r
+    #\r
+    # Parameter: 1. Name der Schleife\r
+    #            2. Array mit den Variablen fuer den\r
+    #               Schleifendurchgang\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+    function add_loop_data($loop,$data) {\r
+        if(isset($this->loop_vars[$loop]) && is_array($this->loop_vars[$loop])) {\r
+            array_push($this->loop_vars[$loop],$data);\r
+        }\r
+        else {\r
+            $this->loop_vars[$loop] = array($data);\r
+        }\r
+    }\r
+    \r
+    # parse()\r
+    #\r
+    # In der Template definierte Variablen auslesen, Variablen\r
+    # ersetzen, {IF}- und {TRIM}-Bloecke parsen\r
+    #\r
+    # Parameter: -nichts-\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+    function parse() {\r
+        if($this->old_parsing) return $this->parse_old();\r
+\r
+        # Zuerst die Schleifen parsen\r
+\r
+        if(is_array($this->loop_vars) && ($loops = array_keys($this->loop_vars))) {\r
+            foreach($loops as $loop) {\r
+                $this->parse_loop($loop);\r
+            }\r
+        }\r
 \r
-       $template = $pre.$post;\r
+        # In Template-Datei definierte Variablen auslesen\r
 \r
-       # Fertig!\r
+        $this->get_defined_vars();\r
 \r
-       $offset = strlen($pre);\r
-       break;\r
-      }\r
-     }\r
-     elseif($template[$x] == '\\')\r
-     {\r
-      # Ein Backslash wurde gefunden, er dient zum Escapen von Zeichen\r
+        # Variablen ersetzen\r
 \r
-      if($template[$x+1] == 'n')\r
-      {\r
-       # "\n" in Zeilenumbrueche umwandeln\r
+        if(($vars = $this->get_var()) !== false && is_array($vars)) {\r
+            $this->parse_if_blocks();\r
+            $this->replace_vars();\r
+        }\r
 \r
-       $content .= "\n";\r
-      }\r
-      else $content .= $template[$x+1];\r
+        # {TRIM}-Bloecke entfernen\r
 \r
-      $x++;\r
-     }\r
-     else $content .= $template[$x];\r
+        $this->parse_trim_blocks();\r
     }\r
-    else\r
-    {\r
-     if($name_found == 1)\r
-     {\r
-      if($var_open == 0)\r
-      {\r
-       if($template[$x] == '"') $var_open = 1;\r
-       else break;\r
-      }\r
-     }\r
-     else\r
-     {\r
-      # Variablennamen auslesen\r
-\r
-      if($template[$x] == '}' && $name != '')\r
-      {\r
-       # Wir haben einen {DEFINE}-Block\r
-\r
-       $name_found   = 1;\r
-       $define_block = 1;\r
-\r
-       # Alles ab hier sollte mit dem Teil verbunden werden, der das\r
-       # {DEFINE} in einer Zeile verarbeitet\r
-\r
-       # Der Parser fuer {DEFINE}-Bloecke ist nicht rekursiv, was auch\r
-       # nicht noetig sein sollte\r
-\r
-       if(($end = strpos($template,'{ENDDEFINE}',$x)) !== false)\r
-       {\r
-        $x++;\r
-\r
-        $content = substr($template,$x,$end-$x);\r
-\r
-        if($this->get_var($name) === false)\r
-        {\r
-         # Die Variable wird nur gesetzt, wenn sie nicht bereits gesetzt ist\r
-\r
-         $this->set_var($name,$content);\r
-         array_push($this->defined_vars,$name);\r
+\r
+    # parse_old()\r
+    #\r
+    # In der Template definierte Variablen auslesen, Variablen\r
+    # ersetzen, {IF}- und {TRIM}-Bloecke parsen\r
+    # (alte Methode)\r
+    #\r
+    # Parameter: -nichts-\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+    function parse_old() {\r
+        # Zuerst die Schleifen parsen\r
+\r
+        if(is_array($this->loop_vars) && ($loops = array_keys($this->loop_vars))) {\r
+            foreach($loops as $loop) {\r
+                $this->parse_loop($loop);\r
+            }\r
         }\r
 \r
-        $pre  = substr($template,0,$begin-8);\r
-        $post = substr($template,$end+11);\r
-\r
-        $template = $pre.$post;\r
-\r
-        # Fertig!\r
-\r
-        $offset = strlen($pre);\r
-        break;\r
-       }\r
-       else break;\r
-      }\r
-      elseif($template[$x] != ' ')\r
-      {\r
-       $name .= $template[$x];\r
-      }\r
-      elseif($name != '')\r
-      {\r
-       $name_found = 1;\r
-      }\r
-      else break;\r
-     }\r
-    }\r
-   }\r
-  }\r
+        # Normale Variablen durchgehen\r
 \r
-  $this->set_template($template);\r
- }\r
+        if(($vars = $this->get_var()) !== false && is_array($vars)) {\r
+            foreach($vars as $var) {\r
+                $val = $this->get_var($var);\r
 \r
- # parse_if_block()\r
- #\r
- # IF-Bloecke verarbeiten\r
- #\r
- # Parameter: 1. Name des IF-Blocks (das, was nach dem IF steht)\r
- #            2. Status-Code (true  => Inhalt anzeigen\r
- #                            false => Inhalt nicht anzeigen\r
- #            3. true  => Verneinten Block nicht parsen\r
- #               false => Verneinten Block parsen (Standard)\r
- #\r
- # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+                $this->parse_if_block($var,$val);\r
 \r
- function parse_if_block($name,$state,$no_negate=0)\r
- {\r
-  $template = $this->get_template();\r
+                if(is_array($val)) {\r
+                    $this->fillin_array($var,$val);\r
+                }\r
+                else {\r
+                    $this->fillin($var,$val);\r
+                }\r
 \r
-  $count = 0;\r
+                unset($val);\r
+            }\r
+        }\r
 \r
-  while(strpos($template,'{IF '.$name.'}') !== false)\r
-  {\r
-   # Das alles hier ist nicht wirklich elegant geloest...\r
-   # ... aber solange es funktioniert... ;-)\r
+        # Jetzt dasselbe mit denen, die direkt in der Template-Datei definiert\r
+        # sind, machen. Ich weiss, dass das eine ziemlich unsaubere Loesung ist,\r
+        # aber es funktioniert\r
 \r
-   $count++;\r
+        $this->get_defined_vars();\r
 \r
-   $start    = strpos($template,'{IF '.$name.'}');\r
-   $tpl_tmp  = substr($template,$start);\r
-   $splitted = explode('{ENDIF}',$tpl_tmp);\r
+        foreach($this->defined_vars as $var) {\r
+            $val = $this->get_var($var);\r
 \r
-   $block = ''; # Kompletter bedingter Block\r
-   $ifs   = 0;  # IF-Zaehler (wird fuer jedes IF erhoeht und fuer jedes ENDIF erniedrigt)\r
+            $this->parse_if_block($var,$val);\r
+            $this->fillin($var,$val);\r
 \r
-   # {IF}\r
+            unset($val);\r
+        }\r
 \r
-   for($x=0;$x<count($splitted);$x++)\r
-   {\r
-    if($x == count($splitted)-1) die('Nesting error found while parsing IF block "'.$name.'" nr. '.$count.' in template file "'.$this->file.'"');\r
+        # {TRIM}-Bloecke entfernen\r
 \r
-    $ifs += substr_count($splitted[$x],'{IF '); # Zum Zaehler jedes Vorkommen von IF hinzuzaehlen\r
-    $ifs--;                                     # Zaehler um 1 erniedrigen\r
-    $block .= $splitted[$x].'{ENDIF}';          # Daten zum Block hinzufuegen\r
+        $this->parse_trim_blocks();\r
+    }\r
+\r
+    # fillin()\r
+    #\r
+    # Variablen durch Text ersetzen\r
+    #\r
+    # Parameter: 1. Variable zum Ersetzen\r
+    #            2. Text, durch den die Variable ersetzt werden soll\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
 \r
-    if($ifs == 0)\r
-    {\r
-     # Zaehler wieder 0, also haben wir das Ende des IF-Blocks gefunden :-))\r
+    function fillin($var,$text) {\r
+        $template = $this->get_template();\r
+        $template = str_replace('{'.$var.'}',$text,$template);\r
 \r
-     break;\r
+        $this->set_template($template);\r
     }\r
-   }\r
 \r
-   $if_block = substr($block,strlen($name)+5,-7); # Alles zwischen {IF} und {ENDIF}\r
+    # fillin_array()\r
+    #\r
+    # Variable durch Array ersetzen\r
+    #\r
+    # Parameter: 1. Variable zum Ersetzen\r
+    #            2. Array, durch das die Variable ersetzt werden soll\r
+    #            3. Zeichenkette, mit der das Array verbunden werden soll\r
+    #               (Standard: '')\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+    function fillin_array($var,$array,$glue='') {\r
+        $this->fillin($var,implode($glue,$array));\r
+    }\r
 \r
-   # {ELSE}\r
+    # replace_vars()\r
+    #\r
+    # Variablen eine nach der anderen ersetzen. Sollte in einer Variable eine\r
+    # andere Variable auftauchen, so wird diese nicht ersetzt.\r
+    #\r
+    # Parameter: Array mit zu parsenden Variablen (optional)\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
 \r
-   $else_block = ''; # Alles ab {ELSE}\r
-   $ifs        = 0;  # IF-Zaehler\r
+    function replace_vars($valid=array()) {\r
+        $template = $this->get_template();\r
 \r
-   $splitted = explode('{ELSE}',$if_block);\r
+        $valid_vars = (empty($valid)) ? $this->get_var() : $valid;\r
 \r
-   for($x=0;$x<count($splitted);$x++)\r
-   {\r
-    $ifs += substr_count($splitted[$x],'{IF ');    # Zum Zaehler jedes Vorkommen von IF hinzuzaehlen\r
-    $ifs -= substr_count($splitted[$x],'{ENDIF}'); # Vom Zaehler jedes Vorkommen von ENDIF abziehen\r
+        for($x=0;$x<strlen($template);$x++) {\r
+            if($template[$x] == '{') {\r
+                foreach($valid_vars as $var) {\r
+                    # Pruefen, ob hier eine gueltige Variable beginnt\r
 \r
-    if($ifs == 0)\r
-    {\r
-     # Zaehler 0, also haben wir das Ende des IF-Abschnitts gefunden\r
+                    if(substr($template,$x+1,strlen($var)+1) == $var.'}') {\r
+                        if(is_array($this->get_var($var))) {\r
+                            $content = implode('',$this->get_var($var));\r
+                        }\r
+                        else {\r
+                            $content = $this->get_var($var);\r
+                        }\r
 \r
-     # Aus dem Rest den ELSE-Block zusammenbauen\r
+                        # Daten vor und nach der Variable\r
 \r
-     for($y=$x+1;$y<count($splitted);$y++)\r
-     {\r
-      $else_block .= '{ELSE}'.$splitted[$y];\r
-     }\r
+                        $pre  = substr($template,0,$x);\r
+                        $post = substr($template,strlen($pre)+2+strlen($var));\r
 \r
-     if($else_block)\r
-     {\r
-      $if_block   = substr($if_block,0,strlen($if_block)-strlen($else_block));\r
-      $else_block = substr($else_block,6);\r
-     }\r
+                        # Alles neu zusammensetzen\r
 \r
-     break;\r
-    }\r
-   }\r
+                        $template = $pre.$content.$post;\r
+\r
+                        # Zaehler aendern\r
+\r
+                        $x = strlen($pre.$content)-1;\r
+                    }\r
+                }\r
+            }\r
+        }\r
 \r
-   # Block durch die jeweiligen Daten ersetzen\r
-\r
-   $replacement = ($state) ? $if_block : $else_block;\r
+        $this->set_template($template);\r
+    }\r
 \r
-   $template = str_replace($block,$replacement,$template);\r
-  }\r
+    # to_file()\r
+    #\r
+    # Template in Datei schreiben\r
+    #\r
+    # Parameter: Datei-Handle\r
+    #\r
+    # Rueckgabe: Status-Code (Boolean)\r
 \r
-  $this->set_template($template);\r
+    function to_file($handle) {\r
+        return @fwrite($handle,$this->get_template());\r
+    }\r
 \r
-  # Evtl. verneinte Form parsen\r
-\r
-  if(!$no_negate)\r
-  {\r
-   $this->parse_if_block('!'.$name,!$state,1);\r
-  }\r
- }\r
+    # reset()\r
+    #\r
+    # Den gesicherten Stand des Template-Textes wiederherstellen\r
+    #\r
+    # Parameter: -nichts-\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
 \r
- # parse_trim_blocks()\r
- #\r
- # {TRIM}-Bloecke parsen\r
- #\r
- # Dieser Parser ist nicht rekursiv, was auch nicht\r
- # noetig sein sollte.\r
- #\r
- # Parameter: -nichts-\r
- #\r
- # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
-\r
- function parse_trim_blocks()\r
- {\r
-  $template = $this->get_template();\r
-  if(strpos($template,'{TRIM}') === false) return;\r
-\r
-  $offset = 0;\r
-\r
-  while(($begin = strpos($template,'{TRIM}',$offset)) !== false)\r
-  {\r
-   if(($end = strpos($template,'{ENDTRIM}',$begin+6)) !== false)\r
-   {\r
-    $block    = substr($template,$begin,$end+9-$begin);\r
-    $content  = substr($block,6,-9);\r
-\r
-    $trimmed  = trim($content);\r
-\r
-    $template = str_replace($block,$trimmed,$template);\r
-\r
-    $offset   = $begin+strlen($trimmed);\r
-   }\r
-   else break;\r
-  }\r
-\r
-  $this->set_template($template);\r
- }\r
-\r
- # parse_condtag()\r
- #\r
- # Bedingungstags in einem Vorlagentext verarbeiten\r
- #\r
- # Parameter: 1. Tagname\r
- #            2. Status-Code (true  => Tag-Inhalt anzeigen\r
- #                            false => Tag-Inhalt nicht anzeigen\r
- #\r
- # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
-\r
- function parse_condtag($condtag,$state)\r
- {\r
-  $template = $this->get_template();\r
-\r
-  while(strpos($template,'<'.$condtag.'>') !== false)\r
-  {\r
-   $start = strpos($template,'<'.$condtag.'>');                                        # Beginn des Blocks\r
-   $end   = strpos($template,'</'.$condtag.'>')+strlen($condtag)+3;                    # Ende des Blocks\r
-\r
-   $extract = substr($template,$start,$end-$start);                                    # Kompletten Bedingungsblock extrahieren...\r
-\r
-   $replacement = ($state) ? substr($extract,strlen($condtag)+2,0-strlen($condtag)-3) : '';\r
-\r
-   $template = str_replace($extract,$replacement,$template);                           # Block durch neue Daten ersetzen\r
-  }\r
-  $this->set_template($template);\r
- }\r
-\r
- # parse_includes()\r
- #\r
- # {INCLUDE}-Anweisungen verarbeiten\r
- #\r
- # Parameter: -nichts-\r
- #\r
- # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
-\r
- function parse_includes()\r
- {\r
-  $template = $this->get_template();\r
-  if(strpos($template,'{INCLUDE ') === false) return;\r
-\r
-  $offset = 0;\r
-\r
-  $y = 0;\r
-\r
-  while(($begin = strpos($template,'{INCLUDE ',$offset)) !== false)\r
-  {\r
-   $y++;\r
-\r
-   $start  = $begin+9;\r
-   $offset = $start;\r
-   $long   = 0;\r
-\r
-   if($template[$start] == '"')\r
-   {\r
-    $long = 1;\r
-    $start++;\r
-   }\r
-\r
-   $file = '';\r
-   $skip = 0;\r
-\r
-   for($x=$start;$x<strlen($template);$x++)\r
-   {\r
-    if($template[$x] == "\012" || $template[$x] == "\015")\r
-    {\r
-     $skip = 1;\r
-     break;\r
+    function reset() {\r
+        $this->template = $this->original;\r
     }\r
-    elseif($long == 0 && $template[$x] == ' ')\r
-    {\r
-     $skip = 1;\r
-     break;\r
+\r
+    # save_state()\r
+    #\r
+    # Aktuellen Stand des Template-Textes sichern\r
+    # (alte Sicherung wird ueberschrieben)\r
+    #\r
+    # Parameter: -nichts-\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+    function save_state() {\r
+        $this->original = $this->template;\r
     }\r
-    elseif($long == 1 && $template[$x] == '"')\r
-    {\r
-     if($template[$x+1] != '}') $skip = 1;\r
-     break;\r
+\r
+    # parse_loop()\r
+    #\r
+    # Eine Schleife parsen\r
+    #\r
+    # Parameter: Name der Schleife\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+    function parse_loop($name) {\r
+        $template = $this->get_template();\r
+        if(strpos($template,'{LOOP '.$name.'}') === false) return;\r
+\r
+        $offset   = 0;\r
+        $name_len = strlen($name);\r
+\r
+        while(($begin = strpos($template,'{LOOP '.$name.'}',$offset)) !== false) {\r
+            if(($end = strpos($template,'{ENDLOOP}',$begin+6+$name_len)) !== false) {\r
+                $block   = substr($template,$begin,$end+9-$begin);\r
+                $content = substr($block,$name_len+7,-9);\r
+\r
+                $parsed_block = '';\r
+\r
+                for($x=0;$x<count($this->loop_vars[$name]);$x++) {\r
+                    $loop_data = $this->loop_vars[$name][$x];\r
+                    $loop_vars = array_keys($loop_data);\r
+\r
+                    $ctpl = new Template;\r
+                    $ctpl->set_template($content);\r
+\r
+                    foreach($loop_vars as $loop_var) {\r
+                        $ctpl->set_var($name.'.'.$loop_var,$loop_data[$loop_var]);\r
+                    }\r
+\r
+                    if($this->old_parsing) {\r
+                        $ctpl->parse_old();\r
+                    }\r
+                    else {\r
+                        $ctpl->parse();\r
+                    }\r
+\r
+                    $parsed_block .= $ctpl->get_template();\r
+\r
+                    unset($ctpl);\r
+                }\r
+\r
+                $template = str_replace($block,$parsed_block,$template);\r
+                $offset   = $begin+strlen($parsed_block);\r
+            }\r
+            else break;\r
+        }\r
+\r
+        $this->set_template($template);\r
+        }\r
+\r
+        # get_defined_vars()\r
+        #\r
+        # In der Template-Datei definierte Variablen auslesen\r
+        #\r
+        # Parameter: -nichts-\r
+        #\r
+        # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+        function get_defined_vars() {\r
+            $template = $this->get_template();\r
+            if(strpos($template,'{DEFINE ') === false) return;\r
+\r
+            $offset = 0;\r
+\r
+            while(strpos($template,'{DEFINE ',$offset) !== false) {\r
+                $begin  = strpos($template,'{DEFINE ',$offset)+8;\r
+                $offset = $begin;\r
+\r
+                $name    = '';\r
+                $content = '';\r
+\r
+                $var_open     = 0;\r
+                $name_found   = 0;\r
+                $define_block = 0;\r
+\r
+                for($x=$begin;$x<strlen($template);$x++) {\r
+                    if($template[$x] == "\012" || $template[$x] == "\015") {\r
+                        # Wenn in einem {DEFINE}-Block ein Zeilenumbruch gefunden wird,\r
+                        # brechen wir mit dem Parsen des Blockes ab\r
+\r
+                        break;\r
+                    }\r
+\r
+                    if($var_open == 1) {\r
+                        if($template[$x] == '"') {\r
+                            # Der Inhalt der Variable ist hier zu Ende\r
+\r
+                            $var_open = 0;\r
+\r
+                            if($template[$x+1] == '}') {\r
+                                # Hier ist der Block zu Ende\r
+\r
+                                if($this->get_var($name) === false) {\r
+                                    # Die Variable wird nur gesetzt, wenn sie nicht bereits gesetzt ist\r
+\r
+                                    $this->set_var($name,$content);\r
+                                    array_push($this->defined_vars,$name);\r
+                                }\r
+\r
+                            # {DEFINE}-Block entfernen\r
+\r
+                            $pre  = substr($template,0,$begin-8);\r
+                            $post = substr($template,$x+2);\r
+\r
+                            $template = $pre.$post;\r
+\r
+                            # Fertig!\r
+\r
+                            $offset = strlen($pre);\r
+                            break;\r
+                        }\r
+                    }\r
+                    elseif($template[$x] == '\\') {\r
+                        # Ein Backslash wurde gefunden, er dient zum Escapen von Zeichen\r
+\r
+                        if($template[$x+1] == 'n') {\r
+                            # "\n" in Zeilenumbrueche umwandeln\r
+\r
+                            $content .= "\n";\r
+                        }\r
+                        else $content .= $template[$x+1];\r
+\r
+                        $x++;\r
+                    }\r
+                    else $content .= $template[$x];\r
+                }\r
+                else {\r
+                    if($name_found == 1) {\r
+                        if($var_open == 0) {\r
+                            if($template[$x] == '"') $var_open = 1;\r
+                            else break;\r
+                        }\r
+                    }\r
+                    else {\r
+                        # Variablennamen auslesen\r
+\r
+                        if($template[$x] == '}' && $name != '') {\r
+                            # Wir haben einen {DEFINE}-Block\r
+\r
+                            $name_found   = 1;\r
+                            $define_block = 1;\r
+\r
+                            # Alles ab hier sollte mit dem Teil verbunden werden, der das\r
+                            # {DEFINE} in einer Zeile verarbeitet\r
+\r
+                            # Der Parser fuer {DEFINE}-Bloecke ist nicht rekursiv, was auch\r
+                            # nicht noetig sein sollte\r
+\r
+                            if(($end = strpos($template,'{ENDDEFINE}',$x)) !== false) {\r
+                                $x++;\r
+\r
+                                $content = substr($template,$x,$end-$x);\r
+\r
+                                if($this->get_var($name) === false) {\r
+                                    # Die Variable wird nur gesetzt, wenn sie nicht bereits gesetzt ist\r
+\r
+                                    $this->set_var($name,$content);\r
+                                    array_push($this->defined_vars,$name);\r
+                                }\r
+\r
+                                $pre  = substr($template,0,$begin-8);\r
+                                $post = substr($template,$end+11);\r
+\r
+                                $template = $pre.$post;\r
+\r
+                                # Fertig!\r
+\r
+                                $offset = strlen($pre);\r
+                                break;\r
+                            }\r
+                            else break;\r
+                        }\r
+                        elseif($template[$x] != ' ') {\r
+                            $name .= $template[$x];\r
+                        }\r
+                        elseif($name != '') {\r
+                            $name_found = 1;\r
+                        }\r
+                        else break;\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        $this->set_template($template);\r
     }\r
-    elseif($long == 0 && $template[$x] == '}')\r
-    {\r
-     break;\r
+\r
+    # parse_if_block()\r
+    #\r
+    # IF-Bloecke verarbeiten\r
+    #\r
+    # Parameter: 1. Name des IF-Blocks (das, was nach dem IF steht)\r
+    #            2. Status-Code (true  => Inhalt anzeigen\r
+    #                            false => Inhalt nicht anzeigen\r
+    #            3. true  => Verneinten Block nicht parsen\r
+    #               false => Verneinten Block parsen (Standard)\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+    function parse_if_block($name,$state,$no_negate=0) {\r
+        $template = $this->get_template();\r
+\r
+        $count = 0;\r
+\r
+        while(strpos($template,'{IF '.$name.'}') !== false) {\r
+            # Das alles hier ist nicht wirklich elegant geloest...\r
+            # ... aber solange es funktioniert... ;-)\r
+\r
+            $count++;\r
+\r
+            $start    = strpos($template,'{IF '.$name.'}');\r
+            $tpl_tmp  = substr($template,$start);\r
+            $splitted = explode('{ENDIF}',$tpl_tmp);\r
+\r
+            $block = ''; # Kompletter bedingter Block\r
+            $ifs   = 0;  # IF-Zaehler (wird fuer jedes IF erhoeht und fuer jedes ENDIF erniedrigt)\r
+\r
+            # {IF}\r
+\r
+            for($x=0;$x<count($splitted);$x++) {\r
+                if($x == count($splitted)-1) die('Nesting error found while parsing IF block "'.$name.'" nr. '.$count.' in template file "'.$this->file.'"');\r
+\r
+                $ifs += substr_count($splitted[$x],'{IF '); # Zum Zaehler jedes Vorkommen von IF hinzuzaehlen\r
+                $ifs--;                                     # Zaehler um 1 erniedrigen\r
+                $block .= $splitted[$x].'{ENDIF}';          # Daten zum Block hinzufuegen\r
+\r
+                if($ifs == 0) {\r
+                    # Zaehler wieder 0, also haben wir das Ende des IF-Blocks gefunden :-))\r
+\r
+                    break;\r
+                }\r
+            }\r
+\r
+            $if_block = substr($block,strlen($name)+5,-7); # Alles zwischen {IF} und {ENDIF}\r
+\r
+            # {ELSE}\r
+\r
+            $else_block = ''; # Alles ab {ELSE}\r
+            $ifs        = 0;  # IF-Zaehler\r
+\r
+            $splitted = explode('{ELSE}',$if_block);\r
+\r
+            for($x=0;$x<count($splitted);$x++) {\r
+                $ifs += substr_count($splitted[$x],'{IF ');    # Zum Zaehler jedes Vorkommen von IF hinzuzaehlen\r
+                $ifs -= substr_count($splitted[$x],'{ENDIF}'); # Vom Zaehler jedes Vorkommen von ENDIF abziehen\r
+\r
+                if($ifs == 0) {\r
+                    # Zaehler 0, also haben wir das Ende des IF-Abschnitts gefunden\r
+\r
+                    # Aus dem Rest den ELSE-Block zusammenbauen\r
+\r
+                    for($y=$x+1;$y<count($splitted);$y++) {\r
+                        $else_block .= '{ELSE}'.$splitted[$y];\r
+                    }\r
+\r
+                    if($else_block) {\r
+                        $if_block   = substr($if_block,0,strlen($if_block)-strlen($else_block));\r
+                        $else_block = substr($else_block,6);\r
+                    }\r
+\r
+                    break;\r
+                }\r
+            }\r
+\r
+            # Block durch die jeweiligen Daten ersetzen\r
+            \r
+            $replacement = ($state) ? $if_block : $else_block;\r
+\r
+            $template = str_replace($block,$replacement,$template);\r
+        }\r
+\r
+        $this->set_template($template);\r
+\r
+        # Evtl. verneinte Form parsen\r
+\r
+        if(!$no_negate) {\r
+            $this->parse_if_block('!'.$name,!$state,1);\r
+        }\r
     }\r
-    else\r
-    {\r
-     $file .= $template[$x];\r
+\r
+    # parse_if_blocks()\r
+    #\r
+    # IF-Bloecke zu allen definierten Variablen verarbeiten\r
+    #\r
+    # Parameter: Array mit zu verarbeitenden IF-Bloecken (optional)\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+    function parse_if_blocks($valid=array()) {\r
+        $valid_vars = (empty($valid)) ? $this->get_var() : $valid;\r
+\r
+        foreach($valid_vars as $valid_var) {\r
+            $this->parse_if_block($valid_var,$this->get_var($valid_var));\r
+        }\r
     }\r
-   }\r
 \r
-   if($skip == 1) continue;\r
+    # parse_trim_blocks()\r
+    #\r
+    # {TRIM}-Bloecke parsen\r
+    #\r
+    # Dieser Parser ist nicht rekursiv, was auch nicht\r
+    # noetig sein sollte.\r
+    #\r
+    # Parameter: -nichts-\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
 \r
-   if($file != '')\r
-   {\r
-    $filepath = $file;\r
+    function parse_trim_blocks() {\r
+        $template = $this->get_template();\r
+        if(strpos($template,'{TRIM}') === false) return;\r
 \r
-    $is_absolute = (strtoupper(substr(PHP_OS,0,3)) === 'WIN')\r
-                 ? preg_match('!^([a-z]:)?/!i',$file)\r
-                 : preg_match('!^/!',$file);\r
+        $offset = 0;\r
 \r
-    if(!$is_absolute)\r
-    {\r
-     if(!empty($this->file)) $dir = dirname($this->file);\r
-     else $dir = '.';\r
+        while(($begin = strpos($template,'{TRIM}',$offset)) !== false) {\r
+            if(($end = strpos($template,'{ENDTRIM}',$begin+6)) !== false) {\r
+                $block    = substr($template,$begin,$end+9-$begin);\r
+                $content  = substr($block,6,-9);\r
 \r
-     $dir = str_replace('\\','/',$dir);\r
+                $trimmed  = trim($content);\r
 \r
-     if(!preg_match('!/+$!',$dir)) $dir .= '/';\r
+                $template = str_replace($block,$trimmed,$template);\r
 \r
-     $filepath = $dir.$file;\r
+                $offset   = $begin+strlen($trimmed);\r
+            }\r
+            else break;\r
+        }\r
+\r
+        $this->set_template($template);\r
     }\r
 \r
-    if(is_file($filepath))\r
-    {\r
-     $inc = new Template;\r
-     $inc->read_file($filepath);\r
+    # parse_condtag()\r
+    #\r
+    # Bedingungstags in einem Vorlagentext verarbeiten\r
+    #\r
+    # Parameter: 1. Tagname\r
+    #            2. Status-Code (true  => Tag-Inhalt anzeigen\r
+    #                            false => Tag-Inhalt nicht anzeigen\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+    function parse_condtag($condtag,$state) {\r
+        $template = $this->get_template();\r
 \r
-     $end = ($long == 1)\r
-          ? $start + strlen($file) + 2\r
-          : $start + strlen($file) + 1;\r
+        while(strpos($template,'<'.$condtag.'>') !== false) {\r
+            $start = strpos($template,'<'.$condtag.'>');                                        # Beginn des Blocks\r
+            $end   = strpos($template,'</'.$condtag.'>')+strlen($condtag)+3;                    # Ende des Blocks\r
 \r
-     $pre  = substr($template,0,$begin);\r
-     $post = substr($template,$end);\r
+            $extract = substr($template,$start,$end-$start);                                    # Kompletten Bedingungsblock extrahieren...\r
 \r
-     $template = $pre.$inc->get_template().$post;\r
-     $offset   = strlen($pre)+strlen($inc->get_template());\r
+            $replacement = ($state) ? substr($extract,strlen($condtag)+2,0-strlen($condtag)-3) : '';\r
+\r
+            $template = str_replace($extract,$replacement,$template);                           # Block durch neue Daten ersetzen\r
+        }\r
 \r
-     unset($inc);\r
+        $this->set_template($template);\r
     }\r
-   }\r
-  }\r
 \r
-  $this->set_template($template);\r
- }\r
+    # parse_includes()\r
+    #\r
+    # {INCLUDE}-Anweisungen verarbeiten\r
+    #\r
+    # Parameter: -nichts-\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+    function parse_includes() {\r
+        $template = $this->get_template();\r
+        if(strpos($template,'{INCLUDE ') === false) return;\r
+\r
+        $offset = 0;\r
+\r
+        $y = 0;\r
+\r
+        while(($begin = strpos($template,'{INCLUDE ',$offset)) !== false) {\r
+            $y++;\r
+\r
+            $start  = $begin+9;\r
+            $offset = $start;\r
+            $long   = 0;\r
+\r
+            if($template[$start] == '"') {\r
+                $long = 1;\r
+                $start++;\r
+            }\r
+\r
+            $file = '';\r
+            $skip = 0;\r
+\r
+            for($x=$start;$x<strlen($template);$x++) {\r
+                if($template[$x] == "\012" || $template[$x] == "\015") {\r
+                    $skip = 1;\r
+                    break;\r
+                }\r
+                elseif($long == 0 && $template[$x] == ' ') {\r
+                    $skip = 1;\r
+                    break;\r
+                }\r
+                elseif($long == 1 && $template[$x] == '"') {\r
+                    if($template[$x+1] != '}') $skip = 1;\r
+                    break;\r
+                }\r
+                elseif($long == 0 && $template[$x] == '}') {\r
+                    break;\r
+                }\r
+                else {\r
+                    $file .= $template[$x];\r
+                }\r
+            }\r
+\r
+            if($skip == 1) continue;\r
+\r
+            if($file != '') {\r
+                $filepath = $file;\r
+\r
+                $is_absolute = (strtoupper(substr(PHP_OS,0,3)) === 'WIN')\r
+                             ? preg_match('!^([a-z]:)?/!i',$file)\r
+                             : preg_match('!^/!',$file);\r
+\r
+                if(!$is_absolute) {\r
+                    if(!empty($this->file)) $dir = dirname($this->file);\r
+                    else $dir = '.';\r
+\r
+                    $dir = str_replace('\\','/',$dir);\r
+\r
+                    if(!preg_match('!/+$!',$dir)) $dir .= '/';\r
+\r
+                    $filepath = $dir.$file;\r
+                }\r
+\r
+                if(is_file($filepath)) {\r
+                    $inc = new Template;\r
+                    $inc->read_file($filepath);\r
+\r
+                    $end = ($long == 1)\r
+                         ? $start + strlen($file) + 2\r
+                         : $start + strlen($file) + 1;\r
+\r
+                    $pre  = substr($template,0,$begin);\r
+                    $post = substr($template,$end);\r
+\r
+                    $template = $pre.$inc->get_template().$post;\r
+                    $offset   = strlen($pre)+strlen($inc->get_template());\r
+\r
+                    unset($inc);\r
+                }\r
+            }\r
+        }\r
+\r
+        $this->set_template($template);\r
+    }\r
 }\r
 \r
 #\r
index cee87df5c6b937f4e8d3aab2e67478d5a9748e26..13e68b8ba5441d2dfa6c0d33d7d2aedbeb3ff14a 100644 (file)
@@ -1,25 +1,25 @@
 <?php\r
 \r
 #\r
-# Form E-Mail 3.4.1 - config.php\r
+# Form E-Mail 3.5 - config.php\r
 #\r
 # Konfiguration fuer Form E-Mail\r
 #\r
 # Autor:            Patrick Canterino <patrick@patshaping.de>\r
-# Letzte Aenderung: 11.1.2009\r
+# Letzte Aenderung: 7.11.2009\r
 #\r
 # Copyright (C) 2002-2011 Patrick Canterino\r
 #\r
-# Diese Datei kann unter den Bedingungen der "Artistic License 1.0"\r
+# Diese Datei kann unter den Bedingungen der "Artistic License 2.0"\r
 # weitergegeben und / oder veraendert werden.\r
 # Siehe:\r
-# http://www.opensource.org/licenses/artistic-license-1.0.php\r
+# http://www.opensource.org/licenses/artistic-license-2.0\r
 #\r
 \r
 # Empfaenger - wichtigste Einstellung\r
 \r
-$mailto  = '';\r
-$aliases = array();\r
+$mailto  = 'patrick@test.local';\r
+$aliases = array('patrick' => 'patrick@test.local', 'test' => 'test@test.local', 'alle' => 'patrick@test.local; test@test.local');\r
 \r
 # Allgemeines\r
 \r
@@ -44,6 +44,20 @@ $name_max    = 0;
 $subject_max = 0;\r
 $text_max    = 0;\r
 \r
+# Individuelle Felder\r
+\r
+$user_fields['beruf']['min'] = 5;\r
+$user_fields['beruf']['max'] = 50;\r
+$user_fields['beruf']['optional'] = 0;\r
+$user_fields['beruf']['regex'] = '/^[A-Za-z]$/';\r
+$user_fields['beruf']['check'] = '';\r
+$user_fields['beruf']['tpl_var'] = 'BERUF';\r
+\r
+$user_fields['beruf']['errors']['too_short'] = 'Der Beruf muss mind. 5 Zeichen lang sein!';\r
+$user_fields['beruf']['errors']['too_long'] = 'Der Beruf darf höchstens 50 Zeichen lang sein!';\r
+$user_fields['beruf']['errors']['not_set'] = 'Sie haben keinen Beruf eingegeben!';\r
+$user_fields['beruf']['errors']['no_match'] = 'Der Beruf darf nur aus Buchstaben bestehen!';\r
+\r
 # Sicherheit\r
 \r
 $only_post     = 0;\r
@@ -96,7 +110,7 @@ $err_captcha_session_failure = 'Keine g
 \r
 # Templates\r
 \r
-$tpl_mail       = 'mail.txt';\r
+$tpl_mail       = 'mail_individual.txt';\r
 $tpl_sent       = 'sent.htm';\r
 $tpl_user_error = 'user_error.htm';\r
 $tpl_fatal      = 'fatal.htm';\r
index 9f5937d4e144a663907d09c5def6997a5cfe5fb7..f470011ed6aa100d184d20daba2795ddc4adc8f5 100644 (file)
@@ -1,19 +1,20 @@
 <?php\r
 \r
 #\r
-# Form E-Mail 3.4.1 - functions.php\r
+# Form E-Mail 3.5\r
 #\r
-# Verschiedene gemeinsam genutze Funktionen\r
+# Versenden einer E-Mail, die ueber ein Kontaktformular\r
+# geschrieben wurde.\r
 #\r
 # Autor:            Patrick Canterino <patrick@patshaping.de>\r
-# Letzte Aenderung: 11.1.2009\r
+# Letzte Aenderung: 7.11.2011\r
 #\r
 # Copyright (C) 2002-2011 Patrick Canterino\r
 #\r
-# Diese Datei kann unter den Bedingungen der "Artistic License 1.0"\r
+# Diese Datei kann unter den Bedingungen der "Artistic License 2.0"\r
 # weitergegeben und / oder veraendert werden.\r
 # Siehe:\r
-# http://www.opensource.org/licenses/artistic-license-1.0.php\r
+# http://www.opensource.org/licenses/artistic-license-2.0\r
 #\r
 \r
 # formdata()\r
index 9ff120d05d997f964dbd0e55696e573f5d0de8fb..c85d2062320e185696910c546e45936604d9a675 100644 (file)
@@ -1,20 +1,20 @@
 <?php\r
 \r
 #\r
-# Form E-Mail 3.4.1\r
+# Form E-Mail 3.5\r
 #\r
 # Versenden einer E-Mail, die ueber ein Kontaktformular\r
 # geschrieben wurde.\r
 #\r
 # Autor:            Patrick Canterino <patrick@patshaping.de>\r
-# Letzte Aenderung: 24.2.2011\r
+# Letzte Aenderung: 7.11.2011\r
 #\r
 # Copyright (C) 2002-2011 Patrick Canterino\r
 #\r
-# Diese Datei kann unter den Bedingungen der "Artistic License 1.0"\r
+# Diese Datei kann unter den Bedingungen der "Artistic License 2.0"\r
 # weitergegeben und / oder veraendert werden.\r
 # Siehe:\r
-# http://www.opensource.org/licenses/artistic-license-1.0.php\r
+# http://www.opensource.org/licenses/artistic-license-2.0\r
 #\r
 \r
 # ===========\r
@@ -29,16 +29,14 @@ if($only_post && $_SERVER['REQUEST_METHOD'] != 'POST') show_fatal($err_only_post
 \r
 # Wenn Captchas aktiviert sind, Session starten\r
 \r
-if($captcha_enable)\r
-{\r
- session_start();\r
+if($captcha_enable) {\r
+    session_start();\r
 \r
- # Pruefen, ob die zulaessige Zahl der Falscheingaben bei Captchas ueberschritten wurde\r
   # Pruefen, ob die zulaessige Zahl der Falscheingaben bei Captchas ueberschritten wurde\r
 \r
- if($captcha_max && isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed'] >= $captcha_max)\r
- {\r
-  show_fatal($err_captcha_max);\r
- }\r
+    if($captcha_max && isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed'] >= $captcha_max) {\r
+        show_fatal($err_captcha_max);\r
+    }\r
 }\r
 \r
 # Bestimmte Werte in Integers umwandeln\r
@@ -92,64 +90,74 @@ $mail_regexp = ($no_tld)
 \r
 if(!preg_match($mail_regexp,$email)) show_user_error($err_invalid_email);\r
 \r
+# Individuelle Felder einlesen\r
+\r
+$prepared_user_fields = array();\r
+\r
+while(list($user_field,$user_field_data) = each($user_fields)) {\r
+    $user_field_content = formdata($user_field);\r
+\r
+    if(isset($user_field_data['check']) && $user_field_data['check'] != '') {\r
+        if(function_exists($user_field_data['check']) && call_user_func($user_field_data['check'],$user_field_content)) {\r
+            show_user_error($user_field_data['errors']['check_fail']);\r
+        }\r
+    }\r
+\r
+    if(isset($user_field_data['regex']) && $user_field_data['regex'] != '') {\r
+        if(preg_match($user_field_data['regex'],$user_field_content)) {\r
+            show_user_error($user_field_data['errors']['match_fail']);\r
+        }\r
+    }\r
+\r
+    $prepared_user_fields[$user_field_data['tpl_var']] = $user_field_content;\r
+}\r
+\r
 # Captcha ueberpruefen\r
 \r
-if($captcha_enable)\r
-{\r
- $captcha_input     = formdata('captcha');\r
- $captcha_incorrect = false;\r
-\r
- if(isset($_SESSION) && isset($_SESSION['captcha']))\r
- {\r
-  if($captcha_case)\r
-  {\r
-   if(!$captcha_input || empty($captcha_input) || $captcha_input != $_SESSION['captcha']) $captcha_incorrect = true;\r
-  }\r
-  else\r
-  {\r
-   if(!$captcha_input || empty($captcha_input) || strtolower($captcha_input) != strtolower($_SESSION['captcha'])) $captcha_incorrect = true;\r
-  }\r
+if($captcha_enable) {\r
+    $captcha_input     = formdata('captcha');\r
+    $captcha_incorrect = false;\r
+\r
+    if(isset($_SESSION) && isset($_SESSION['captcha'])) {\r
+        if($captcha_case) {\r
+            if(!$captcha_input || empty($captcha_input) || $captcha_input != $_SESSION['captcha']) $captcha_incorrect = true;\r
+        }\r
+        else {\r
+            if(!$captcha_input || empty($captcha_input) || strtolower($captcha_input) != strtolower($_SESSION['captcha'])) $captcha_incorrect = true;\r
+        }\r
   \r
-  if($captcha_incorrect)\r
-  {\r
-   if($captcha_max)\r
-   {\r
-    if(isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed'])\r
-    {\r
-     $_SESSION['captcha_failed']++;\r
+        if($captcha_incorrect) {\r
+            if($captcha_max) {\r
+                if(isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed']) {\r
+                    $_SESSION['captcha_failed']++;\r
+                }\r
+                else {\r
+                    $_SESSION['captcha_failed'] = 1;\r
+                }\r
+            }\r
+\r
+            if($captcha_max && isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed'] >= $captcha_max) {\r
+                show_fatal($err_captcha_max);\r
+            }\r
+            else {   \r
+                show_user_error($err_captcha_incorrect);\r
+            }\r
+        }\r
     }\r
-    else\r
-    {\r
-     $_SESSION['captcha_failed'] = 1;\r
+    else {\r
+        show_fatal($err_captcha_session_failure);\r
     }\r
-   }\r
-\r
-   if($captcha_max && isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed'] >= $captcha_max)\r
-   {\r
-    show_fatal($err_captcha_max);\r
-   }\r
-   else\r
-   {   \r
-    show_user_error($err_captcha_incorrect);\r
-   }\r
-  }\r
- }\r
- else\r
- {\r
-  show_fatal($err_captcha_session_failure);\r
- }\r
 }\r
 \r
 # Referer ueberpruefen\r
 \r
-if($check_referer)\r
-{\r
- $referer_ok = semicolon_split($referer_ok);\r
+if($check_referer) {\r
+    $referer_ok = semicolon_split($referer_ok);\r
 \r
- $referer_parts = parse_url($_SERVER['HTTP_REFERER']);\r
- $referer_host  = $referer_parts['host'];\r
   $referer_parts = parse_url($_SERVER['HTTP_REFERER']);\r
   $referer_host  = $referer_parts['host'];\r
 \r
- if(in_array($referer_host,$referer_ok) === false) show_fatal($err_referer_not_ok);\r
   if(in_array($referer_host,$referer_ok) === false) show_fatal($err_referer_not_ok);\r
 }\r
 \r
 # Zeilenumbrueche in Namen und Betreff durch Leerzeichen ersetzen\r
@@ -166,42 +174,37 @@ $time = strftime($timeformat);
 \r
 $header = '';\r
 \r
-if($friendly_sender)\r
-{\r
- if($friendly_sender == 2)\r
- {\r
-  if(preg_match("/[\200-\377]/",$name))\r
-  {\r
-   # Absendernamen mit Base64 codieren\r
-\r
-   $encoded_name = base64_encode($name);\r
-   $encoded_name = wordwrap($encoded_name,56,"\015\012",1);\r
-   $encoded_name = "=?$charset?B?$encoded_name?=";\r
-   $encoded_name = str_replace("\015\012","?=\015\012      =?$charset?B?",$encoded_name);\r
-  }\r
-  else\r
-  {\r
-   # Bestimmte Zeichen im Absendernamen codieren\r
-\r
-   $encoded_name = str_replace('"','\"',$name);\r
-   $encoded_name = str_replace('(','\\(',$encoded_name);\r
-   $encoded_name = str_replace(')','\\)',$encoded_name);\r
-   $encoded_name = '"'.$encoded_name.'"';\r
-  }\r
-\r
-  $header = "From: $encoded_name <$email>\n";\r
- }\r
- else $header = "From: $email\n";\r
+if($friendly_sender) {\r
+    if($friendly_sender == 2) {\r
+        if(preg_match("/[\200-\377]/",$name)) {\r
+            # Absendernamen mit Base64 codieren\r
+\r
+            $encoded_name = base64_encode($name);\r
+            $encoded_name = wordwrap($encoded_name,56,"\015\012",1);\r
+            $encoded_name = "=?$charset?B?$encoded_name?=";\r
+            $encoded_name = str_replace("\015\012","?=\015\012      =?$charset?B?",$encoded_name);\r
+        }\r
+        else {\r
+            # Bestimmte Zeichen im Absendernamen codieren\r
+\r
+            $encoded_name = str_replace('"','\"',$name);\r
+            $encoded_name = str_replace('(','\\(',$encoded_name);\r
+            $encoded_name = str_replace(')','\\)',$encoded_name);\r
+            $encoded_name = '"'.$encoded_name.'"';\r
+        }\r
+\r
+        $header = "From: $encoded_name <$email>\n";\r
+    }\r
+    else $header = "From: $email\n";\r
 }\r
 \r
-if($add_header)\r
-{\r
- if(!$friendly_sender) $header .= "Reply-To: $email\n";\r
- $header .= 'Content-Type: text/plain; charset="'.$charset.'"'."\n";\r
- $header .= 'Content-Transfer-Encoding: 8bit'."\n";\r
- $header .= 'MIME-Version: 1.0'."\n";\r
- $header .= 'X-Mailer: Form E-Mail 3.4.1'."\n";\r
- $header .= 'X-Sender-IP: ['.$_SERVER['REMOTE_ADDR'].']';\r
+if($add_header) {\r
+    if(!$friendly_sender) $header .= "Reply-To: $email\n";\r
+    $header .= 'Content-Type: text/plain; charset="'.$charset.'"'."\n";\r
+    $header .= 'Content-Transfer-Encoding: 8bit'."\n";\r
+    $header .= 'MIME-Version: 1.0'."\n";\r
+    $header .= 'X-Mailer: Form E-Mail 3.4.1'."\n";\r
+    $header .= 'X-Sender-IP: ['.$_SERVER['REMOTE_ADDR'].']';\r
 }\r
 else $header .= "Reply-To: $email";\r
 \r
@@ -210,12 +213,11 @@ $header = preg_replace("/\015\012|\012|\015/","\n",$header);
 # Betreff mit Base64 codieren, wenn er Zeichen enthaelt,\r
 # die nicht aus dem ASCII-Zeichensatz stammen\r
 \r
-if(preg_match("/[\200-\377]/",$subject))\r
-{\r
- $encoded_subject = base64_encode($subject);\r
- $encoded_subject = wordwrap($encoded_subject,56,"\015\012",1);\r
- $encoded_subject = "=?$charset?B?$encoded_subject?=";\r
- $encoded_subject = str_replace("\015\012","?=\015\012         =?$charset?B?",$encoded_subject);\r
+if(preg_match("/[\200-\377]/",$subject)) {\r
+    $encoded_subject = base64_encode($subject);\r
+    $encoded_subject = wordwrap($encoded_subject,56,"\015\012",1);\r
+    $encoded_subject = "=?$charset?B?$encoded_subject?=";\r
+    $encoded_subject = str_replace("\015\012","?=\015\012         =?$charset?B?",$encoded_subject);\r
 }\r
 else $encoded_subject = $subject;\r
 \r
@@ -229,21 +231,23 @@ $mtpl->set_var('NAME',   $name);
 $mtpl->set_var('SUBJECT',$subject);\r
 $mtpl->set_var('TIME',   $time);\r
 \r
-# ... Umgebungsvariablen einfuegen\r
-\r
-if(isset($allowed_envs) && is_array($allowed_envs))\r
-{\r
- foreach($allowed_envs as $allowed_env)\r
- {\r
-  if(isset($_SERVER[$allowed_env]))\r
-  {\r
-   $mtpl->set_var('ENV_'.$allowed_env,$_SERVER[$allowed_env]);\r
-  }\r
-  else\r
-  {\r
-   $mtpl->set_var('ENV_'.$allowed_env,'');\r
-  }\r
- }\r
+# ... Umgebungsvariablen einfuegen...\r
+\r
+if(isset($allowed_envs) && is_array($allowed_envs)) {\r
+    foreach($allowed_envs as $allowed_env) {\r
+        if(isset($_SERVER[$allowed_env])) {\r
+            $mtpl->set_var('ENV_'.$allowed_env,$_SERVER[$allowed_env]);\r
+        }\r
+        else {\r
+            $mtpl->set_var('ENV_'.$allowed_env,'');\r
+        }\r
+    }\r
+}\r
+\r
+# ... eigene Felder einfuegen\r
+\r
+while(list($tpl_var,$user_field_content) = each($prepared_user_fields)) {\r
+    $mtpl->set_var($tpl_var,$user_field_content);\r
 }\r
 \r
 $mtpl->set_var('TEXT',$text);\r
@@ -258,85 +262,76 @@ $mailtext = preg_replace("/\015\012|\012|\015/","\n",$mailtext);
 \r
 # ... und die Mail abschicken (bei einem Fehler erscheint eine Meldung)\r
 \r
-if($recipient && is_array($aliases) && $aliases[$recipient])\r
-{\r
- # Empfaenger mit Alias-Namen\r
+if($recipient && is_array($aliases) && $aliases[$recipient]) {\r
+    # Empfaenger mit Alias-Namen\r
 \r
- $mailto = $aliases[$recipient];\r
   $mailto = $aliases[$recipient];\r
 }\r
 \r
 $mailto = semicolon_split($mailto);\r
 \r
-for($x=0;$x<count($mailto);$x++)\r
-{\r
- mail($mailto[$x],$encoded_subject,$mailtext,$header) or die($err_send_error);\r
+for($x=0;$x<count($mailto);$x++) {\r
+    mail($mailto[$x],$encoded_subject,$mailtext,$header) or die($err_send_error);\r
 }\r
 \r
 if($captcha_enable) session_destroy();\r
 \r
 # Mail wurde erfolgreich versendet, also wird die Dankesseite angezeigt\r
 \r
-if($return_url)\r
-{\r
- # Per Redirect auf Seite umleiten\r
-\r
- if(!preg_match('!://!',$return_url))\r
- {\r
-  # URL vervollstaendigen\r
-\r
-  $http_host = ($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];\r
-  $protocol  = '';\r
-  $port      = '';\r
-\r
-  if($_SERVER['HTTPS'])\r
-  {\r
-   # SSL-verschluesseltes HTTP\r
-\r
-   $protocol = 'https://';\r
-   if($_SERVER['SERVER_PORT'] != 443) $port = ':'.$_SERVER['SERVER_PORT'];\r
-  }\r
-  else\r
-  {\r
-   # Normales HTTP\r
-\r
-   $protocol = 'http://';\r
-   if($_SERVER['SERVER_PORT'] != 80) $port = ':'.$_SERVER['SERVER_PORT'];\r
-  }\r
-\r
-  if(preg_match('!^/!',$return_url))\r
-  {\r
-   $return_url = $protocol.$http_host.$port.$return_url;\r
-  }\r
-  else\r
-  {\r
-   if(preg_match('!/$!',$_SERVER['SCRIPT_NAME'])) $path = substr($_SERVER['SCRIPT_NAME'],0,-1);\r
-   $path = substr($path,0,strrpos($path,'/')+1);\r
-   if(!preg_match('!^/!',$path)) $path = '/'.$path;\r
-\r
-   $return_url = $protocol.$http_host.$port.$path.$return_url;\r
-  }\r
- }\r
-\r
- header('Status: 303 See Other');\r
- header('Location: '.$return_url);\r
+if($return_url) {\r
+    # Per Redirect auf Seite umleiten\r
+\r
+    if(!preg_match('!://!',$return_url)) {\r
+        # URL vervollstaendigen\r
+\r
+        $http_host = ($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];\r
+        $protocol  = '';\r
+        $port      = '';\r
+\r
+        if($_SERVER['HTTPS']) {\r
+            # SSL-verschluesseltes HTTP\r
+\r
+            $protocol = 'https://';\r
+            if($_SERVER['SERVER_PORT'] != 443) $port = ':'.$_SERVER['SERVER_PORT'];\r
+        }\r
+        else {\r
+            # Normales HTTP\r
+\r
+            $protocol = 'http://';\r
+            if($_SERVER['SERVER_PORT'] != 80) $port = ':'.$_SERVER['SERVER_PORT'];\r
+        }\r
+\r
+        if(preg_match('!^/!',$return_url)) {\r
+            $return_url = $protocol.$http_host.$port.$return_url;\r
+        }\r
+        else {\r
+            if(preg_match('!/$!',$_SERVER['SCRIPT_NAME'])) $path = substr($_SERVER['SCRIPT_NAME'],0,-1);\r
+            $path = substr($path,0,strrpos($path,'/')+1);\r
+            if(!preg_match('!^/!',$path)) $path = '/'.$path;\r
+\r
+            $return_url = $protocol.$http_host.$port.$path.$return_url;\r
+        }\r
+    }\r
+\r
+    header('Status: 303 See Other');\r
+    header('Location: '.$return_url);\r
 }\r
-else\r
-{\r
- # Mit Template formatierte Seite anzeigen\r
+else {\r
+    # Mit Template formatierte Seite anzeigen\r
 \r
- $stpl = new Template;\r
- $stpl->read_file($tpl_sent);\r
   $stpl = new Template;\r
   $stpl->read_file($tpl_sent);\r
 \r
- $stpl->set_var('EMAIL',  plain($email));\r
- $stpl->set_var('MAIL',   plain($mailtext));\r
- $stpl->set_var('NAME',   plain($name));\r
- $stpl->set_var('SUBJECT',plain($subject));\r
- $stpl->set_var('TEXT',   plain($text));\r
- $stpl->set_var('TIME',   plain($time));\r
   $stpl->set_var('EMAIL',  plain($email));\r
   $stpl->set_var('MAIL',   plain($mailtext));\r
   $stpl->set_var('NAME',   plain($name));\r
   $stpl->set_var('SUBJECT',plain($subject));\r
   $stpl->set_var('TEXT',   plain($text));\r
   $stpl->set_var('TIME',   plain($time));\r
 \r
- $stpl->parse();\r
   $stpl->parse();\r
 \r
- print $stpl->get_template();\r
   print $stpl->get_template();\r
 }\r
 \r
 #\r

patrick-canterino.de