e911824697141ef087d09f0d0eddc1f08bcc2128
[ldapsaisie.git] / public_html / includes / class / class.LSrelation.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 class LSrelation {
24
25   private $obj = null;
26   private $relationName = null;
27   private $config = null;
28
29   public function LSrelation(&$obj,$relationName) {
30     $this -> obj =& $obj;
31     $this -> relationName = $relationName;
32     if (isset($obj->config['LSrelation'][$relationName]) && is_array($obj->config['LSrelation'][$relationName])) {
33       $this -> config = $obj->config['LSrelation'][$relationName];
34     }
35     else {
36       LSerror :: addErrorCode('LSrelations_02',array('relation' => $relationName,'LSobject' => $obj -> getType()));
37     }
38   }
39
40   public function canEdit() {
41     return LSsession :: relationCanEdit($this -> obj -> getValue('dn'),$this -> obj -> getType(),$this -> relationName);
42   }
43
44   public function listRelatedObjects() {
45     if (LSsession :: loadLSobject($this -> config['LSobject'])) {
46       $objRel = new $this -> config['LSobject']();
47       if (isset($this -> config['list_function'])) {
48         if (method_exists($this -> config['LSobject'],$this -> config['list_function'])) {
49           return call_user_func_array(array($objRel, $this -> config['list_function']), array(&$this -> obj));
50         }
51         LSerror :: addErrorCode('LSrelations_01',array('function' => $this -> config['list_function'], 'action' =>  _('listing related objects'), 'relation' => $this -> relationName));
52         return False;
53       }
54       elseif (isset($this -> config['linkAttribute']) && isset($this -> config['linkAttributeValue'])) {
55         return $objRel -> listObjectsInRelation($this -> obj, $this -> config['linkAttribute'], $this -> obj -> getType(), $this -> config['linkAttributeValue']);
56       }
57       else {
58         LSerror :: addErrorCode('LSrelations_05',array('relation' => $this -> relationName,'LSobject' => $this -> config['LSobject'],'action' => _('listing related objects')));
59       }
60     }
61     else {
62       LSerror :: addErrorCode('LSrelations_04',array('relation' => $this -> relationName,'LSobject' => $this -> config['LSobject']));
63     }
64     return;
65   }
66
67   public function getRelatedKeyValue() {
68     if (LSsession :: loadLSobject($this -> config['LSobject'])) {
69       $objRel = new $this -> config['LSobject']();
70       if (isset($this -> config['getkeyvalue_function'])) {
71         if (method_exists($this -> config['LSobject'],$this -> config['getkeyvalue_function'])) {
72           return call_user_func_array(array($objRel, $this -> config['getkeyvalue_function']), array(&$this -> obj));
73         }
74         LSerror :: addErrorCode('LSrelations_01',array('function' => $this -> config['getkeyvalue_function'], 'action' =>  _('getting key value'), 'relation' => $this -> relationName));
75       }
76       elseif (isset($this -> config['linkAttribute']) && isset($this -> config['linkAttributeValue'])) {
77         return $objRel -> getObjectKeyValueInRelation($this -> obj, $this -> obj -> getType(), $this -> config['linkAttributeValue']);
78       }
79       else {
80         LSerror :: addErrorCode('LSrelations_05',array('relation' => $this -> relationName,'LSobject' => $this -> config['LSobject'],'action' => _('getting key value')));
81       }
82     }
83     else {
84       LSerror :: addErrorCode('LSrelations_04',array('relation' => $this -> relationName,'LSobject' => $this -> config['LSobject']));
85     }
86     return;
87   }
88
89   public function getRelatedEditableAttribute() {
90     if (isset($this -> config['canEdit_attribute'])) {
91       return $this -> config['canEdit_attribute'];
92     }
93     elseif (isset($this -> config['linkAttribute'])) {
94       return $this -> config['linkAttribute'];
95     }
96     return False;
97   }
98
99   public function canEditRelationWithObject($objRel) {
100     if (isset($this -> config['canEdit_function'])) {
101       if (method_exists($objRel,$this -> config['canEdit_function'])) {
102         return call_user_func(array($objRel, $this -> config['canEdit_function']));
103       }
104       LSerror :: addErrorCode('LSrelations_01',array('function' => $this -> config['canEdit_function'], 'action' =>  _('checking right on relation with specific object'), 'relation' => $this -> relationName));
105       return False;
106     }
107     elseif ($this -> getRelatedEditableAttribute()) {
108       return LSsession :: canEdit($objRel -> getType(),$objRel -> getDn(),$this -> getRelatedEditableAttribute());
109     }
110     else {
111       LSerror :: addErrorCode('LSrelations_05',array('relation' => $this -> relationName,'LSobject' => $this -> config['LSobject'],'action' => _('checking right on relation with specific object')));
112     }
113   }
114
115   public function removeRelationWithObject($objRel) {
116     if (isset($this -> config['remove_function'])) {
117       if (method_exists($this -> config['LSobject'],$this -> config['remove_function'])) {
118         return call_user_func_array(array($objRel, $this -> config['remove_function']),array(&$this -> obj));
119       }
120       LSerror :: addErrorCode('LSrelations_01',array('function' => $this -> config['remove_function'], 'action' =>  _('deleting'), 'relation' => $this -> relationName));
121       return False;
122     }
123     elseif (isset($this -> config['linkAttribute']) && isset($this -> config['linkAttributeValue'])) {
124       return $objRel -> deleteOneObjectInRelation($this -> obj, $this -> config['linkAttribute'], $this -> obj -> getType(), $this -> config['linkAttributeValue']);
125     }
126     else {
127       LSerror :: addErrorCode('LSrelations_05',array('relation' => $this -> relationName,'LSobject' => $this -> config['LSobject'],'action' => _('removing relation with specific object')));
128     }
129     return;
130   }
131
132   public function renameRelationWithObject($objRel,$oldKeyValue) {
133     if (isset($this -> config['rename_function'])) {
134       if (method_exists($objRel,$this -> config['rename_function'])) {
135         return call_user_func_array(array($objRel, $this -> config['rename_function']), array(&$this -> obj, $oldKeyValue));
136       }
137       LSerror :: addErrorCode('LSrelations_01',array('function' => $this -> config['rename_function'], 'action' =>  _('renaming'), 'relation' => $this -> relationName));
138       return False;
139     }
140     elseif (isset($this -> config['linkAttribute']) && isset($this -> config['linkAttributeValue'])) {
141       return $objRel -> renameOneObjectInRelation($this -> obj, $oldKeyValue, $this -> config['linkAttribute'], $this -> obj -> getType(), $this -> config['linkAttributeValue']);
142     }
143     else {
144       LSerror :: addErrorCode('LSrelations_05',array('relation' => $this -> relationName,'LSobject' => $this -> config['LSobject'],'action' => _('checking right on relation with specific object')));
145     }
146     return;
147   }
148
149   public function updateRelations($listDns) {
150     if (LSsession :: loadLSobject($this -> config['LSobject'])) {
151       $objRel = new $this -> config['LSobject']();
152       if (isset($this -> config['update_function'])) {
153         if (method_exists($objRel,$this -> config['update_function'])) {
154           return call_user_func_array(array($objRel, $this -> config['update_function']), array(&$this -> obj, $listDns));
155         }
156         LSerror :: addErrorCode('LSrelations_01',array('function' => $this -> config['update_function'], 'action' =>  _('updating'), 'relation' => $this -> relationName));
157       }
158       elseif (isset($this -> config['linkAttribute']) && isset($this -> config['linkAttributeValue'])) {
159         return $objRel -> updateObjectsInRelation($this -> obj, $listDns, $this -> config['linkAttribute'], $this -> obj -> getType(), $this -> config['linkAttributeValue'],null);
160       }
161       else {
162         LSerror :: addErrorCode('LSrelations_05',array('relation' => $this -> relationName,'LSobject' => $this -> config['LSobject'],'action' => _('updating relations')));
163       }
164     }
165     else {
166       LSerror :: addErrorCode('LSrelations_04',array('relation' => $this -> relationName,'LSobject' => $this -> config['LSobject']));
167     }
168     return;
169   }
170
171  /*
172   * Méthode chargeant les dépendances d'affichage
173   * 
174   * @retval void
175   */
176   public static function loadDependenciesDisplay() {
177     if (LSsession :: loadLSclass('LSselect')) {
178       LSselect :: loadDependenciesDisplay();
179     }
180     LSsession :: addJSscript('LSrelation.js');
181     LSsession :: addCssFile('LSrelation.css');
182     
183     LSsession :: addJSconfigParam('LSrelation_labels', array(
184       'close_confirm_text'      => _('Do you really want to delete'),
185       'close_confirm_title'     => _('Warning'), 
186       'close_confirm_validate'  => _('Delete')
187     ));
188   }
189   
190  /*
191   * Méthode chargeant les informations des LSrelations d'un objet et définissant
192   * les variables templates pour l'affichage dans une LSview.
193   * 
194   * @param[in] LSldapObject L'objet dont on cherche les LSrelations
195   * 
196   * @retval void
197   */ 
198   public static function displayInLSview($object) {
199     if (($object instanceof LSldapObject) && (is_array($object -> config['LSrelation']))) {
200       $LSrelations=array();
201       $LSrelations_JSparams=array();
202       foreach($object -> config['LSrelation'] as $relationName => $relationConf) {
203         if (LSsession :: relationCanAccess($object -> getValue('dn'),$object->getType(),$relationName)) {
204           $return=array(
205             'label' => __($relationConf['label']),
206             'LSobject' => $relationConf['LSobject']
207           );
208           
209           if (isset($relationConf['emptyText'])) {
210             $return['emptyText'] = __($relationConf['emptyText']);
211           }
212           else {
213             $return['emptyText'] = _('No object.');
214           }
215           
216           $id=rand();
217           $return['id']=$id;
218           $LSrelations_JSparams[$id]=array(
219             'emptyText' => $return['emptyText']
220           );
221           $_SESSION['LSrelation'][$id] = array(
222             'relationName' => $relationName,
223             'objectType' => $object -> getType(),
224             'objectDn' => $object -> getDn(),
225           );
226           $relation = new LSrelation($object, $relationName);
227           if ($relation -> canEdit()) {
228             $return['actions'][] = array(
229               'label' => _('Modify'),
230               'url' => 'select.php?LSobject='.$relationConf['LSobject'].'&amp;multiple=1'.($relation -> getRelatedEditableAttribute()?'&amp;editableAttr='.$relation -> getRelatedEditableAttribute():''),
231               'action' => 'modify'
232             );
233           }
234           
235           $list = $relation -> listRelatedObjects();
236           if (is_array($list)) {
237             foreach($list as $o) {
238               $return['objectList'][] = array(
239                 'text' => $o -> getDisplayName(NULL,true),
240                 'dn' => $o -> getDn(),
241                 'canEdit' => $relation -> canEditRelationWithObject($o)
242               );
243             }
244           }
245           else {
246             $return['objectList']=array();
247           }
248           $LSrelations[]=$return;
249         }
250       }
251       
252       self :: loadDependenciesDisplay();
253       LStemplate :: assign('LSrelations',$LSrelations);
254       LSsession :: addJSconfigParam('LSrelations',$LSrelations_JSparams);
255     }
256   }
257   
258   public static function ajax_refreshSession(&$return) {
259     if ((isset($_REQUEST['id'])) && (isset($_REQUEST['href'])) ) {
260       if (isset($_SESSION['LSrelation'][$_REQUEST['id']])) {
261         $conf = $_SESSION['LSrelation'][$_REQUEST['id']];
262         if (LSsession ::loadLSobject($conf['objectType'])) {
263           $object = new $conf['objectType']();
264           if (($object -> loadData($conf['objectDn'])) && (isset($object->config['LSrelation'][$conf['relationName']]))) {
265             $relation = new LSrelation($object, $conf['relationName']);
266             $LSobjectInRelation = $object->config['LSrelation'][$conf['relationName']]['LSobject'];
267             if ($relation -> canEdit()) {
268               $list = $relation -> listRelatedObjects();
269               $_SESSION['LSselect'][$LSobjectInRelation]=array();
270               if (is_array($list)) {
271                 foreach($list as $o) {
272                   $_SESSION['LSselect'][$LSobjectInRelation][] = $o -> getDn();
273                 }
274               }
275               $return = array(
276                 'href' => $_REQUEST['href'],
277                 'id' => $_REQUEST['id']
278               );
279             }
280             else {
281               LSerror :: addErrorCode('LSsession_11');
282             }
283           }
284           else {
285             LSerror :: addErrorCode('LSsession_12');
286           }
287         }
288         else {
289           LSerror :: addErrorCode('LSsession_12');
290         }
291       }
292       else {
293         LSerror :: addErrorCode('LSsession_12');
294       }
295     }
296   }
297   
298   public static function ajax_refreshList(&$data) {
299     if (isset($_REQUEST['id'])) {
300       if (isset($_SESSION['LSrelation'][$_REQUEST['id']])) {
301         $conf = $_SESSION['LSrelation'][$_REQUEST['id']];
302         if (LSsession ::loadLSobject($conf['objectType'])) {
303           $object = new $conf['objectType']();
304           if (($object -> loadData($conf['objectDn'])) && (isset($object->config['LSrelation'][$conf['relationName']]))) {
305             $relation = new LSrelation($object, $conf['relationName']);
306             $LSobjectInRelation = $object->config['LSrelation'][$conf['relationName']]['LSobject'];
307             $relationConf = $object->config['LSrelation'][$conf['relationName']];
308             if($relation -> updateRelations($_SESSION['LSselect'][$LSobjectInRelation])) {
309               $list = $relation -> listRelatedObjects();
310               if (is_array($list)&&(!empty($list))) {
311                 $data['html']="";
312                 foreach($list as $o) {
313                   if ($relation -> canEditRelationWithObject($o)) {
314                     $class=' LSrelation_editable';
315                   }
316                   else {
317                     $class='';
318                   }
319                   $data['html'].= "<li class='LSrelation'><a href='view.php?LSobject=$LSobjectInRelation&amp;dn=".urlencode($o -> getDn())."' class='LSrelation$class' id='LSrelation_".$_REQUEST['id']."_".$o -> getDn()."'>".$o -> getDisplayName(NULL,true)."</a></li>\n";
320                 }
321               }
322               else {
323                 if (isset($relationConf['emptyText'])) {
324                   $data['html'] = "<li>".__($relationConf['emptyText'])."</li>\n";
325                 }
326                 else {
327                   $data['html'] = "<li>"._('No object.')."</li>\n";
328                 }
329               }
330               $data['id'] = $_REQUEST['id'];
331             }
332             else {
333               LSerror :: addErrorCode('LSrelations_03',$relationName);
334             }
335           }
336           else {
337             LSerror :: addErrorCode('LSsession_12');
338           }
339         }
340         else {
341           LSerror :: addErrorCode('LSsession_12');
342         }
343       }
344       else {
345         LSerror :: addErrorCode('LSsession_12');
346       }
347     }
348   }
349   
350   public static function ajax_deleteByDn(&$data) {
351     if ((isset($_REQUEST['id'])) && (isset($_REQUEST['dn']))) {
352       if (isset($_SESSION['LSrelation'][$_REQUEST['id']])) {
353         $conf = $_SESSION['LSrelation'][$_REQUEST['id']];
354         if (LSsession ::loadLSobject($conf['objectType'])) {
355           $object = new $conf['objectType']();
356           if (($object -> loadData($conf['objectDn'])) && (isset($object->config['LSrelation'][$conf['relationName']]))) {
357             $relation = new LSrelation($object, $conf['relationName']);
358             if ($relation -> canEdit()) {
359               $list = $relation -> listRelatedObjects();
360               if (is_array($list)) {
361                 $ok=false;
362                 foreach($list as $o) {
363                   if($o -> getDn() == $_REQUEST['dn']) {
364                     if (!$relation -> canEditRelationWithObject($o)) {
365                       LSerror :: addErrorCode('LSsession_11');
366                       return;
367                     }
368                     if (!$relation -> removeRelationWithObject($o)) {
369                       LSerror :: addErrorCode('LSrelations_03',$conf['relationName']);
370                     }
371                     else {
372                       $ok = true;
373                     }
374                     break;
375                   }
376                 }
377                 if (!$ok) {
378                   LSdebug($_REQUEST['value']." introuvé parmi la liste");
379                   LSerror :: addErrorCode('LSrelations_03',$conf['relationName']);
380                 }
381                 else {
382                   $data=array(
383                     'dn' => $_REQUEST['dn'],
384                     'id' => $_REQUEST['id']
385                   );
386                 }
387               }
388               else {
389                 LSerror :: addErrorCode('LSrelations_03',$conf['relationName']);
390               }
391             }
392             else {
393               LSerror :: addErrorCode('LSsession_11');
394             }
395           }
396           else {
397             LSerror :: addErrorCode('LSsession_12');
398           }
399         }
400         else {
401           LSerror :: addErrorCode('LSsession_12');
402         }
403       }
404       else {
405         LSerror :: addErrorCode('LSsession_12');
406       }
407     }
408   }
409 }
410
411 /**
412  * Error Codes
413  **/
414 LSerror :: defineError('LSrelations_01',
415 _("LSrelation : The function %{function} for action '%{action}' on the relation %{relation} is unknow.")
416 );
417 LSerror :: defineError('LSrelations_02',
418 _("LSrelation : Relation %{relation} of object type %{LSobject} unknow.")
419 );
420 LSerror :: defineError('LSrelations_03',
421 _("LSrelation : Error during relation update of the relation %{relation}.")
422 );
423 LSerror :: defineError('LSrelations_04',
424 _("LSrelation : Object type %{LSobject} unknow (Relation : %{relation}).")
425 );
426 LSerror :: defineError('LSrelations_05',
427 _("LSrelation : Incomplete configuration for LSrelation %{relation} of object type %{LSobject} for action : %{action}.")
428 );