dc677fe606e834c3cf06ec2d619e83f850e8b4ed
[ldapsaisie.git] / trunk / includes / class / class.LSform.php
1 <?php
2 /*******************************************************************************
3  * Copyright (C) 2007 Easter-eggs
4  * http://ldapsaisie.labs.libre-entreprise.org
5  *
6  * Author: See AUTHORS file in top-level directory.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License version 2
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20
21 ******************************************************************************/
22
23
24 /**
25  * Formulaire pour LdapSaisie
26  *
27  * Cette classe gère les formulaires
28  *
29  * @author Benjamin Renard <brenard@easter-eggs.com>
30  */
31
32 class LSform {
33   var $ldapObject;
34   var $idForm;
35   var $can_validate = true;
36   var $elements = array();
37   var $_rules = array();
38
39         var $_postData = array();
40  
41         var $_elementsErrors = array();
42         var $_isValidate = false;
43
44         var $_notUpdate = array();
45
46         /**
47    * Constructeur
48    *
49    * Cette methode construit l'objet et définis la configuration.
50    *
51    * @author Benjamin Renard <brenard@easter-eggs.com>
52    *
53    * @param[in] $idForm [<b>required</b>] string L'identifiant du formulaire
54    * @param[in] $submit string La valeur du bouton submit
55    *
56    * @retval void
57    */   
58   function LSform (&$ldapObject,$idForm,$submit="Envoyer"){
59     $this -> idForm = $idForm;
60     $this -> submit = $submit;
61                 $this -> ldapObject = $ldapObject;
62   }
63   
64   /**
65    * Affiche le formualaire
66    *
67    * @author Benjamin Renard <brenard@easter-eggs.com>
68    *
69    * @retval void
70    */   
71   function display(){
72                 echo "<form method='post' action='".$_SERVER['PHP_SELF']."'>\n";
73                 echo "\t<input type='hidden' name='validate' value='LSform'/>\n";
74                 echo "\t<input type='hidden' name='idForm' value='".$this -> idForm."'/>\n";
75                 echo "<table>\n";
76                 foreach($this -> elements as $element) {
77                         $element -> display();
78                         if (isset($this -> _elementsErrors[$element -> name])) {
79                                 foreach ($this -> _elementsErrors[$element -> name] as $error) {
80                                         echo "<tr><td></td><td>$error</td></tr>";
81                                 }
82                         }
83                 }
84                 if($this -> can_validate) {
85                         echo "\t<tr>\n";
86                         echo "\t\t<td>&nbsp;</td>\n";
87                         echo "\t\t<td><input type='submit' value=\"".$this -> submit."\"/></td>\n";
88                         echo "\t</tr>\n";
89                 }
90                 echo "</table>\n";
91                 echo "</form>\n";
92   }
93   
94   /**
95    * Défini l'erreur sur un champ
96    *
97    * @author Benjamin Renard <brenard@easter-eggs.com>
98    *
99    * @param[in] $attr [<b>required</b>] string Le nom du champ
100    * @param[in] $msg Le format du message d'erreur à afficher (pouvant comporter
101    *                 des valeurs %{[n'importe quoi]} qui seront remplacé par le label
102    *                 du champs concerné.
103    *
104    * @retval void
105    */   
106   function setElementError($attr,$msg=NULL) {
107     if($msg!='') {
108       $msg_error=getFData($msg,$attr->getLabel());
109     }
110     else {
111       $msg_error=getFData(_("Les données pour l'attribut %{label} ne sont pas valides."),$attr->getLabel());
112     }
113     $this -> _elementsErrors[$attr->name][]=$msg_error;
114   }
115   
116   /**
117    * Verifie si le formulaire a été validé et que les données sont valides.
118    *
119    * @author Benjamin Renard <brenard@easter-eggs.com>
120    *
121    * @retval boolean true si le formulaire a été validé et que les données ont été validées, false sinon
122    */   
123   function validate(){
124     if(!$this -> can_validate)
125       return;
126     if ($this -> isSubmit()) {
127                         if (!$this -> getPostData()) {
128                                 $GLOBALS['LSerror'] -> addErrorCode(201);
129                                 return;
130                         }
131       //Validation des données ici !!! ///
132                         if (!$this -> checkData()) {
133                                 $this -> setValuesFromPostData();
134                                 return;
135                         }
136                         debug("les données sont checkées");
137                         $this -> _isValidate = true;
138                         return true;
139                 }
140                 return false;
141   }
142
143         /**
144          * Vérifier les données du formulaire à partir des régles définis sur les champs
145          *
146          * @author Benjamin Renard <brenard@easter-eggs.com>
147          *
148          * @retval boolean true si toutes la saisie est OK, false sinon
149          */
150         function checkData() {
151                 $retval=true;
152                 foreach ($this -> _postData as $element => $values) {
153                         if(!is_array($values)) {
154                                 $values=array($values);
155                         }
156                         if ($this -> elements[$element] -> isRequired()) {
157                                 if (!$this -> checkRequired($values)) {
158                                         $this -> setElementError($this -> elements[$element],_("Champ obligatoire"));
159                                         $retval=false;
160                                 }
161                         }
162
163                         foreach($values as $value) {
164                                 if (empty($value)) {
165                                         continue;
166                                 }
167                                 if (!is_array($this -> _rules[$element]))
168                                         continue;
169                                 foreach($this -> _rules[$element] as $rule) {
170                                         if (! call_user_func(array( "LSformRule_".$rule['name'],'validate') , $value, $rule['options'])) {
171                                                 $retval=false;
172                                                 $this -> setElementError($this -> elements[$element],$rule['options']['msg']);
173                                         }
174                                 }
175                         }
176                 }
177                 return $retval;
178         }
179
180         /**
181          * Vérifie si au moins une valeur est présente dans le tableau
182          *
183          * @author Benjamin Renard <brenard@easter-eggs.com>
184          *
185          * @param[in] $data array tableau de valeurs
186          *
187          * @retval boolean true si au moins une valeur est présente, false sinon
188          */
189         function checkRequired($data) {
190                 foreach($data as $val) {
191                         if (!empty($val))
192                                 return true;
193                 }
194                 return;
195         }
196
197   /**
198          * Verifie si la saisie du formulaire est présente en POST
199          *
200          * @author Benjamin Renard <brenard@easter-eggs.com>
201          *
202          * @retval boolean true si la saisie du formulaire est présente en POST, false sinon
203          */
204   function isSubmit() {
205     if( (isset($_POST['validate']) && ($_POST['validate']=='LSform')) && (isset($_POST['idForm']) && ($_POST['idForm'] == $this -> idForm)) )
206       return true;
207                 return;
208   }
209
210         /**
211          * Récupère les valeurs postées dans le formulaire
212          *
213          * @author Benjamin Renard <brenard@easter-eggs.com>
214          *
215          * @retval boolean true si les valeurs ont bien été récupérées, false sinon.
216          */
217         function getPostData() {
218                 foreach($this -> elements as $element_name => $element) {
219                         if( !($element -> getPostData($this -> _postData)) ) {
220                                 $GLOBALS['LSerror'] -> addErrorCode(202,$element_name);
221                                 return;
222                         }
223                 }
224                 return true;
225         }
226
227         /*
228          * Ajoute un élément au formulaire
229          * 
230          * Ajoute un élément au formulaire et définis les informations le concernant.
231          *
232          * @param[in] $type string Le type de l'élément
233          * @param[in] $name string Le nom de l'élément
234          * @param[in] $label string Le label de l'élément
235          * @param[in] $param mixed Paramètres supplémentaires
236          *
237          * @retval LSformElement
238          */
239         function addElement($type,$name,$label,$params=array()) {
240                 $elementType='LSformElement_'.$type;
241                 if (!class_exists($elementType)) {
242                         $GLOBALS['LSerror'] -> addErrorCode(205,array('type' => $type));        
243                         return;
244                 }
245                 $element=$this -> elements[$name] = new $elementType($this,$name,$label,$params);
246                 if ($element) {
247                         return $element;
248                 }
249                 else {
250                         unset ($this -> elements[$name]);
251                         $GLOBALS['LSerror'] -> addErrorCode(206,array('element' => $name));
252                         return;
253                 }
254         }
255
256         /*
257          * Ajoute une règle sur un élément du formulaire
258          *
259          * @author Benjamin Renard <brenard@easter-eggs.com>
260          *
261          * @param[in] $element string Le nom de l'élément conserné
262          * @param[in] $rule string Le nom de la règle à ajouter
263          * @param[in] $options array Options (facultative)
264          *
265          * @retval boolean
266          */
267         function addRule($element, $rule, $options=array()) {
268                 if ( isset($this ->elements[$element]) ) {
269                         if ($this -> isRuleRegistered($rule)) {
270                                 $this -> _rules[$element][]=array(
271                                                                         'name' => $rule,
272                                                                         'options' => $options
273                                                                         );
274                                 return true;
275                         }
276                         else {
277                                 $GLOBALS['LSerror'] -> addErrorCode(43,array('attr' => $element,'rule'=>$rule));                        
278                                 return;
279                         }
280                 }
281                 else {  
282                         $GLOBALS['LSerror'] -> addErrorCode(204,array('element' => $element));
283                         return;
284                 }
285         }
286
287
288
289
290         /*
291          * Définis comme requis un élément
292          *
293          * @author Benjamin Renard <brenard@easter-eggs.com>
294          *
295          * @param[in] $element string Le nom de l'élément conserné
296          *
297          * @retval boolean
298          */
299         function setRequired($element) {
300                 if (isset( $this -> elements[$element] ) )
301                         return $this -> elements[$element] -> setRequired();
302                 else
303                         return;
304         }
305
306         /*
307          * Détermine la valider de la règle
308          *
309          * Devra déterminer si la règle passez en paramètre est correcte
310          *
311          * @author Benjamin Renard <brenard@easter-eggs.com>
312          *
313          * @param[in] $element string Le nom de l'élément conserné
314          */
315         function isRuleRegistered($rule) {
316                 return class_exists('LSformRule_'.$rule);
317         }
318
319         /**
320          * Retourne les valeurs validés du formulaire
321          *
322          * @retval mixed Les valeurs validés du formulaire, ou false si elles ne le sont pas
323          */
324         function exportValues() {
325                 if ($this -> _isValidate) {
326                         return $this -> _postData;
327                 }
328                 else {
329                         return;
330                 }
331         }
332
333         /**
334          * Retourn un élement du formulaire
335          *
336          * @param[in] string $element Nom de l'élement voulu
337          *
338          * @retval LSformElement L'élement du formulaire voulu
339          */
340         function getElement($element) {
341                 return $this -> elements[$element];
342         }
343
344         /**
345          * Défini les valeurs des élements à partir des valeurs postées
346          *
347          * @retval boolean True si les valeurs ont été définies, false sinon.
348          */
349         function setValuesFromPostData() {
350                 if (empty($this -> _postData)) {
351                         return;
352                 }
353                 foreach($this -> _postData as $element => $values) {
354                         $this -> elements[$element] -> setValue($values);
355                 }
356                 return true;
357         }
358
359 }
360
361 ?>