- Ecriture du LSsession
[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                 $GLOBALS['LSsession'] -> loadLSclass('LSformElement');
63   }
64   
65   /**
66    * Affiche le formualaire
67    *
68    * @author Benjamin Renard <brenard@easter-eggs.com>
69    *
70    * @retval void
71    */   
72   function display(){
73                 $GLOBALS['LSsession'] -> addJSscript('LSform.js');
74                 $GLOBALS['LSsession'] -> addCssFile('LSform.css');
75                 $GLOBALS['Smarty'] -> assign('LSform_action',$_SERVER['PHP_SELF']);
76                 $LSform_header = "\t<input type='hidden' name='validate' value='LSform'/>\n\t<input type='hidden' name='idForm' id='LSform_idform' value='".$this -> idForm."'/>\n\t<input type='hidden' name='LSform_objecttype' id='LSform_objecttype'  value='".$this -> ldapObject -> getType()."'/>\n";
77                 $GLOBALS['Smarty'] -> assign('LSform_header',$LSform_header);
78                 $fields = array();
79                 foreach($this -> elements as $element) {
80                         $field = array();
81                         $field = $element -> getDisplay();
82                         if (isset($this -> _elementsErrors[$element -> name])) {
83                                 $field['errors']= $this -> _elementsErrors[$element -> name];
84                         }
85                         $fields[] = $field;
86                 }
87                 $GLOBALS['Smarty'] -> assign('LSform_fields',$fields);
88                 if($this -> can_validate) {
89                         $GLOBALS['Smarty'] -> assign('LSform_submittxt',$this -> submit);
90                 }
91   }
92   
93   /**
94    * Défini l'erreur sur un champ
95    *
96    * @author Benjamin Renard <brenard@easter-eggs.com>
97    *
98    * @param[in] $attr [<b>required</b>] string Le nom du champ
99    * @param[in] $msg Le format du message d'erreur à afficher (pouvant comporter
100    *                 des valeurs %{[n'importe quoi]} qui seront remplacé par le label
101    *                 du champs concerné.
102    *
103    * @retval void
104    */   
105   function setElementError($attr,$msg=NULL) {
106     if($msg!='') {
107       $msg_error=getFData($msg,$attr->getLabel());
108     }
109     else {
110       $msg_error=getFData(_("Les données pour l'attribut %{label} ne sont pas valides."),$attr->getLabel());
111     }
112     $this -> _elementsErrors[$attr->name][]=$msg_error;
113   }
114   
115   /**
116    * Verifie si le formulaire a été validé et que les données sont valides.
117    *
118    * @author Benjamin Renard <brenard@easter-eggs.com>
119    *
120    * @retval boolean true si le formulaire a été validé et que les données ont été validées, false sinon
121    */   
122   function validate(){
123     if(!$this -> can_validate)
124       return;
125     if ($this -> isSubmit()) {
126                         if (!$this -> getPostData()) {
127                                 $GLOBALS['LSerror'] -> addErrorCode(201);
128                                 return;
129                         }
130       //Validation des données ici !!! ///
131                         if (!$this -> checkData()) {
132                                 $this -> setValuesFromPostData();
133                                 return;
134                         }
135                         debug("les données sont checkées");
136                         $this -> _isValidate = true;
137                         return true;
138                 }
139                 return false;
140   }
141
142         /**
143          * Vérifier les données du formulaire à partir des régles définis sur les champs
144          *
145          * @author Benjamin Renard <brenard@easter-eggs.com>
146          *
147          * @retval boolean true si toutes la saisie est OK, false sinon
148          */
149         function checkData() {
150                 $retval=true;
151                 foreach ($this -> _postData as $element => $values) {
152                         if(!is_array($values)) {
153                                 $values=array($values);
154                         }
155                         if ($this -> elements[$element] -> isRequired()) {
156                                 if (!$this -> checkRequired($values)) {
157                                         $this -> setElementError($this -> elements[$element],_("Champ obligatoire"));
158                                         $retval=false;
159                                 }
160                         }
161
162                         foreach($values as $value) {
163                                 if (empty($value)) {
164                                         continue;
165                                 }
166                                 if (!is_array($this -> _rules[$element]))
167                                         continue;
168                                 $GLOBALS['LSsession'] -> loadLSclass('LSformRule');
169                                 foreach($this -> _rules[$element] as $rule) {
170                                         $ruleType="LSformRule_".$rule['name'];
171                                         $GLOBALS['LSsession'] -> loadLSclass($ruleType);
172                                         if (! call_user_func(array( $ruleType,'validate') , $value, $rule['options'])) {
173                                                 $retval=false;
174                                                 $this -> setElementError($this -> elements[$element],$rule['options']['msg']);
175                                         }
176                                 }
177                         }
178                 }
179                 return $retval;
180         }
181
182         /**
183          * Vérifie si au moins une valeur est présente dans le tableau
184          *
185          * @author Benjamin Renard <brenard@easter-eggs.com>
186          *
187          * @param[in] $data array tableau de valeurs
188          *
189          * @retval boolean true si au moins une valeur est présente, false sinon
190          */
191         function checkRequired($data) {
192                 foreach($data as $val) {
193                         if (!empty($val))
194                                 return true;
195                 }
196                 return;
197         }
198
199   /**
200          * Verifie si la saisie du formulaire est présente en POST
201          *
202          * @author Benjamin Renard <brenard@easter-eggs.com>
203          *
204          * @retval boolean true si la saisie du formulaire est présente en POST, false sinon
205          */
206   function isSubmit() {
207     if( (isset($_POST['validate']) && ($_POST['validate']=='LSform')) && (isset($_POST['idForm']) && ($_POST['idForm'] == $this -> idForm)) )
208       return true;
209                 return;
210   }
211
212         /**
213          * Récupère les valeurs postées dans le formulaire
214          *
215          * @author Benjamin Renard <brenard@easter-eggs.com>
216          *
217          * @retval boolean true si les valeurs ont bien été récupérées, false sinon.
218          */
219         function getPostData() {
220                 foreach($this -> elements as $element_name => $element) {
221                         if( !($element -> getPostData($this -> _postData)) ) {
222                                 $GLOBALS['LSerror'] -> addErrorCode(202,$element_name);
223                                 return;
224                         }
225                 }
226                 return true;
227         }
228
229         /*
230          * Ajoute un élément au formulaire
231          * 
232          * Ajoute un élément au formulaire et définis les informations le concernant.
233          *
234          * @param[in] $type string Le type de l'élément
235          * @param[in] $name string Le nom de l'élément
236          * @param[in] $label string Le label de l'élément
237          * @param[in] $param mixed Paramètres supplémentaires
238          *
239          * @retval LSformElement
240          */
241         function addElement($type,$name,$label,$params=array()) {
242                 $elementType='LSformElement_'.$type;
243                 $GLOBALS['LSsession'] -> loadLSclass($elementType);
244                 if (!class_exists($elementType)) {
245                         $GLOBALS['LSerror'] -> addErrorCode(205,array('type' => $type));        
246                         return;
247                 }
248                 $element=$this -> elements[$name] = new $elementType($this,$name,$label,$params);
249                 if ($element) {
250                         return $element;
251                 }
252                 else {
253                         unset ($this -> elements[$name]);
254                         $GLOBALS['LSerror'] -> addErrorCode(206,array('element' => $name));
255                         return;
256                 }
257         }
258
259         /*
260          * Ajoute une règle sur un élément du formulaire
261          *
262          * @author Benjamin Renard <brenard@easter-eggs.com>
263          *
264          * @param[in] $element string Le nom de l'élément conserné
265          * @param[in] $rule string Le nom de la règle à ajouter
266          * @param[in] $options array Options (facultative)
267          *
268          * @retval boolean
269          */
270         function addRule($element, $rule, $options=array()) {
271                 if ( isset($this ->elements[$element]) ) {
272                         if ($this -> isRuleRegistered($rule)) {
273                                 $this -> _rules[$element][]=array(
274                                                                         'name' => $rule,
275                                                                         'options' => $options
276                                                                         );
277                                 return true;
278                         }
279                         else {
280                                 $GLOBALS['LSerror'] -> addErrorCode(43,array('attr' => $element,'rule'=>$rule));                        
281                                 return;
282                         }
283                 }
284                 else {  
285                         $GLOBALS['LSerror'] -> addErrorCode(204,array('element' => $element));
286                         return;
287                 }
288         }
289
290
291
292
293         /*
294          * Définis comme requis un élément
295          *
296          * @author Benjamin Renard <brenard@easter-eggs.com>
297          *
298          * @param[in] $element string Le nom de l'élément conserné
299          *
300          * @retval boolean
301          */
302         function setRequired($element) {
303                 if (isset( $this -> elements[$element] ) )
304                         return $this -> elements[$element] -> setRequired();
305                 else
306                         return;
307         }
308
309         /*
310          * Détermine la valider de la règle
311          *
312          * Devra déterminer si la règle passez en paramètre est correcte
313          *
314          * @author Benjamin Renard <brenard@easter-eggs.com>
315          *
316          * @param[in] $element string Le nom de l'élément conserné
317          */
318         function isRuleRegistered($rule) {
319                 $GLOBALS['LSsession'] -> loadLSclass('LSformRule');
320                 $GLOBALS['LSsession'] -> loadLSclass('LSformRule_'.$rule);
321                 return class_exists('LSformRule_'.$rule);
322         }
323
324         /**
325          * Retourne les valeurs validés du formulaire
326          *
327          * @retval mixed Les valeurs validés du formulaire, ou false si elles ne le sont pas
328          */
329         function exportValues() {
330                 if ($this -> _isValidate) {
331                         return $this -> _postData;
332                 }
333                 else {
334                         return;
335                 }
336         }
337
338         /**
339          * Retourn un élement du formulaire
340          *
341          * @param[in] string $element Nom de l'élement voulu
342          *
343          * @retval LSformElement L'élement du formulaire voulu
344          */
345         function getElement($element) {
346                 return $this -> elements[$element];
347         }
348
349         /**
350          * Défini les valeurs des élements à partir des valeurs postées
351          *
352          * @retval boolean True si les valeurs ont été définies, false sinon.
353          */
354         function setValuesFromPostData() {
355                 if (empty($this -> _postData)) {
356                         return;
357                 }
358                 foreach($this -> _postData as $element => $values) {
359                         $this -> elements[$element] -> setValue($values);
360                 }
361                 return true;
362         }
363
364         /**
365          * Retourne le code HTML d'un champ vide.
366          * 
367          * @param[in] string Le nom du champ du formulaire
368          *
369          * @retval string Le code HTML du champ vide.
370          */
371         function getEmptyField($element) {
372                 $element = $this -> getElement($element);
373                 if ($element) {
374                         return $element -> getEmptyField();                     
375                 }
376                 else
377                         return;
378         }
379
380 }
381
382 ?>