efd880d9e28da97c70408011f0290d31f7e836fa
[ldapsaisie.git] / public_html / includes / class / class.LSformElement_select_object.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 LSsession :: loadLSclass('LSformElement');
24
25 /**
26  * Select object element for LdapSaisie form
27  *
28  * This class define select elements for form. It extends the generic class LSformElement.
29  *
30  * HTML options : 
31  * // *************************************
32  * 'html_options' => array (
33  *   selectable_object => array (
34  *     'object_type' => '[Type of LSobject witch is selectable]',
35  *     'display_name_format' => '[LSformat of the display name of the LSobjects]',
36  *     'value_attribute' => '[The attribute name whitch is used as the key value of one LSobject]'
37  *   )
38  * ),
39  * // *************************************
40  * 
41  * @author Benjamin Renard <brenard@easter-eggs.com>
42  */
43
44 class LSformElement_select_object extends LSformElement {
45
46   var $fieldTemplate = 'LSformElement_select_object_field.tpl';
47   var $template = 'LSformElement_select_object.tpl';
48
49  /**
50   * Return display informations of the element
51   * 
52   * This method return the display informations of the element.
53   *
54   * @retval array
55   */
56   function getDisplay($refresh=NULL){
57     LSsession :: addCssFile('LSformElement_select_object.css');
58     if ($refresh) {
59       $this -> values = $this -> getValuesFromSession();
60     }
61     $return = $this -> getLabelInfos();
62
63     if (!$this -> isFreeze()) {
64       LSsession :: addJSconfigParam(
65         $this -> name,
66         array(
67           'object_type' => $this -> selectableObject,
68           'addBtn' => _('Modify'),
69           'deleteBtns' => _('Delete'),
70           'up_label' => _('Move up'),
71           'down_label' => _('Move down'),
72           'ordered' => (($this -> params['html_options']['ordered'])?1:0),
73           'multiple' => (($this -> params['multiple'])?1:0),
74           'filter64' => (($this -> params['html_options']['selectable_object']['filter'])?base64_encode($this -> params['html_options']['selectable_object']['filter']):''),
75           'noValueLabel' => _('No set value'),
76           'noResultLabel' => _('No result')
77         )
78       );
79
80       LSsession :: addHelpInfos (
81         'LSformElement_select_object',
82         array(
83           'searchAdd' => _("Fast Add"),
84           'add' => _("Display advanced search and selection panel."),
85           'delete' => _("Delete")
86         )
87       );
88       
89       LSsession :: addJSscript('LSformElement_select_object_field.js');
90       LSsession :: addJSscript('LSformElement_select_object.js');
91       if (LSsession :: loadLSclass('LSselect')) {
92         LSselect :: loadDependenciesDisplay();
93       }
94     }
95
96     if ((!isset($this -> params['html_options']['sort']) || $this -> params['html_options']['sort']) && !$this -> params['html_options']['ordered']) {
97       uasort($this -> values,array($this,'_sortTwoValues'));
98     }
99
100     $return['html'] = $this -> fetchTemplate(NULL,array(
101       'selectableObject' => $this -> selectableObject,
102       'unrecognizedValues' => $this -> attr_html -> unrecognizedValues,
103       'unrecognizedValueLabel' => _("%{value} (unrecognized value)")
104     ));
105     return $return;
106   }
107
108    /**
109    * Function use with uasort to sort two values
110    *
111    * @param[in] $va string One value
112    * @param[in] $vb string One value
113    *
114    * @retval int Value for uasort
115    **/
116   private function _sortTwoValues(&$va,&$vb) {
117     if (isset($this -> params['html_options']['sortDirection']) && $this -> params['html_options']['sortDirection']=='DESC') {
118       $dir=-1;
119     }
120     else {
121       $dir=1;
122     }
123     if ($va == $vb) return 0;
124     $val = strcoll(strtolower($va), strtolower($vb));
125     return $val*$dir;
126   }
127   
128   /*
129    * Return the values of the object form the session variable
130    */
131   function getValuesFromSession() {
132     return $this -> attr_html -> getValuesFromSession();
133   }
134   
135   /**
136    * Defined the type of object witch is selectionable
137    * 
138    * @param[in] $object string The type of object
139    * 
140    * @retval void
141    **/
142   function setSelectableObject($object) {
143     $this -> selectableObject = $object;
144   }
145   
146   /**
147    * Export the values of the element
148    * 
149    * @retval Array The values of the element
150    */
151   function exportValues(){
152     $values = $this -> attr_html -> getValuesFromFormValues($this -> values);
153     return $values;
154   }
155
156   /**
157    * Defined the value of the element from the data sent in POST with the form.
158    *
159    * @author Benjamin Renard <brenard@easter-eggs.com>
160    *
161    * @param[in] [<b>required</b>] string or array The new value of the element
162    *
163    * @retval boolean Return True
164    */
165   function setValueFromPostData($data) {
166     LSformElement::setValueFromPostData($data);
167     $this -> values = $this -> attr_html -> refreshForm($this -> values,true);
168     return true;
169   }
170
171   /**
172    * Search the selectionable objects with a pattern
173    * 
174    * @param[in] $pattern The pattern of the search
175    * 
176    * @retval array(dn -> displayName) Found objects
177    */
178   function searchAdd ($pattern) {
179     if (is_array($this -> params['html_options']['selectable_object'])) {
180       if (LSsession :: loadLSobject($this -> params['html_options']['selectable_object']['object_type'])) {
181         $obj = new $this -> params['html_options']['selectable_object']['object_type']();
182         $ret = $obj -> getSelectArray($pattern,NULL,$this -> params['html_options']['selectable_object']['display_name_format'],false,true,$this -> params['html_options']['selectable_object']['filter']);
183         if (is_array($ret)) {
184           return $ret;
185         }
186       }
187     }
188     return array();
189   }
190  
191   /**
192    * This ajax method is used to refresh the value display
193    * in the form element after the modify window is closed.
194    *
195    * @param[in] $data The address to the array of data witch will be return by the ajax request
196    * 
197    * @retval void
198    **/
199   public static function ajax_refresh(&$data) {
200     if ((isset($_REQUEST['attribute'])) && (isset($_REQUEST['objecttype'])) && (isset($_REQUEST['objectdn'])) && (isset($_REQUEST['idform'])) ) {
201       if (LSsession ::loadLSobject($_REQUEST['objecttype'])) {
202         $object = new $_REQUEST['objecttype']();
203         $form = $object -> getForm($_REQUEST['idform']);
204         $field=$form -> getElement($_REQUEST['attribute']);
205         $val = $field -> getValuesFromSession();
206         if ( $val ) {
207           $data = array(
208             'objects'    => $val
209           );
210         }
211       }
212     }
213   }
214
215   /**
216    * This ajax method is used by the search-and-add function of the form element.
217    *
218    * @param[in] $data The address to the array of data witch will be return by the ajax request
219    * 
220    * @retval void
221    **/
222   public static function ajax_searchAdd(&$data) {
223     if ((isset($_REQUEST['attribute'])) && (isset($_REQUEST['objecttype'])) && (isset($_REQUEST['pattern'])) && (isset($_REQUEST['idform'])) ) {
224       if (LSsession ::loadLSobject($_REQUEST['objecttype'])) {
225         $object = new $_REQUEST['objecttype']();
226         $form = $object -> getForm($_REQUEST['idform']);
227         $field=$form -> getElement($_REQUEST['attribute']);
228         $data['objects'] = $field -> searchAdd($_REQUEST['pattern']);
229       }
230     }
231   }
232 }
233
234 ?>