Fix file permission brain damage.
[mspang/www.git] / newsgroup / lib / validator.inc
1 <?
2 /*
3  * Validator
4  *
5  * Validierung von Formulareingaben
6  *
7  * Autor: Florian Amrhein
8  */
9
10 class formvalidate {
11   var $fields=array();
12   /*
13    * Überprüft ein komplettes Formular auf korrekte Eingaben, und liefert
14    * false, falls irgendwo ein Fehler vorhanden ist.
15    * Setzt intern die entsprechenden Daten, die show_error und
16    * is_error zum Abfragen der Daten benötigen.
17    */
18   function validate() {
19     $errors=false;
20     foreach($this->fields as $field) {
21       switch($field->typ) {
22         case "text":
23         case "textarea":
24         case "checkbox":
25         case "radiobutton":
26           // Basteln wegen scheiss PHP
27           $valtmp=$field->validator;
28           // feld_leer*feld_darf_leer + 
29           // nicht_feld_leer*(testfkt.ex.*testfkt +
30           //   nicht_testfkt.ex)
31           if(
32              (
33               (
34                (!isset($_REQUEST[$field->name])) ||
35                (trim($_REQUEST[$field->name])=="")
36               ) &&
37               (isset($field->empty)) &&
38               ($field->empty==true)
39              ) || (
40               (isset($_REQUEST[$field->name])) &&
41               (trim($_REQUEST[$field->name])!="") &&
42               (
43                ($field->validator==false) ||
44                ($field->validator!=false) &&
45                (($errmsg=$valtmp($_REQUEST[$field->name]))===true)
46               )
47              )
48             ) {
49             // Feld leer und darf leer sein, oder
50             // feld voll und (testfunktion existiert und testfkt.=true
51             //                oder testfunktion existiert nicht)
52             $this->fields[$field->name]->error=false;
53           } else {
54             // Feld leer und darf nicht leer sein, oder
55             // Feld voll und testfkt.ex und testfunktion=false
56             $errors=true;
57             $this->fields[$field->name]->error=true;
58             if(isset($errmsg)) {
59               $this->fields[$field->name]->errormessage=$errmsg;
60               unset($errmsg);
61             }
62           }
63           break;
64         case "pulldown":
65         case "check-text":
66         case "radio-text":
67           if((isset($field->empty)) && (!$field->empty) &&
68              ((!isset($_REQUEST[$field->name])) ||
69               (trim($_REQUEST[$field->name])=="") ||
70               (($_REQUEST[$field->name]=="_frei") &&
71                ((!isset($_REQUEST[$field->name."_frei"])) ||
72                 (trim($_REQUEST[$field->name."_frei"])=="")
73                )
74               )
75              )
76             ) {
77             $errors=true;
78             $this->fields[$field->name]->error=true;
79           } else {
80             $this->fields[$field->name]->error=false;
81           }
82           break;
83       }
84 //      echo '<p>eval: '.$field->name.': '.$_REQUEST[$field->name].'</p>';
85     }
86     return !$errors;
87   }
88
89
90   /*
91    * liefert true, falls $name fehlerhaft ausgefüllt wurde
92    */
93   function is_error($name) {
94     return $this->fields[$name]->error;   
95   }
96
97   /*
98    * Liefert die individuelle Fehlermeldung, falls $name fehlerhaft
99    * ausgefüllt wurde. Falls keine Meldung vorliegt, wird false
100    * geliefert.
101    */
102   function geterrormessage($name) {
103     if(isset($this->fields[$name]->errormessage))
104       return $this->fields[$name]->errormessage;
105     else
106       return false;
107   }
108
109   /*
110    * Zeigt gegebenenfalls eine Fehlermeldung an, falls $name nicht
111    * korrekt ausgefüllt wurde
112    */
113   function show_error($name) {
114     if($this->is_error($name)) {
115       echo "<p>fehler</p>";
116     }
117   }
118
119   /*
120    * Zeigt den Titel zu einem Feld an. Ist das zugehörige Feld fehlerhaft 
121    * ausgefüllt worden, wird es (z.B. farblich) markiert.
122    *
123    * $name: Name des Feldes
124    * $text: auszugebener Text
125    */
126   function show_title($name,$text) {
127     if($this->is_error($name))
128       echo '<font color="red"><b>'.$text.'</b></font>';
129     else
130       echo $text;
131   }
132
133   /*
134    * Zeigt die Daten an, die der Benutzer in das Formular, ob richtig oder
135    * falsch ist egal, eingegeben hatte.
136    */
137   function show_value($name) {
138     echo stripslashes($_REQUEST[$name]);
139   }
140
141   /*
142    * Liefert Variablenwerte ohne vorherige Umkodierung/Zusammenfassung
143    * zurück
144    */
145   function value($name) {
146     if(is_array($_REQUEST[$name])) {
147       $a=$_REQUEST[$name];
148       return $a;
149     }
150     return stripslashes($_REQUEST[$name]);
151   }
152
153   /* Liefert Variablenwerte mit vorheriger Umkodierung/Zusammenfassung
154    * zurück. Vor allem wichtig bei Typ check-text und radio-text, wo
155    * der eigentliche Inhalt über mehrere Variablen verteilt ist, bzw.
156    * teilweise gar nicht zum Zuge kommt (freies Textfeld ausgefüllt,
157    * aber nicht angeklickt)
158    */
159   function get_value($name) {
160     if(is_array($_REQUEST[$name])) {
161       $a=$_REQUEST[$name];
162       // Freies Textfeld?
163       if(in_array("_frei",$a)) {
164         if((isset($_REQUEST[$name.'_frei'])) &&
165            ($_REQUEST[$name.'_frei']!=""))
166           $a[]=$_REQUEST[$name.'_frei'];
167         unset($a[$name.'_frei']);
168       }
169
170       return $a;
171     } else if(($_REQUEST[$name]=='_frei') &&
172               ($this->fields[$name]->typ=='radio-text')) {
173       return stripslashes($_REQUEST[$name.'_frei']);
174     } else
175       return stripslashes($_REQUEST[$name]);
176   }
177   
178   /*
179    * gibt einfach nur " checked" aus, wenn $name den wert $value enthält.
180    * Nötig für das Vorselektieren von Knöpfen
181    */
182   function show_checked($name,$value) {
183     global $fields;
184     if(($this->fields[$name]->typ!="checkbox") &&
185        ($this->fields[$name]->typ!="check-text")) {
186       if($this->value($name)==$value) {
187         if($this->fields[$name]->typ=="pulldown")
188           echo ' selected';
189         else
190           echo ' checked';
191       }
192     } else {
193       if(in_array($value,$this->value($name))) 
194         echo ' checked';
195     }
196   }
197
198   function show_selected($name,$value) {
199     global $fields;
200     if(($this->fields[$name]->typ!="checkbox") &&
201        ($this->fields[$name]->typ!="check-text")) {
202       if($this->value($name)==$value) {
203         echo ' selected';
204       }
205     }
206   }
207
208
209   /*
210    * Registriert eine Variable als zum Formular gehörend
211    *
212    * $name:  Name der Variablen
213    * $typ:   Art der Eingabe:
214    *         - text:         Textfeld mit einfacher freier Eingabe
215    *         - textarea:     Mehrzeiliger Text mit freier Eingabe
216    *         - checkbox:     Ankreuzfelder, mehrere gleichzeitig
217    *         - radiobutton:  Ankreuzfelder, nur eins gleichzeitig
218    *         - pulldown:     Pulldown-Menu, nut eins gleichzeitig
219    *         - check-text:   Ankreuzfelder+Textfeld, mehrere gleichzeitig
220    *         - radio-text:   Ankreuzfelder+Textfeld, maximal eins
221    * $empty: Darf das entsprechende Feld leer gelassen werden?
222    *         bzw. mindestens kein angekreuzt bzw. ausgefüllt?
223    * $validator: Information, wie der Inhalt auf Korrektheit geprüft
224    *             werden soll
225    * $errmsg: Fehlermeldung, die bei erkanntem Fehler ausgegeben 
226    *          werden soll
227    */
228   function register($name,$typ,$empty=true,$validator=false,$errmsg=false) {
229     $var->name=$name;
230     $var->typ=$typ;
231     $var->empty=$empty;
232     $var->validator=$validator;
233     $var->errmsg=$errmsg;
234     $this->fields[$name]=$var;
235   }
236
237   /*
238    * der Konstruktor
239    */
240   function formvalidate() {
241   }
242 }
243 ?>