- Ajout d'un fichier core.php s'occupant des inclusions minimum pour le lancement...
[ldapsaisie.git] / trunk / select.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 require_once 'core.php';
24
25 if(LSsession :: startLSsession()) {
26   if (isset($_REQUEST['LSobject'])) {
27     $LSobject = $_REQUEST['LSobject'];
28     
29     if ( LSsession ::loadLSobject($LSobject) ) {
30       $objectList=array();
31       $object = new $LSobject();
32       
33       $GLOBALS['Smarty']->assign('pagetitle',$object -> getLabel());
34       $GLOBALS['Smarty']->assign('LSobject_list_objectname',$object -> getLabel());
35       
36       if (isset($_SESSION['LSsession']['LSsearch'][$LSobject])) {
37         $filter = $_SESSION['LSsession']['LSsearch'][$LSobject]['filter'];
38         if (isCompatibleDNs($_SESSION['LSsession']['LSsearch'][$LSobject]['topDn'],LSsession :: getTopDn())) {
39           $topDn = $_SESSION['LSsession']['LSsearch'][$LSobject]['topDn'];
40           if (isset($_SESSION['LSsession']['LSsearch'][$LSobject]['selectedTopDn'])) {
41             $selectedTopDn = $_SESSION['LSsession']['LSsearch'][$LSobject]['selectedTopDn'];
42           }
43           else {
44             $selectedTopDn = LSsession :: getTopDn();
45           }
46         }
47         else {
48           $selectedTopDn  = LSsession :: getTopDn();
49           $topDn = $object -> config['container_dn'].','.LSsession :: getTopDn();
50         }
51         $params = $_SESSION['LSsession']['LSsearch'][$LSobject]['params'];
52         $pattern = $_SESSION['LSsession']['LSsearch'][$LSobject]['pattern'];
53         $recur = $_SESSION['LSsession']['LSsearch'][$LSobject]['recur'];
54         $approx = $_SESSION['LSsession']['LSsearch'][$LSobject]['approx'];
55         $orderby = $_SESSION['LSsession']['LSsearch'][$LSobject]['orderby'];
56         $ordersense = $_SESSION['LSsession']['LSsearch'][$LSobject]['ordersense'];
57         $doSubDn = $_SESSION['LSsession']['LSsearch'][$LSobject]['doSubDn'];
58       }
59       else {
60         $filter = NULL;
61         $topDn = $object -> config['container_dn'].','.LSsession :: getTopDn();
62         $params = array('scope' => 'one');
63         $pattern = false;
64         $recur = false;
65         $approx = false;
66         $selectedTopDn = LSsession :: getTopDn();
67         $orderby = false;
68         $_REQUEST['orderby']=$GLOBALS['LSobjects'][$LSobject]['orderby'];
69         $ordersense = 'ASC';
70         $subDnLdapServer = LSsession :: getSubDnLdapServer();
71         $doSubDn = (($subDnLdapServer)&&(!LSsession :: isSubDnLSobject($LSobject)));
72       }
73       
74       if (isset($_REQUEST['LSview_search_submit'])) {
75         if ( $_REQUEST['LSview_pattern']!=$pattern ) {
76           $pattern = $_REQUEST['LSview_pattern'];
77         }
78
79         $approx = (isset($_REQUEST['LSview_approx']));
80         
81         if ($pattern && $pattern!='') {
82           $filter=$object -> getPatternFilter($pattern,$approx);
83         }
84         else {
85           $filter = NULL;
86         }
87         
88         if (isset($_REQUEST['LSview_recur'])) {
89           $recur = true;
90           $params['scope'] = 'sub';
91           if (LSsession :: validSubDnLdapServer($_REQUEST['LSselect_topDn'])) {
92             $topDn = $_REQUEST['LSselect_topDn'];
93             $selectedTopDn = $topDn;
94           }
95           else {
96             $topDn = LSsession :: getTopDn();
97             $selectedTopDn = $topDn;
98           }
99         }
100         else {
101           $recur = false;
102           $params['scope'] = 'one';
103           if (LSsession :: validSubDnLdapServer($_REQUEST['LSselect_topDn'])) {
104             $topDn = $object -> config['container_dn'].','.$_REQUEST['LSselect_topDn'];
105             $selectedTopDn = $_REQUEST['LSselect_topDn'];
106           }
107           else {
108             $topDn = $object -> config['container_dn'].','.LSsession :: getTopDn();
109             $selectedTopDn = LSsession :: getTopDn();
110           }
111         }
112       }
113       
114       $sort=false;
115       if ((isset($_REQUEST['orderby']))) {
116         $possible_values= array('displayName','subDn');
117         if (in_array($_REQUEST['orderby'],$possible_values)) {
118           $sort=true;
119           if ($orderby==$_REQUEST['orderby']) {
120             $ordersense = ($ordersense=='ASC')?'DESC':'ASC';
121           }
122           else {
123             $ordersense = 'ASC';
124           }
125           $orderby=$_REQUEST['orderby'];
126         }
127       }
128       
129       $GLOBALS['Smarty']->assign('LSobject_list_subDn',$doSubDn);
130       
131       // Sauvegarde en Session
132       $_SESSION['LSsession']['LSsearch'][$LSobject] = array(
133         'filter' => $filter,
134         'topDn' => $topDn,
135         'params' => $params,
136         'pattern' => $pattern,
137         'recur' => $recur,
138         'approx' => $approx,
139         'selectedTopDn' => $selectedTopDn,
140         'orderby' => $orderby,
141         'ordersense' => $ordersense,
142         'doSubDn' => $doSubDn
143       );
144
145       $GLOBALS['Smarty']->assign('LSview_search_pattern',$pattern);
146
147       if ($recur) {
148         $GLOBALS['Smarty']->assign('LSview_search_recur',true);
149       }
150       if ($approx) {
151         $GLOBALS['Smarty']->assign('LSview_search_approx',true);
152       }
153       $GLOBALS['Smarty']->assign('LSselect_topDn',$selectedTopDn);
154       
155       $multiple = (isset($_REQUEST['multiple']))?1:0;
156       
157       // Hidden fields
158       $GLOBALS['Smarty']->assign('LSview_search_hidden_fields',array(
159         'LSobject' => $LSobject,
160         'LSview_search_submit' => 1,
161         'ajax' => 1,
162         'multiple' => $multiple
163       ));
164       
165       // Hash de la recherche déterminer à partir des paramètres de la recherche
166       $hash = mhash (MHASH_MD5, 
167         print_r(
168           array(
169             'LSobject' => $LSobject,
170             'filter' => $filter,
171             'topDn' => $topDn,
172             'params' => $params
173           ),
174           true
175         )
176       );
177       
178       if ((LSsession :: cacheSearch()) && isset($_SESSION['LSsession']['LSsearch'][$hash]) && (!isset($_REQUEST['refresh']))) {
179         // On affiche à partir du cache
180         $searchData=$_SESSION['LSsession']['LSsearch'][$hash];
181         LSdebug('From cache');
182       }
183       else {
184         LSdebug('Load');
185         $LSview_actions[] = array (
186           'label' => _('Refresh'),
187           'url' => 'view.php?LSobject='.$LSobject.'&amp;refresh',
188           'action' => 'refresh'
189         );
190         
191         $list=$object -> listObjectsName($filter,$topDn,$params);
192         $nbObjects=count($list);
193         $searchData['LSobject_list_nbresult']=$nbObjects;
194
195         $c=0;
196         
197         foreach($list as $objDn => $objName) {
198           if (LSsession :: canAccess($LSobject,$objDn)) {
199
200             $c++;
201             unset($actions);
202             
203             $subDn_name=false;
204             if ($doSubDn) {
205               $subDn_name = $object -> getSubDnName($objDn);
206             }
207             
208             $objectList[]=array(
209               'dn' => $objDn,
210               'displayName' => $objName,
211               'subDn' => $subDn_name
212             );
213           }
214           else {
215             LSdebug($dn);
216           }
217         }
218         $searchData['objectList']=$objectList;
219         $searchData['LSview_actions'] = $LSview_actions;
220         if (LSsession :: cacheSearch()) {
221           $_SESSION['LSsession']['LSsearch'][$hash]=$searchData;
222         }
223         if ($orderby) {
224           $sort=true;
225         }
226       }
227       $GLOBALS['Smarty']->assign('LSobject_list_nbresult',$searchData['LSobject_list_nbresult']);
228       
229       // Order by if $sort
230       if ($sort) {
231         function sortBy($a,$b) {
232           global $ordersense;
233           global $orderby;
234           
235           if ($ordersense=='ASC') {
236             $sense = -1;
237           }
238           else {
239             $sense = 1;
240           }
241           
242           if ($a == $b) return 0;
243           $sort = array($a[$orderby],$b[$orderby]);
244           sort($sort);
245           if ($sort[0]==$a[$orderby])
246             return 1*$sense;
247           return -1*$sense;
248         }
249         if (!uasort($searchData['objectList'],'sortBy')) {
250           LSdebug('Erreur durant le trie.');
251         }
252         $_SESSION['LSsession']['LSsearch'][$hash]=$searchData;
253       }
254       $GLOBALS['Smarty']->assign('LSobject_list_orderby',$orderby);
255       $GLOBALS['Smarty']->assign('LSobject_list_ordersense',$ordersense);
256       
257       // Pagination
258       if ($searchData['LSobject_list_nbresult'] > NB_LSOBJECT_LIST_SELECT) {
259         if (isset($_REQUEST['page'])) {
260           $searchData['objectList'] = array_slice($searchData['objectList'], ($_REQUEST['page']) * NB_LSOBJECT_LIST_SELECT, NB_LSOBJECT_LIST_SELECT);
261           $GLOBALS['Smarty']->assign('LSobject_list_currentpage',$_REQUEST['page']);
262           
263         }
264         else {
265           $searchData['objectList'] = array_slice($searchData['objectList'], 0, NB_LSOBJECT_LIST_SELECT);
266           $GLOBALS['Smarty']->assign('LSobject_list_currentpage',0);
267         }
268         $searchData['LSobject_list_nbpage']=ceil($searchData['LSobject_list_nbresult'] / NB_LSOBJECT_LIST_SELECT);
269         $GLOBALS['Smarty']->assign('LSobject_list_nbpage',$searchData['LSobject_list_nbpage']);
270       }
271       
272       // Select/Pas Select
273       for($i=0;$i<count($searchData['objectList']);$i++) {
274         if (is_array($_SESSION['LSselect'][$LSobject])) {
275           if(in_array($searchData['objectList'][$i]['dn'],$_SESSION['LSselect'][$LSobject])) {
276             $select = true;
277           }
278           else {
279             $select = false;
280           }
281         }
282         else {
283           $select = false;
284         }
285         $searchData['objectList'][$i]['select']=$select;
286       }        
287       
288       $GLOBALS['Smarty']->assign('LSview_search',array(
289         'action' => $_SERVER['PHP_SELF'],
290         'submit' => _('Search'),
291         'LSobject' => $LSobject
292       ));
293       
294       $GLOBALS['Smarty']->assign('LSview_search_recur_label',_('Recursive search'));
295       $GLOBALS['Smarty']->assign('LSview_search_approx_label',_('Approximative search'));
296
297       $GLOBALS['Smarty']->assign('LSobject_list_without_result_label',_("This search didn't get any result."));
298       $GLOBALS['Smarty']->assign('LSobject_list',$searchData['objectList']);
299       $GLOBALS['Smarty']->assign('LSobject_list_objecttype',$LSobject);
300       $GLOBALS['Smarty'] -> assign('LSview_actions',$searchData['LSview_actions']);
301       $GLOBALS['Smarty'] -> assign('LSselect_multiple',$multiple);
302       if (isset($_REQUEST['ajax'])) {
303         LSsession :: setTemplate('select_table.tpl');
304       }
305       else {
306         LSsession :: setTemplate('select.tpl');
307       }
308       LSsession :: setAjaxDisplay();
309     }
310   }
311   else {
312     LSerror :: addErrorCode('LSsession_12');
313   }
314 }
315 else {
316   LSsession :: setTemplate('login.tpl');
317 }
318
319 // Affichage des retours d'erreurs
320 LSsession :: displayTemplate();
321 ?>