LSformElement :: select_list / select_box : permit to put possible values in labelled...
[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   private 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   private 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   private function getLSobjectPossibleValues($conf) {
158     $retInfos = array();
159
160     if ((!isset($conf['object_type'])) || (!isset($conf['value_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     );
174
175     if ($conf['value_attribute']!='dn') {
176       $param['attributes'][] = $conf['value_attribute'];
177     }
178
179     $LSsearch = new LSsearch($conf['object_type'],'LSattr_html_select_list',$param,true);
180     $LSsearch -> run();
181     if(($conf['value_attribute']=='dn')||($conf['value_attribute']=='%{dn}')) {
182       $retInfos = $LSsearch -> listObjectsName();
183     }
184     else {
185       $list = $LSsearch -> getSearchEntries();
186       foreach($list as $entry) {
187         $key = $entry -> get($conf['value_attribute']);
188         if(is_array($key)) {
189           $key = $key[0];
190         }
191         $retInfos[$key]=$entry -> displayName;
192       }
193     }
194
195     $this -> _sort($retInfos);
196
197     return $retInfos;
198   }
199
200   /**
201    * Function use with uasort to sort two values
202    *
203    * @param[in] $va string One value
204    * @param[in] $vb string One value
205    *
206    * @retval int Value for uasort
207    **/
208   private function _sortTwoValues(&$va,&$vb) {
209     if (isset($this -> config['html_options']['sortDirection']) && $this -> config['html_options']['sortDirection']=='DESC') {
210       $dir=-1;
211     }
212     else {
213       $dir=1;
214     }
215
216     if (is_array($va)) {
217       $nva=$va['label'];
218     }
219     else {
220       $nva=$va;
221     }
222
223     if (is_array($vb)) {
224       $nvb=$vb['label'];
225     }
226     else {
227       $nvb=$vb;
228     }
229
230     if ($nva == $nvb) return 0;
231
232     $val = strcoll(strtolower($nva), strtolower($nvb));
233
234     return $val*$dir;
235   }
236
237 }
238
239 /*
240  * Error Codes
241  */
242 LSerror :: defineError('LSattr_html_select_list_01',
243 _("LSattr_html_select_list : Configuration data are missing to generate the select list of the attribute %{attr}.")
244 );