LSattr_html :: select_list / select_object : add parameter to handle onlyAccessible...
[ldapsaisie.git] / public_html / includes / class / class.LSattr_html_select_list.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 /**
24  * Type d'attribut HTML select_list
25  *
26  * 'html_options' => array (
27  *    'possible_values' => array (
28  *      '[LSformat de la valeur clé]' => '[LSformat du nom d'affichage]',
29  *      ...
30  *      'OTHER_OBJECT' => array (
31  *        'object_type' => '[Type d'LSobject]',
32  *        'display_name_format' => '[LSformat du nom d'affichage des LSobjects]',
33  *        'value_attribute' => '[Nom de l'attribut clé]',
34  *        'filter' => '[Filtre de recherche des LSobject]',
35  *        'scope' => '[Scope de la recherche]',
36  *        'basedn' => '[Basedn de la recherche]'
37  *      )
38  *    )
39  * ),
40  * 
41  * @author Benjamin Renard <brenard@easter-eggs.com>
42  */
43 class LSattr_html_select_list extends LSattr_html{
44
45   var $LSformElement_type = 'select';
46
47   /**
48    * Ajoute l'attribut au formualaire passer en paramètre
49    *
50    * @param[in] &$form LSform Le formulaire
51    * @param[in] $idForm L'identifiant du formulaire
52    * @param[in] $data Valeur du champs du formulaire
53    *
54    * @retval LSformElement L'element du formulaire ajouté
55    */
56   function addToForm (&$form,$idForm,$data=NULL) {
57     $possible_values=$this -> getPossibleValues();
58     $this -> config['text_possible_values'] = $possible_values;
59     $element=parent::addToForm($form,$idForm,$data);
60
61     if ($element) {
62       // Mise en place de la regle de verification des donnees
63       $form -> addRule($this -> name, 'LSformElement_select_validValue', array('msg'=> _('Invalid value'),'params' => array('possible_values' => $possible_values)) );
64     }
65     return $element;
66   }
67
68   /**
69    * Retourne un tableau des valeurs possibles de la liste
70    *
71    * @author Benjamin Renard <brenard@easter-eggs.com>
72    *
73    * @retval array Tableau associatif des valeurs possible de la liste avec en clé
74    *               la valeur des balises option et en valeur ce qui sera affiché.
75    */ 
76   function getPossibleValues() {
77     $retInfos = array();
78     if (is_array($this -> config['html_options']['possible_values'])) {
79       foreach($this -> config['html_options']['possible_values'] as $val_key => $val_label) {
80         if($val_key==='OTHER_OBJECT') {
81           $objInfos=$this -> getLSobjectPossibleValues($val_label);
82           $retInfos=self :: _array_merge($retInfos,$objInfos);
83         }
84         elseif (is_array($val_label)) {
85                 if (!isset($val_label['possible_values']) || !is_array($val_label['possible_values']) || !isset($val_label['label']))
86                         continue;
87                 $subRetInfos=array();
88                 foreach($val_label['possible_values'] as $vk => $vl) {
89                         if ($vk==='OTHER_OBJECT') {
90                                 $objInfos=$this -> getLSobjectPossibleValues($vl);
91                                 $subRetInfos=self :: _array_merge($subRetInfos,$objInfos);
92                         }
93                         else {
94                                 $vk=$this->attribute->ldapObject->getFData($vk);
95                                 $vl=$this->attribute->ldapObject->getFData(__($vl));
96                                 $subRetInfos[$vk]=$vl;
97                         }
98                 }
99                 $this -> _sort($subRetInfos);
100                 $retInfos[] = array (
101                         'label' => $this->attribute->ldapObject->getFData(__($val_label['label'])),
102                         'possible_values' => $subRetInfos
103                 );
104         }
105         else {
106           $val_key=$this->attribute->ldapObject->getFData($val_key);
107           $val_label=$this->attribute->ldapObject->getFData(__($val_label));
108           $retInfos[$val_key]=$val_label;
109         }
110       }
111     }
112
113     $this -> _sort($retInfos);
114
115     return $retInfos;
116   }
117
118   /**
119    * Merge arrays preserving keys (string or numeric)
120    *
121    * As array_merge PHP function, this function merge arrays but
122    * this method permit to preverve key even if it's numeric key.
123    *
124    * @retval array Merged array
125    **/
126   protected function _array_merge() {
127     $ret=array();
128     foreach(func_get_args() as $a) {
129       foreach($a as $k => $v) {
130         $ret[$k]=$v;
131       }
132     }
133     return $ret;
134   }
135
136   /**
137    * Apply sort feature on possible values if this feature is enabled
138    *
139    * @param[in] &$retInfos array Possible values array reference to sort
140    *
141    * @retval void
142    **/
143   protected function _sort(&$retInfos) {
144     if (!isset($this -> config['html_options']['sort']) || $this -> config['html_options']['sort']) {
145       uasort($retInfos,array($this,'_sortTwoValues'));
146     }
147   }
148
149   /**
150    * Retourne un tableau des valeurs possibles d'un type d'objet
151    *
152    * @author Benjamin Renard <brenard@easter-eggs.com>
153    *
154    * @retval array Tableau associatif des valeurs possible de la liste avec en clé
155    *               la valeur des balises option et en valeur ce qui sera affiché.
156    */
157   protected function getLSobjectPossibleValues($conf) {
158     $retInfos = array();
159
160     if ((!isset($conf['object_type'])) || ((!isset($conf['value_attribute'])) && (!isset($conf['values_attribute'])))) {
161       LSerror :: addErrorCode('LSattr_html_select_list_01',$this -> name);
162       break;
163     }
164     if (!LSsession :: loadLSclass('LSsearch')) {
165       return;
166     }
167
168     $param=array(
169       'filter' => (isset($conf['filter'])?$conf['filter']:null),
170       'basedn' => (isset($conf['basedn'])?$conf['basedn']:null),
171       'scope'  => (isset($conf['scope'])?$conf['scope']:null),
172       'displayFormat' => (isset($conf['display_name_format'])?$conf['display_name_format']:null),
173       'onlyAccessible' => (isset($conf['onlyAccessible'])?$conf['onlyAccessible']:False),
174     );
175
176     if (isset($conf['value_attribute']) && $conf['value_attribute']!='dn') {
177       $param['attributes'][] = $conf['value_attribute'];
178     }
179     if (isset($conf['values_attribute'])) {
180       $param['attributes'][] = $conf['values_attribute'];
181     }
182
183     $LSsearch = new LSsearch($conf['object_type'],'LSattr_html_select_list',$param,true);
184     $LSsearch -> run();
185     if (isset($conf['value_attribute'])) {
186       if(($conf['value_attribute']=='dn')||($conf['value_attribute']=='%{dn}')) {
187         $retInfos = $LSsearch -> listObjectsName();
188       }
189       else {
190         $list = $LSsearch -> getSearchEntries();
191         foreach($list as $entry) {
192           $key = $entry -> get($conf['value_attribute']);
193           if(is_array($key)) {
194             $key = $key[0];
195           }
196           $retInfos[$key]=$entry -> displayName;
197         }
198       }
199     }
200     if (isset($conf['values_attribute'])) {
201       $list = $LSsearch -> getSearchEntries();
202       foreach($list as $entry) {
203         $keys = $entry -> get($conf['values_attribute']);
204         if (!is_array($keys)) $keys=array($keys);
205         foreach ($keys as $key) {
206           $retInfos[$key]=$key;
207         }
208       }
209     }
210
211     $this -> _sort($retInfos);
212
213     return $retInfos;
214   }
215
216   /**
217    * Function use with uasort to sort two values
218    *
219    * @param[in] $va string One value
220    * @param[in] $vb string One value
221    *
222    * @retval int Value for uasort
223    **/
224   protected function _sortTwoValues(&$va,&$vb) {
225     if (isset($this -> config['html_options']['sortDirection']) && $this -> config['html_options']['sortDirection']=='DESC') {
226       $dir=-1;
227     }
228     else {
229       $dir=1;
230     }
231
232     if (is_array($va)) {
233       $nva=$va['label'];
234     }
235     else {
236       $nva=$va;
237     }
238
239     if (is_array($vb)) {
240       $nvb=$vb['label'];
241     }
242     else {
243       $nvb=$vb;
244     }
245
246     if ($nva == $nvb) return 0;
247
248     $val = strcoll(strtolower($nva), strtolower($nvb));
249
250     return $val*$dir;
251   }
252
253 }
254
255 /*
256  * Error Codes
257  */
258 LSerror :: defineError('LSattr_html_select_list_01',
259 _("LSattr_html_select_list : Configuration data are missing to generate the select list of the attribute %{attr}.")
260 );