LSldapObject : fix foreach error in getObjectKeyValueInRelation() if attribute is...
[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    * @param[in] $options Attribute options (optinal)
72    * @param[in] $name Attribute name (optional)
73    * @param[in] &$ldapObject Related LSldapObject (optinal)
74    *
75    * @author Benjamin Renard <brenard@easter-eggs.com>
76    *
77    * @retval array Tableau associatif des valeurs possible de la liste avec en clé
78    *               la valeur des balises option et en valeur ce qui sera affiché.
79    */ 
80   function getPossibleValues($options=false,$name=false,&$ldapObject=false) {
81     if (!$options) $options=$this -> config['html_options'];
82     if (!$name) $name=$this -> name;
83     if (!$ldapObject) $ldapObject=$this->attribute->ldapObject;
84     $retInfos = array();
85     if (is_array($options['possible_values'])) {
86       foreach($options['possible_values'] as $val_key => $val_label) {
87         if($val_key==='OTHER_OBJECT') {
88           $objInfos=self :: getLSobjectPossibleValues($val_label,$options,$name);
89           $retInfos=self :: _array_merge($retInfos,$objInfos);
90         }
91         elseif (is_array($val_label)) {
92                 if (!isset($val_label['possible_values']) || !is_array($val_label['possible_values']) || !isset($val_label['label']))
93                         continue;
94                 $subRetInfos=array();
95                 foreach($val_label['possible_values'] as $vk => $vl) {
96                         if ($vk==='OTHER_OBJECT') {
97                                 $objInfos=self :: getLSobjectPossibleValues($vl,$options,$name);
98                                 $subRetInfos=self :: _array_merge($subRetInfos,$objInfos);
99                         }
100                         else {
101                                 $vk=$ldapObject->getFData($vk);
102                                 $vl=$ldapObject->getFData(__($vl));
103                                 $subRetInfos[$vk]=$vl;
104                         }
105                 }
106                 self :: _sort($subRetInfos,$options);
107                 $retInfos[] = array (
108                         'label' => $ldapObject->getFData(__($val_label['label'])),
109                         'possible_values' => $subRetInfos
110                 );
111         }
112         else {
113           $val_key=$ldapObject->getFData($val_key);
114           $val_label=$ldapObject->getFData(__($val_label));
115           $retInfos[$val_key]=$val_label;
116         }
117       }
118     }
119
120     self :: _sort($retInfos,$options);
121
122     return $retInfos;
123   }
124
125   /**
126    * Merge arrays preserving keys (string or numeric)
127    *
128    * As array_merge PHP function, this function merge arrays but
129    * this method permit to preverve key even if it's numeric key.
130    *
131    * @retval array Merged array
132    **/
133   protected function _array_merge() {
134     $ret=array();
135     foreach(func_get_args() as $a) {
136       foreach($a as $k => $v) {
137         $ret[$k]=$v;
138       }
139     }
140     return $ret;
141   }
142
143   /**
144    * Apply sort feature on possible values if this feature is enabled
145    *
146    * @param[in] &$retInfos array Possible values array reference to sort
147    * @param[in] $options array|false Attribute options (optional)
148    *
149    * @retval void
150    **/
151   protected function _sort(&$retInfos,$options=false) {
152     if (!$options) $options=$this -> config['html_options'];
153     if (!isset($options['sort']) || $options['sort']) {
154       if (isset($options['sortDirection']) && $options['sortDirection']=='DESC') {
155         uasort($retInfos,array('LSattr_html_select_list','_sortTwoValuesDesc'));
156       }
157       else {
158         uasort($retInfos,array('LSattr_html_select_list','_sortTwoValuesAsc'));
159       }
160     }
161   }
162
163   /**
164    * Function use with uasort to sort two values in ASC order
165    *
166    * @param[in] $va string One value
167    * @param[in] $vb string One value
168    *
169    * @retval int Value for uasort
170    **/
171   protected function _sortTwoValuesAsc(&$va,&$vb) {
172     if (is_array($va)) {
173       $nva=$va['label'];
174     }
175     else {
176       $nva=$va;
177     }
178
179     if (is_array($vb)) {
180       $nvb=$vb['label'];
181     }
182     else {
183       $nvb=$vb;
184     }
185
186     if ($nva == $nvb) return 0;
187
188     return strcoll(strtolower($nva), strtolower($nvb));
189   }
190
191   /**
192    * Function use with uasort to sort two values in DESC order
193    *
194    * @param[in] $va string One value
195    * @param[in] $vb string One value
196    *
197    * @retval int Value for uasort
198    **/
199   function _sortTwoValuesDesc(&$va,&$vb) {
200     return (-1 * self :: _sortTwoValuesAsc($va,$vb));
201   }
202
203
204   /**
205    * Retourne un tableau des valeurs possibles d'un type d'objet
206    *
207    * @param[in] $conf OTHER_OBJECT configuration array
208    * @param[in] $options array|false Attribute options (optional)
209    * @param[in] $name Attribute name (optional)
210    *
211    * @author Benjamin Renard <brenard@easter-eggs.com>
212    *
213    * @retval array Tableau associatif des valeurs possible de la liste avec en clé
214    *               la valeur des balises option et en valeur ce qui sera affiché.
215    */
216   protected function getLSobjectPossibleValues($conf,$options=false,$name=false) {
217     if (!$options) $options=$this -> config['html_options'];
218     if (!$name) $name=$this -> name;
219     $retInfos = array();
220
221     if ((!isset($conf['object_type'])) || ((!isset($conf['value_attribute'])) && (!isset($conf['values_attribute'])))) {
222       LSerror :: addErrorCode('LSattr_html_select_list_01',$name);
223       return;
224     }
225     if (!LSsession :: loadLSclass('LSsearch')) {
226       return;
227     }
228
229     $param=array(
230       'filter' => (isset($conf['filter'])?$conf['filter']:null),
231       'basedn' => (isset($conf['basedn'])?$conf['basedn']:null),
232       'scope'  => (isset($conf['scope'])?$conf['scope']:null),
233       'displayFormat' => (isset($conf['display_name_format'])?$conf['display_name_format']:null),
234       'onlyAccessible' => (isset($conf['onlyAccessible'])?$conf['onlyAccessible']:False),
235     );
236
237     if (isset($conf['value_attribute']) && $conf['value_attribute']!='dn') {
238       $param['attributes'][] = $conf['value_attribute'];
239     }
240     if (isset($conf['values_attribute'])) {
241       $param['attributes'][] = $conf['values_attribute'];
242     }
243
244     $LSsearch = new LSsearch($conf['object_type'],'LSattr_html_select_list',$param,true);
245     $LSsearch -> run();
246     if (isset($conf['value_attribute'])) {
247       if(($conf['value_attribute']=='dn')||($conf['value_attribute']=='%{dn}')) {
248         $retInfos = $LSsearch -> listObjectsName();
249       }
250       else {
251         $list = $LSsearch -> getSearchEntries();
252         foreach($list as $entry) {
253           $key = $entry -> get($conf['value_attribute']);
254           if(is_array($key)) {
255             $key = $key[0];
256           }
257           $retInfos[$key]=$entry -> displayName;
258         }
259       }
260     }
261     if (isset($conf['values_attribute'])) {
262       $list = $LSsearch -> getSearchEntries();
263       foreach($list as $entry) {
264         $keys = $entry -> get($conf['values_attribute']);
265         if (!is_array($keys)) $keys=array($keys);
266         foreach ($keys as $key) {
267           $retInfos[$key]=$key;
268         }
269       }
270     }
271
272     self :: _sort($retInfos,$options);
273
274     return $retInfos;
275   }
276 }
277
278 /*
279  * Error Codes
280  */
281 LSerror :: defineError('LSattr_html_select_list_01',
282 _("LSattr_html_select_list : Configuration data are missing to generate the select list of the attribute %{attr}.")
283 );