299795113dee08a8ff909b1187177bcfab603a86
[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  /*
26   * Méthode chargeant les dépendances d'affichage
27   * 
28   * @retval void
29   */
30   public static function loadDependenciesDisplay() {
31     if (LSsession :: loadLSclass('LSselect')) {
32       LSselect :: loadDependenciesDisplay();
33     }
34     LSsession :: addJSscript('LSrelation.js');
35     LSsession :: addCssFile('LSrelation.css');
36     
37     LSsession :: addJSconfigParam('LSrelation_labels', array(
38       'close_confirm_text'      => _('Do you really want to delete'),
39       'close_confirm_title'     => _('Warning'), 
40       'close_confirm_validate'  => _('Delete')
41     ));
42   }
43   
44  /*
45   * Méthode chargeant les informations des LSrelations d'un objet et définissant
46   * les variables templates pour l'affichage dans une LSview.
47   * 
48   * @param[in] LSldapObject L'objet dont on cherche les LSrelations
49   * 
50   * @retval void
51   */ 
52   public static function displayInLSview($object) {
53     if (($object instanceof LSldapObject) && (is_array($object -> config['LSrelation']))) {
54       $LSrelations=array();
55       $LSrelations_JSparams=array();
56       foreach($object -> config['LSrelation'] as $relationName => $relationConf) {
57         if (LSsession :: relationCanAccess($object -> getValue('dn'),$object->getType(),$relationName)) {
58           $return=array(
59             'label' => __($relationConf['label']),
60             'LSobject' => $relationConf['LSobject']
61           );
62           
63           if (isset($relationConf['emptyText'])) {
64             $return['emptyText'] = __($relationConf['emptyText']);
65           }
66           else {
67             $return['emptyText'] = _('No object.');
68           }
69           
70           $id=rand();
71           $return['id']=$id;
72           $LSrelations_JSparams[$id]=array(
73             'emptyText' => $return['emptyText']
74           );
75           $_SESSION['LSrelation'][$id] = array(
76             'relationName' => $relationName,
77             'objectType' => $object -> getType(),
78             'objectDn' => $object -> getDn(),
79           );
80           if (LSsession :: relationCanEdit($object -> getValue('dn'),$object->getType(),$relationName)) {
81             $return['actions'][] = array(
82               'label' => _('Modify'),
83               'url' => 'select.php?LSobject='.$relationConf['LSobject'].'&amp;multiple=1'.((isset($relationConf['canEdit_attribute']))?'&amp;editableAttr='.$relationConf['canEdit_attribute']:''),
84               'action' => 'modify'
85             );
86           }
87           
88           if (LSsession :: loadLSclass('LSrelation')) {
89             LSrelation :: loadDependenciesDisplay();
90           }
91           
92           if(LSsession :: loadLSobject($relationConf['LSobject'])) {
93             if (method_exists($relationConf['LSobject'],$relationConf['list_function'])) {
94               $objRel = new $relationConf['LSobject']();
95               $list = call_user_func(array($objRel, $relationConf['list_function']), $object);
96               if (is_array($list)) {
97                 foreach($list as $o) {
98                   $o_infos = array(
99                     'text' => $o -> getDisplayName(NULL,true),
100                     'dn' => $o -> getDn()
101                   );
102                   if (isset($relationConf['canEdit_function'])) {
103                     $o_infos['canEdit']= call_user_func(array($o, $relationConf['canEdit_function']));
104                   }
105                   else {
106                     $o_infos['canEdit']=true;
107                   }
108                   $return['objectList'][] = $o_infos;
109                 }
110               }
111               else {
112                 $return['objectList']=array();
113               }
114             }
115             else {
116               LSerror :: addErrorCode('LSrelations_01',$relationName);
117             }
118             $LSrelations[]=$return;
119           }
120           else {
121               LSerror :: addErrorCode('LSrelations_04',array('relation' => $relationName,'LSobject' => $relationConf['LSobject']));
122           }
123         }
124       }
125       
126       LStemplate :: assign('LSrelations',$LSrelations);
127       LSsession :: addJSconfigParam('LSrelations',$LSrelations_JSparams);
128     }
129   }
130   
131   public static function ajax_refreshSession(&$return) {
132     if ((isset($_REQUEST['id'])) && (isset($_REQUEST['href'])) ) {
133       if (isset($_SESSION['LSrelation'][$_REQUEST['id']])) {
134         $conf = $_SESSION['LSrelation'][$_REQUEST['id']];
135         if (LSsession ::loadLSobject($conf['objectType'])) {
136           $object = new $conf['objectType']();
137           if (($object -> loadData($conf['objectDn'])) && (isset($object->config['LSrelation'][$conf['relationName']]))) {
138             $relationConf = $object->config['LSrelation'][$conf['relationName']];
139             if (LSsession ::loadLSobject($relationConf['LSobject'])) {
140               if (LSsession :: relationCanEdit($object -> getValue('dn'),$object -> getType(),$conf['relationName'])) {
141                 if (method_exists($relationConf['LSobject'],$relationConf['list_function'])) {
142                   $objRel = new $relationConf['LSobject']();
143                   $list = call_user_func(array($objRel, $relationConf['list_function']), $object);
144                   $_SESSION['LSselect'][$relationConf['LSobject']]=array();
145                   if (is_array($list)) {
146                     foreach($list as $o) {
147                       $_SESSION['LSselect'][$relationConf['LSobject']][] = $o -> getDn();
148                     }
149                   }
150                   $return = array(
151                     'href' => $_REQUEST['href'],
152                     'id' => $_REQUEST['id']
153                   );
154                 }
155                 else {
156                   LSerror :: addErrorCode('LSrelations_01',$relationName);
157                 }
158               }
159               else {
160                 LSerror :: addErrorCode('LSsession_11');
161               }
162             }
163           }
164           else {
165             LSerror :: addErrorCode('LSsession_12');
166           }
167         }
168         else {
169           LSerror :: addErrorCode('LSsession_12');
170         }
171       }
172       else {
173         LSerror :: addErrorCode('LSsession_12');
174       }
175     }
176   }
177   
178   public static function ajax_refreshList(&$data) {
179     if (isset($_REQUEST['id'])) {
180       if (isset($_SESSION['LSrelation'][$_REQUEST['id']])) {
181         $conf = $_SESSION['LSrelation'][$_REQUEST['id']];
182         if (LSsession ::loadLSobject($conf['objectType'])) {
183           $object = new $conf['objectType']();
184           if (($object -> loadData($conf['objectDn'])) && (isset($object->config['LSrelation'][$conf['relationName']]))) {
185             $relationConf = $object->config['LSrelation'][$conf['relationName']];
186             if (LSsession ::loadLSobject($relationConf['LSobject'])) {
187               if (LSsession :: relationCanEdit($object -> getValue('dn'),$object -> getType(),$conf['relationName'])) {
188                 if (is_array($_SESSION['LSselect'][$relationConf['LSobject']])) {
189                   if (method_exists($relationConf['LSobject'],$relationConf['update_function'])) {
190                     $objRel = new $relationConf['LSobject']();
191                     if(call_user_func(array($objRel, $relationConf['update_function']), $object,$_SESSION['LSselect'][$relationConf['LSobject']])) {
192                       if (method_exists($relationConf['LSobject'],$relationConf['list_function'])) {
193                         $list = call_user_func(array($objRel, $relationConf['list_function']), $object);
194                         if (is_array($list)&&(!empty($list))) {
195                           $data['html']="";
196                           foreach($list as $o) {
197                             if (isset($relationConf['canEdit_function'])) {
198                               if (call_user_func(array($o, $relationConf['canEdit_function']))) {
199                                 $class=' LSrelation_editable';
200                               }
201                               else {
202                                 $class='';
203                               }
204                             }
205                             else {
206                               $class=' LSrelation_editable';
207                             }
208                             $data['html'].= "<li class='LSrelation'><a href='view.php?LSobject=".$relationConf['LSobject']."&amp;dn=".urlencode($o -> getDn())."' class='LSrelation$class' id='LSrelation_".$_REQUEST['id']."_".$o -> getDn()."'>".$o -> getDisplayName(NULL,true)."</a></li>\n";
209                           }
210                         }
211                         else {
212                           if (isset($relationConf['emptyText'])) {
213                             $data['html'] = "<li>".__($relationConf['emptyText'])."</li>\n";
214                           }
215                           else {
216                             $data['html'] = "<li>"._('No object.')."</li>\n";
217                           }
218                         }
219                         $data['id'] = $_REQUEST['id'];
220                       }
221                       else {
222                         LSerror :: addErrorCode('LSrelations_01',$relationName);
223                       }
224                     }
225                     else {
226                       LSerror :: addErrorCode('LSrelations_03',$relationName);
227                     }
228                   }
229                   else {
230                     LSerror :: addErrorCode('LSrelations_02',$relationName);
231                   }
232                 }
233               }
234               else {
235                 LSerror :: addErrorCode('LSsession_11');
236               }
237             }
238           }
239           else {
240             LSerror :: addErrorCode('LSsession_12');
241           }
242         }
243         else {
244           LSerror :: addErrorCode('LSsession_12');
245         }
246       }
247       else {
248         LSerror :: addErrorCode('LSsession_12');
249       }
250     }
251   }
252   
253   public static function ajax_deleteByDn(&$data) {
254     if ((isset($_REQUEST['id'])) && (isset($_REQUEST['dn']))) {
255       if (isset($_SESSION['LSrelation'][$_REQUEST['id']])) {
256         $conf = $_SESSION['LSrelation'][$_REQUEST['id']];
257         if (LSsession ::loadLSobject($conf['objectType'])) {
258           $object = new $conf['objectType']();
259           if (($object -> loadData($conf['objectDn'])) && (isset($object->config['LSrelation'][$conf['relationName']]))) {
260             $relationConf = $object->config['LSrelation'][$conf['relationName']];
261             if (LSsession ::loadLSobject($relationConf['LSobject'])) {
262               if (LSsession :: relationCanEdit($object -> getValue('dn'),$object -> getType(),$conf['relationName'])) {
263                 if (method_exists($relationConf['LSobject'],$relationConf['list_function'])) {
264                   $objRel = new $relationConf['LSobject']();
265                   $list = call_user_func(array($objRel, $relationConf['list_function']), $object);
266                   if (is_array($list)) {
267                     $ok=false;
268                     foreach($list as $o) {
269                       if($o -> getDn() == $_REQUEST['dn']) {
270                         if (isset($relationConf['canEdit_function'])) {
271                           if (!call_user_func(array($o, $relationConf['canEdit_function']))) {
272                             LSerror :: addErrorCode('LSsession_11');
273                             break;
274                           }
275                         }
276                         if (!call_user_func(array($o, $relationConf['remove_function']), $object)) {
277                           LSerror :: addErrorCode('LSrelations_03',$conf['relationName']);
278                         }
279                         else {
280                           $ok = true;
281                         }
282                         break;
283                       }
284                     }
285                     if (!$ok) {
286                       LSdebug($_REQUEST['value']." introuvé parmi la liste");
287                       LSerror :: addErrorCode('LSrelations_03',$conf['relationName']);
288                     }
289                     else {
290                       $data=array(
291                         'dn' => $_REQUEST['dn'],
292                         'id' => $_REQUEST['id']
293                       );
294                     }
295                   }
296                   else {
297                     LSerror :: addErrorCode('LSrelations_03',$conf['relationName']);
298                   }
299                 }
300                 else {
301                   LSerror :: addErrorCode('LSrelations_01',$conf['relationName']);
302                 }
303               }
304               else {
305                 LSerror :: addErrorCode('LSsession_11');
306               }
307             }
308           }
309           else {
310             LSerror :: addErrorCode('LSsession_12');
311           }
312         }
313         else {
314           LSerror :: addErrorCode('LSsession_12');
315         }
316       }
317       else {
318         LSerror :: addErrorCode('LSsession_12');
319       }
320     }
321   }
322 }
323
324 /**
325  * Error Codes
326  **/
327 LSerror :: defineError('LSrelations_01',
328 _("LSrelation : The listing function for the relation %{relation} is unknow.")
329 );
330 LSerror :: defineError('LSrelations_02',
331 _("LSrelation : The update function of the relation %{relation} is unknow.")
332 );
333 LSerror :: defineError('LSrelations_03',
334 _("LSrelation : Error during relation update of the relation %{relation}.")
335 );
336 LSerror :: defineError('LSrelations_04',
337 _("LSrelation : Object type %{LSobject} unknow (Relation : %{relation}).")
338 );
339
340 ?>