- LSview : Passage par le JS de la traduction du label de suppression.
[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   var $maxFileSize = NULL;
47
48   /**
49    * Constructeur
50    *
51    * Cette methode construit l'objet et définis la configuration.
52    *
53    * @author Benjamin Renard <brenard@easter-eggs.com>
54    *
55    * @param[in] $idForm [<b>required</b>] string L'identifiant du formulaire
56    * @param[in] $submit string La valeur du bouton submit
57    *
58    * @retval void
59    */ 
60   function LSform (&$ldapObject,$idForm,$submit="Envoyer"){
61     $this -> idForm = $idForm;
62     $this -> submit = $submit;
63     $this -> ldapObject = $ldapObject;
64     LSsession :: loadLSclass('LSformElement');
65   }
66   
67   /**
68    * Affiche le formualaire
69    *
70    * @author Benjamin Renard <brenard@easter-eggs.com>
71    *
72    * @retval void
73    */ 
74   function display(){
75     if ($this -> idForm == 'view') {
76       LSsession :: addJSscript('LSview.js');
77       LSsession :: addJSscript('LSform.js');
78     }
79     else {
80       LSsession :: addJSscript('LSformElement_field.js');
81       LSsession :: addJSscript('LSformElement.js');
82       LSsession :: addJSscript('LSform.js');
83     }
84     
85     LSsession :: addHelpInfos(
86       'LSform',
87       array(
88         'addFieldBtn' => _('Add a field to add another values.'),
89         'removeFieldBtn' => _('Delete this field.')
90       )
91     );
92     
93     LSsession :: addCssFile('LSform.css');
94     $GLOBALS['Smarty'] -> assign('LSform_action',$_SERVER['PHP_SELF']);
95     $LSform_header = "\t<input type='hidden' name='validate' value='LSform'/>\n
96     \t<input type='hidden' name='idForm' id='LSform_idform' value='".$this -> idForm."'/>\n
97     \t<input type='hidden' name='LSform_objecttype' id='LSform_objecttype'  value='".$this -> ldapObject -> getType()."'/>\n
98     \t<input type='hidden' name='LSform_objectdn' id='LSform_objectdn'  value='".$this -> ldapObject -> getValue('dn')."'/>\n";
99
100     
101     $LSform_object = array(
102       'type' => $this -> ldapObject -> getType(),
103       'dn' => $this -> ldapObject -> getValue('dn')
104     );
105     $GLOBALS['Smarty'] -> assign('LSform_object',$LSform_object);
106     
107     if (is_array($GLOBALS['LSobjects'][$LSform_object['type']]['LSform']['layout'])) {
108       $GLOBALS['Smarty'] -> assign('LSform_layout',$GLOBALS['LSobjects'][$LSform_object['type']]['LSform']['layout']);
109       $GLOBALS['Smarty'] -> assign('LSform_layout_nofield_label',_('Aucun champ.'));
110     }
111     
112     $fields = array();
113     foreach($this -> elements as $element) {
114       $field = array();
115       $field = $element -> getDisplay();
116       if (isset($this -> _elementsErrors[$element -> name])) {
117         $field['errors']= $this -> _elementsErrors[$element -> name];
118       }
119       $fields[$element -> name] = $field;
120     }
121     
122     if ($this -> maxFileSize) {
123       $LSform_header.="\t<input type='hidden' name='MAX_FILE_SIZE' value='".$this -> maxFileSize."'/>\n";
124     }
125     $GLOBALS['Smarty'] -> assign('LSform_header',$LSform_header);
126     
127     $GLOBALS['Smarty'] -> assign('LSform_fields',$fields);
128     if($this -> can_validate) {
129       $GLOBALS['Smarty'] -> assign('LSform_submittxt',$this -> submit);
130     }
131   }
132   
133   /**
134    * Affiche la vue
135    *
136    * @author Benjamin Renard <brenard@easter-eggs.com>
137    *
138    * @retval void
139    */ 
140   function displayView(){
141     LSsession :: addCssFile('LSform.css');
142     LSsession :: addJSscript('LSform.js');
143     LSsession :: addJSconfigParam('LSview_delete_label',_("Do you really want to delete"));
144     $LSform_object = array(
145       'type' => $this -> ldapObject -> getType(),
146       'dn' => $this -> ldapObject -> getDn()
147     );
148     $GLOBALS['Smarty'] -> assign('LSform_object',$LSform_object);
149     $fields = array();
150     foreach($this -> elements as $element) {
151       $field = $element -> getDisplay();
152       $fields[$element -> name] = $field;
153     }
154     $GLOBALS['Smarty'] -> assign('LSform_fields',$fields);
155     
156     if (is_array($GLOBALS['LSobjects'][$LSform_object['type']]['LSform']['layout'])) {
157       $GLOBALS['Smarty'] -> assign('LSform_layout',$GLOBALS['LSobjects'][$LSform_object['type']]['LSform']['layout']);
158       $GLOBALS['Smarty'] -> assign('LSform_layout_nofield_label',_('No field.'));
159     }
160   }  
161   
162   /**
163    * Défini l'erreur sur un champ
164    *
165    * @author Benjamin Renard <brenard@easter-eggs.com>
166    *
167    * @param[in] $attr [<b>required</b>] string Le nom du champ
168    * @param[in] $msg Le format du message d'erreur à afficher (pouvant comporter
169    *                 des valeurs %{[n'importe quoi]} qui seront remplacé par le label
170    *                 du champs concerné.
171    *
172    * @retval void
173    */ 
174   function setElementError($attr,$msg=NULL) {
175     if($msg!='') {
176       $msg_error=getFData($msg,$attr->getLabel());
177     }
178     else {
179       $msg_error=getFData(_("%{label} attribute data is not valid."),$attr->getLabel());
180     }
181     $this -> _elementsErrors[$attr->name][]=$msg_error;
182   }
183   
184   /**
185    * Savoir si des erreurs son définie pour un élement du formulaire
186    *
187    * @author Benjamin Renard <brenard@easter-eggs.com>
188    *
189    * @param[in] $element [<b>required</b>] string Le nom de l'élement
190    * 
191    * @retval boolean
192    */ 
193   function definedError($element=NULL) {
194     if ($element) {
195       return isset($this -> _elementsErrors[$element]);
196     }
197     else {
198       return !empty($this -> _elementsErrors);
199     }
200   }
201   
202   /**
203    * Retourne le tableau des erreurs
204    * 
205    * @retval Array array(element => array(errors))
206    */
207   function getErrors() {
208     return $this -> _elementsErrors;
209   }
210   
211   /**
212    * Verifie si le formulaire a été validé et que les données sont valides.
213    *
214    * @author Benjamin Renard <brenard@easter-eggs.com>
215    *
216    * @retval boolean true si le formulaire a été validé et que les données ont été validées, false sinon
217    */ 
218   function validate(){
219     if(!$this -> can_validate)
220       return;
221     if ($this -> isSubmit()) {
222       if (!$this -> getPostData()) {
223         LSerror :: addErrorCode('LSform_01');
224         return;
225       }
226       $this -> setValuesFromPostData();
227       //Validation des données ici !!! ///
228       if (!$this -> checkData()) {
229         return;
230       }
231       LSdebug("Data are checked up");
232       $this -> _isValidate = true;
233       return true;
234     }
235     return false;
236   }
237
238   /**
239    * Vérifier les données du formulaire à partir des régles définis sur les champs
240    *
241    * @author Benjamin Renard <brenard@easter-eggs.com>
242    *
243    * @retval boolean true si toutes la saisie est OK, false sinon
244    */
245   function checkData() {
246     $retval=true;
247     foreach ($this -> _postData as $element => $values) {
248       if(!is_array($values)) {
249         $values=array($values);
250       }
251       if ($this -> elements[$element] -> isRequired()) {
252         if (!$this -> checkRequired($values)) {
253           $this -> setElementError($this -> elements[$element],_("Mandatory field"));
254           $retval=false;
255         }
256       }
257
258       foreach($values as $value) {
259         if (empty($value)) {
260           continue;
261         }
262         if (!is_array($this -> _rules[$element]))
263           continue;
264         LSsession :: loadLSclass('LSformRule');
265         foreach($this -> _rules[$element] as $rule) {
266           $ruleType="LSformRule_".$rule['name'];
267           LSsession :: loadLSclass($ruleType);
268           if (! call_user_func(array( $ruleType,'validate') , $value, $rule['options'], $this -> getElement($element))) {
269             $retval=false;
270             $this -> setElementError($this -> elements[$element],$rule['options']['msg']);
271           }
272         }
273       }
274     }
275     return $retval;
276   }
277
278   /**
279    * Vérifie si au moins une valeur est présente dans le tableau
280    *
281    * @author Benjamin Renard <brenard@easter-eggs.com>
282    *
283    * @param[in] $data array tableau de valeurs
284    *
285    * @retval boolean true si au moins une valeur est présente, false sinon
286    */
287   function checkRequired($data) {
288     foreach($data as $val) {
289       if (!empty($val)||(is_string($val)&&($val=="0")))
290         return true;
291     }
292     return;
293   }
294
295   /**
296    * Verifie si la saisie du formulaire est présente en POST
297    *
298    * @author Benjamin Renard <brenard@easter-eggs.com>
299    *
300    * @retval boolean true si la saisie du formulaire est présente en POST, false sinon
301    */
302   function isSubmit() {
303     if( (isset($_POST['validate']) && ($_POST['validate']=='LSform')) && (isset($_POST['idForm']) && ($_POST['idForm'] == $this -> idForm)) )
304       return true;
305     return;
306   }
307
308   /**
309    * Défini arbitrairement des données en POST
310    * 
311    * @author Benjamin Renard <brenard@easter-eggs.com>
312    * 
313    * @param[in] $data array('attr' => array(values)) Tableau des données du formulaire
314    * @param[in] $consideredAsSubmit Définie si on force le formualaire comme envoyer
315    * 
316    * @retval boolean true si les données ont été définies, false sinon
317    */
318   function setPostData($data,$consideredAsSubmit=false) {
319     if (is_array($data)) {
320       foreach($data as $key => $values) {
321         if (!is_array($values)) {
322           $values = array($values);
323         }
324         $_POST[$key] = $values;
325       }
326       
327       if ($consideredAsSubmit) {
328         $_POST['validate']='LSform';
329         $_POST['idForm']=$this -> idForm;
330       }
331       
332       return true;
333     }
334     return;
335   }
336
337   /**
338    * Récupère les valeurs postées dans le formulaire
339    *
340    * @author Benjamin Renard <brenard@easter-eggs.com>
341    *
342    * @retval boolean true si les valeurs ont bien été récupérées, false sinon.
343    */
344   function getPostData() {
345     foreach($this -> elements as $element_name => $element) {
346       if( !($element -> getPostData($this -> _postData)) ) {
347         LSerror :: addErrorCode('LSform_02',$element_name);
348         return;
349       }
350     }
351     return true;
352   }
353
354   /**
355    * Ajoute un élément au formulaire
356    * 
357    * Ajoute un élément au formulaire et définis les informations le concernant.
358    *
359    * @param[in] $type string Le type de l'élément
360    * @param[in] $name string Le nom de l'élément
361    * @param[in] $label string Le label de l'élément
362    * @param[in] $param mixed Paramètres supplémentaires
363    *
364    * @retval LSformElement
365    */
366   function addElement($type,$name,$label,$params=array(),&$attr_html) {
367     $elementType='LSformElement_'.$type;
368     LSsession :: loadLSclass($elementType);
369     if (!class_exists($elementType)) {
370       LSerror :: addErrorCode('LSform_05',array('type' => $type));  
371       return;
372     }
373     $element=$this -> elements[$name] = new $elementType($this,$name,$label,$params,$attr_html);
374     if ($element) {
375       return $element;
376     }
377     else {
378       unset ($this -> elements[$name]);
379       LSerror :: addErrorCode('LSform_06',array('element' => $name));
380       return;
381     }
382   }
383
384   /**
385    * Ajoute une règle sur un élément du formulaire
386    *
387    * @author Benjamin Renard <brenard@easter-eggs.com>
388    *
389    * @param[in] $element string Le nom de l'élément conserné
390    * @param[in] $rule string Le nom de la règle à ajouter
391    * @param[in] $options array Options (facultative)
392    *
393    * @retval boolean
394    */
395   function addRule($element, $rule, $options=array()) {
396     if ( isset($this ->elements[$element]) ) {
397       if ($this -> isRuleRegistered($rule)) {
398         $this -> _rules[$element][]=array(
399                   'name' => $rule,
400                   'options' => $options
401                   );
402         return true;
403       }
404       else {
405         LSerror :: addErrorCode('LSattribute_03',array('attr' => $element,'rule'=>$rule));      
406         return;
407       }
408     }
409     else {  
410       LSerror :: addErrorCode('LSform_04',array('element' => $element));
411       return;
412     }
413   }
414
415
416
417
418   /**
419    * Définis comme requis un élément
420    *
421    * @author Benjamin Renard <brenard@easter-eggs.com>
422    *
423    * @param[in] $element string Le nom de l'élément conserné
424    *
425    * @retval boolean
426    */
427   function setRequired($element) {
428     if (isset( $this -> elements[$element] ) )
429       return $this -> elements[$element] -> setRequired();
430     else
431       return;
432   }
433
434   /**
435    * Détermine la valider de la règle
436    *
437    * Devra déterminer si la règle passez en paramètre est correcte
438    *
439    * @author Benjamin Renard <brenard@easter-eggs.com>
440    *
441    * @param[in] $element string Le nom de l'élément conserné
442    */
443   function isRuleRegistered($rule) {
444     LSsession :: loadLSclass('LSformRule');
445     LSsession :: loadLSclass('LSformRule_'.$rule);
446     return class_exists('LSformRule_'.$rule);
447   }
448
449   /**
450    * Retourne les valeurs validés du formulaire
451    *
452    * @retval mixed Les valeurs validés du formulaire, ou false si elles ne le sont pas
453    */
454   function exportValues() {
455     if ($this -> _isValidate) {
456       $retval=array();
457       foreach($this -> _postData as $element => $values) {
458         $retval[$element] = $this -> elements[$element] -> exportValues();
459       }
460       return $retval;
461     }
462     else {
463       return;
464     }
465   }
466
467   /**
468    * Retourn un élement du formulaire
469    *
470    * @param[in] string $element Nom de l'élement voulu
471    *
472    * @retval LSformElement L'élement du formulaire voulu
473    */
474   function getElement($element) {
475     return $this -> elements[$element];
476   }
477
478   /**
479    * Défini les valeurs des élements à partir des valeurs postées
480    *
481    * @retval boolean True si les valeurs ont été définies, false sinon.
482    */
483   function setValuesFromPostData() {
484     if (empty($this -> _postData)) {
485       return;
486     }
487     foreach($this -> _postData as $element => $values) {
488       $this -> elements[$element] -> setValueFromPostData($values);
489     }
490     return true;
491   }
492
493   /**
494    * Retourne le code HTML d'un champ vide.
495    * 
496    * @param[in] string Le nom du champ du formulaire
497    *
498    * @retval string Le code HTML du champ vide.
499    */
500   function getEmptyField($element) {
501     $element = $this -> getElement($element);
502     if ($element) {      
503       return $element -> getEmptyField();     
504     }
505     else {
506       return;
507     }
508   }
509   
510   /**
511    * Défini la taille maximal pour les fichiers envoyés par le formualaire
512    * 
513    * @param[in] $size La taille maximal en octets
514    * 
515    * @retval  void
516    **/
517   function setMaxFileSize($size) {
518     $this -> maxFileSize = $size;
519   }
520
521 }
522
523 /**
524  * Error Codes
525  */
526 LSerror :: defineError('LSform_01',
527 _("LSform : Error during the recovery of the values of the form.")
528 );
529 LSerror :: defineError('LSform_02',
530 _("LSform : Error durring the recovery of the value of the field '%{element}'.")
531 );
532 // No longer used
533 /*LSerror :: defineError(203,
534 _("LSform : Data of the field %{element} are not validate.")
535 );*/
536 LSerror :: defineError('LSform_04',
537 _("LSform : The field %{element} doesn't exist.")
538 );
539 LSerror :: defineError('LSform_05',
540 _("LSfom : Field type unknow (%{type}).")
541 );
542 LSerror :: defineError('LSform_06',
543 _("LSform : Error during the creation of the element '%{element}'.")
544 );
545 // No longer used
546 /*LSerror :: defineError(207,
547 _("LSform : No value has been entered into the field '%{element}'.")
548 );*/
549
550 ?>