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