LSattr_html :: select_list : Add sort feature (with sort and sortDirection parameters)
[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, 'inarray', array('msg'=> 'Valeur incorrect','params' => array('possible_values' => array_keys($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_name => $val) {
80         if($val_name==='OTHER_OBJECT') {
81           if ((!isset($val['object_type'])) || (!isset($val['value_attribute']))) {
82             LSerror :: addErrorCode('LSattr_html_select_list_01',$this -> name);
83             break;
84           }
85           if (!LSsession :: loadLSclass('LSsearch')) {
86             return;
87           }
88           
89           $param=array(
90             'filter' => (isset($val['filter'])?$val['filter']:null),
91             'basedn' => (isset($val['basedn'])?$val['basedn']:null),
92             'scope'  => (isset($val['scope'])?$val['scope']:null),
93             'displayFormat' => (isset($val['display_name_format'])?$val['display_name_format']:null),
94           );
95           
96           
97           
98           if ($val['value_attribute']!='dn') {
99             $param['attributes'][] = $val['value_attribute'];
100           }
101           
102           $LSsearch = new LSsearch($val['object_type'],'LSattr_html_select_list',$param,true);
103           $LSsearch -> run();
104           if(($val['value_attribute']=='dn')||($val['value_attribute']=='%{dn}')) {
105             $retInfos = $LSsearch -> listObjectsName();
106           }
107           else {
108             $list = $LSsearch -> getSearchEntries();
109             foreach($list as $entry) {
110               $key = $entry -> get($val['value_attribute']);
111               if(is_array($key)) {
112                 $key = $key[0];
113               }
114               $retInfos[$key]=$entry -> displayName;
115             }
116           }
117         }
118         else {
119           $val_name=$this->attribute->ldapObject->getFData($val_name);
120           $val=$this->attribute->ldapObject->getFData(__($val));
121           $retInfos[$val_name]=$val;
122         }
123       }
124     }
125
126     if (!isset($this -> config['html_options']['sort']) || $this -> config['html_options']['sort']) {
127       uasort($retInfos,array($this,'_sortTwoValues'));
128     }
129
130     return $retInfos;
131   }
132
133    /**
134    * Function use with uasort to sort two values
135    *
136    * @param[in] $va string One value
137    * @param[in] $vb string One value
138    *
139    * @retval int Value for uasort
140    **/
141   private function _sortTwoValues(&$va,&$vb) {
142     if (isset($this -> config['html_options']['sortDirection']) && $this -> config['html_options']['sortDirection']=='DESC') {
143       $dir=-1;
144     }
145     else {
146       $dir=1;
147     }
148     if ($va == $vb) return 0;
149     $val = strcoll(strtolower($va), strtolower($vb));
150     return $val*$dir;
151   }
152
153 }
154
155 /*
156  * Error Codes
157  */
158 LSerror :: defineError('LSattr_html_select_list_01',
159 _("LSattr_html_select_list : Configuration data are missing to generate the select list of the attribute %{attr}.")
160 );
161 ?>