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