- Ecriture du LSsession
[ldapsaisie.git] / trunk / includes / class / class.LSattribute.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 $GLOBALS['LSsession'] -> loadLSclass('LSattr_ldap');
24 $GLOBALS['LSsession'] -> loadLSclass('LSattr_html');
25
26 /**
27  * Attribut Ldap
28  *
29  * Cette classe modélise un attribut Ldap
30  *
31  * @author Benjamin Renard <brenard@easter-eggs.com>
32  */
33 class LSattribute {
34   
35   var $name;
36   var $config;
37   var $ldapObject;
38   var $ldap;
39   var $html;
40   var $data;
41   var $updateData=false;
42   var $is_validate=false;
43         var $_finalUpdateData=false;
44   
45   /**
46    * Constructeur
47    *
48    * Cette methode construit l'objet et définis la configuration.
49    * Elle lance la construction des objets LSattr_html et LSattr_ldap correspondant
50    * à ses types définis définis dans sa configuration
51    *
52    * @author Benjamin Renard <brenard@easter-eggs.com>
53    *
54    * @param[in] $name string Nom de l'attribut ldap
55    * @param[in] $config array Configuration de l'objet
56    * @param[in] &$ldapObject LSldapObject L'objet ldap parent
57    *
58    * @retval boolean Retourne true si la création a réussi, false sinon.
59    */   
60   function LSattribute ($name,$config,&$ldapObject) {
61     $this -> name = $name;
62     $this -> config = $config;
63                 $this -> ldapObject = $ldapObject;
64     $html_type = "LSattr_html_".$config['html_type'];
65     $ldap_type = "LSattr_ldap_".$config['ldap_type'];
66                 $GLOBALS['LSsession'] -> loadLSclass($html_type);
67                 $GLOBALS['LSsession'] -> loadLSclass($ldap_type);
68     if((class_exists($html_type))&&(class_exists($ldap_type))) {
69       $this -> html = new $html_type($name,$config,$this);
70       $this -> ldap = new $ldap_type($name,$config,$this);
71     }
72     else {
73       $GLOBALS['LSerror'] -> addErrorCode(41,array('attr' => $name,'html'=>$config['html_type'],'ldap'=>$config['ldap_type']));
74       return;
75     }
76     return true;
77   }
78   
79   
80   /**
81    * Retourne la valeur du label de l'attribut
82    *
83    * @author Benjamin Renard <brenard@easter-eggs.com>
84    *
85    * @retval string Le label de l'attribut
86    *
87    * @see LSattr_html::getLabel()
88    */   
89
90   function getLabel() {
91     return $this -> html -> getLabel();
92   }
93   
94   /**
95    * Défini la valeur de l'attribut
96    *
97    * @author Benjamin Renard <brenard@easter-eggs.com>
98    *
99    * @retval boolean true
100    */
101   function loadData($attr_data) {
102     $this -> data = $attr_data;
103     return true;
104   }
105   
106   /**
107    * Redéfini la valeur de l'attribut
108    *
109    * @author Benjamin Renard <brenard@easter-eggs.com>
110    *
111    * @retval boolean true
112    */
113   function reloadData($attr_data) {
114     $this -> data = $attr_data;
115     $this -> updateData=false;
116     $this -> is_validate=false;
117     return true;
118   }
119   
120   /**
121    * Retourne la valeur de l'attribut
122          *
123          * Retourne la valeur nouvelle si elle existe, sinon la valeur passé.
124    *
125    * @author Benjamin Renard <brenard@easter-eggs.com>
126    *
127    * @retval mixed La valeur de l'attribut
128    */
129   function getValue() {
130                 $updateData=$this -> getUpdateData();
131                 if (empty($updateData)) {
132             return $this -> data;
133                 }
134                 else {
135                         return $updateData;
136                 }
137   }
138   
139   /**
140    * Retourne la valeur d'affichage de l'attribut
141    *
142    * @author Benjamin Renard <brenard@easter-eggs.com>
143    *
144    * @retval string La valeur d'affichage de l'attribut
145    */
146   function getDisplayValue() {
147     $data = $this -> ldap -> getDisplayValue($this -> data);
148     if ($this -> config['onDisplay']) {
149       if (is_array($this -> config['onDisplay'])) {
150         $result=$data;
151         foreach($this -> config['onDisplay'] as $func) {
152           if (function_exists($func)) {
153             $result=$func($result);
154           }
155           else {
156             $GLOBALS['LSerror'] -> addErrorCode(42,array('attr' => $this->name,'func' => $func));
157             return;
158           }
159         }
160         return $result;
161       }
162       else {
163         if (function_exists($this -> config['onDisplay'])) {
164           return $this -> config['onDisplay']($data);
165         }
166         else {
167           $GLOBALS['LSerror'] -> addErrorCode(42,array('attr' => $this->name,'func' => $this -> config['onDisplay']));
168           return;
169         }
170       }
171     }
172     return $data;
173   }
174   
175   /**
176    * Ajoute l'attribut au formualaire
177    *
178    * Cette méthode ajoute l'attribut au formulaire $form si l'identifiant de celui-ci
179    * ($idForm) est connu dans la configuration de l'objet.
180    *
181    * @author Benjamin Renard <brenard@easter-eggs.com>
182    *
183    * @param[in] object $form Le formulaire dans lequel doit être ajouté l'attribut
184    * @param[in] string $idForm L'identifiant du formulaire
185    * @param[in] objet  &$obj Objet utilisable pour la génération de la valeur de l'attribut
186    *
187    * @retval boolean true si l'ajout a fonctionner ou qu'il n'est pas nécessaire, false sinon
188    */
189   function addToForm(&$form,$idForm,&$obj=NULL) {
190     if(isset($this -> config['form'][$idForm])) {
191       if($this -> data !='') {
192         $data=$this -> getFormVal();
193       }
194       else if (isset($this -> config['default_value'])) {
195         $data=$obj -> getFData($this -> config['default_value']);
196       }
197       
198       $element = $this -> html -> addToForm($form,$idForm,$data);
199                         if(!$element) {
200                                 $GLOBALS['LSerror'] -> addErrorCode(206,$this -> name);
201                         }
202
203       if($this -> config['required']==1) {
204         $form -> setRequired($this -> name);
205       }
206
207       if($this -> config['form'][$idForm]==0) {
208         $element -> freeze();
209       }
210       
211       if(isset($this -> config['check_data'])) {
212         if(is_array($this -> config['check_data'])) {
213           foreach ($this -> config['check_data'] as $rule => $rule_infos) {
214             if((!$form -> isRuleRegistered($rule))&&($rule!='')) {
215               $GLOBALS['LSerror'] -> addErrorCode(43,array('attr' => $this->name,'rule' => $rule));
216               return;
217             }
218             if(!isset($rule_infos['msg']))
219               $rule_infos['msg']=getFData(_('La valeur du champs %{label} est invalide.'),$this -> config['label']);
220             if(!isset($rule_infos['param']))
221               $rule_infos['param']=NULL;
222             $form -> addRule($this -> name,$rule,array('msg' => $rule_infos['msg'], 'param' => $rule_infos['param']));
223           }
224         }
225         else {
226           $GLOBALS['LSerror'] -> addErrorCode(44,$this->name);
227         }
228       }
229     }
230     return true;
231   }
232   
233   /**
234    * Rafraichis la valeur de l'attribut dans un formualaire
235    *
236    * @author Benjamin Renard <brenard@easter-eggs.com>
237    *
238    * @param[in] object &$form LSform Le formulaire dans lequel doit être ajouté l'attribut
239    * @param[in] string $idForm L'identifiant du formulaire
240    *
241    * @retval boolean true si la valeur a été rafraichie ou que ce n'est pas nécessaire, false sinon
242    */
243   function refreshForm(&$form,$idForm) {
244     if(isset($this -> config['form'][$idForm])) {
245       $form_element = &$form -> getElement($this -> name);
246       return $form_element -> setValue($this -> getFormVal());
247     }
248     return true;
249   }
250   
251   /**
252    * Retourne la valeur a afficher dans le formulaire
253    *
254    * @author Benjamin Renard <brenard@easter-eggs.com>
255    *
256    * @retval string La valeur a afficher dans le formulaire.
257    */
258   function getFormVal() {
259                 $data=$this -> getDisplayValue();
260                 if(!is_array($data))
261                         $data=array($data);
262     return $data;
263   }
264   
265   /**
266    * Définis les données de mises à jour si un changement a eut lieu
267    *
268    * @author Benjamin Renard <brenard@easter-eggs.com>
269    *
270    * @param[in] string $data Les données de mise à jour.
271    *
272    * @retval void
273    */
274   function setUpdateData($data) {
275     if($this -> getFormVal() != $data) {
276       $this -> updateData=$data;
277                         debug($this -> name.' is updated (o = '.$this -> getFormVal().' | n = '.$data.')');
278                 }
279   }
280   
281   /**
282    * Vérifie si l'attribut a été validé
283    *
284    * @author Benjamin Renard <brenard@easter-eggs.com>
285    *
286    * @retval boolean true si l'attribut a été validé, false sinon
287    */
288   function isValidate() {
289     return $this -> is_validate;
290   }
291   
292   /**
293    * Valide le champs
294    *
295    * @author Benjamin Renard <brenard@easter-eggs.com>
296    *
297    * @retval void
298    */
299   function validate() {
300     $this -> is_validate=true;
301   }
302   
303   /**
304    * Vérifie si l'attribut a été mise à jour
305    *
306    * @author Benjamin Renard <brenard@easter-eggs.com>
307    *
308    * @retval boolean true si l'attribut a été mis à jour, false sinon
309    */
310   function isUpdate() {
311     return ($this -> updateData)?true:false;
312   }
313   
314   /**
315    * Vérifie si l'attribut est obligatoire
316    *
317    * @author Benjamin Renard <brenard@easter-eggs.com>
318    *
319    * @retval boolean true si l'attribut est obligatoire, false sinon
320    */
321   function isRequired() {
322     return $this -> config['required'];
323   }
324   
325   /**
326    * Vérifie si la valeur de l'attribut peut être générée
327    *
328    * @author Benjamin Renard <brenard@easter-eggs.com>
329    *
330    * @retval boolean true si la valeur de l'attribut peut être générée, false sinon
331    */
332   function canBeGenerated() {
333     return (function_exists($this -> config['generate_function']));
334   }
335
336         /**
337          * Génere la valeur de l'attribut à partir de la fonction de génération
338          *
339          * @author Benjamin Renard <brenard@easter-eggs.com>
340          *
341          * @retval boolean true si la valeur à put être générée, false sinon
342          */
343         function generateValue() {
344                 if ( ! $this -> canBeGenerated() ) {
345                         return;
346                 }
347                 $value=call_user_func($this -> config['generate_function'],$this -> ldapObject);
348                 if (!empty($value)) {
349                         //$this -> setValue($value); // pas nécéssaire ??
350                         $this -> updateData=$value;
351                         return true;
352                 }
353                 return;
354         }
355   
356   /**
357    * Retourne la valeur de l'attribut pour son enregistrement dans l'annuaire
358          * si l'attribut à été modifié.
359    *
360    * @author Benjamin Renard <brenard@easter-eggs.com>
361    *
362    * @retval mixed La valeur de l'attribut pour son enregistrement dans l'annuaire
363    */
364   function getUpdateData() {
365                 if (!$this -> isUpdate()) {
366                         return;
367                 }
368                 if ( $this -> _finalUpdateData ) {
369                         return  $this -> _finalUpdateData;
370                 }
371     $data=$this -> updateData;
372     if ($this -> config['onSave']) {
373       if (is_array($this -> config['onSave'])) {
374         $result=$data;
375         foreach($this -> config['onSave'] as $func) {
376           if (function_exists($func)) {
377             $result=$func($result);
378           }
379           else {
380             $GLOBALS['LSerror'] -> addErrorCode(45,array('attr' => $this->name,'func' => $func));
381             return;
382           }
383         }
384       }
385       else {
386         if (function_exists($this -> config['onSave'])) {
387           $result = $this -> config['onSave']($data);
388         }
389         else {
390           $GLOBALS['LSerror'] -> addErrorCode(45,array('attr' => $this->name,'func' => $this -> config['onSave']));
391           return;
392         }
393       }
394     }
395     else {
396       $result = $this -> ldap -> getUpdateData($data);
397     }
398                 $this -> _finalUpdateData = $result;
399     return $result;
400   }
401  
402   /**
403    * Retourne la configuration de validation de l'attribut
404    *
405    * @author Benjamin Renard <brenard@easter-eggs.com>
406    *
407    * @retval mixed La configuration de validation de l'attribut
408    */
409   function getValidateConfig() {
410     return $this -> config['validation'];
411   }
412
413   /**
414    * Retourne les attributs dépendants de celui-ci
415    *
416    * @author Benjamin Renard <brenard@easter-eggs.com>
417    *
418    * @retval array les noms des attributs dépendants
419    */
420   function getDependsAttrs() {
421     return $this -> config['dependAttrs'];
422   } 
423 }
424
425 ?>