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