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