1 |
jonen |
1.1 |
<?php |
2 |
|
|
/** |
3 |
|
|
* This file contains the FEListBox, FEMultiListBox |
4 |
|
|
* |
5 |
jonen |
1.3 |
* $Id: FEListBox.inc,v 1.19 2004/03/28 19:46:20 culley Exp $ |
6 |
jonen |
1.1 |
* |
7 |
|
|
* @author Walter A. Boring IV <waboring@buildabetterweb.com> |
8 |
|
|
* @author Suren Markosyan <suren@bcsweb.com> |
9 |
|
|
* @package phpHtmlLib |
10 |
|
|
* @subpackage FormProcessing |
11 |
|
|
* |
12 |
|
|
* @copyright LGPL - See LICENCE |
13 |
|
|
* |
14 |
|
|
*/ |
15 |
|
|
|
16 |
|
|
/** |
17 |
|
|
* This is the ListBox FormElement which builds a |
18 |
|
|
* select field with all of its options. |
19 |
|
|
* It has no validation method. |
20 |
|
|
* |
21 |
|
|
* |
22 |
|
|
* @author Walter A. Boring IV <waboring@buildabetterweb.com> |
23 |
|
|
* @author Suren Markossian <suren@bcsweb.com> |
24 |
|
|
* @package phpHtmlLib |
25 |
|
|
* @subpackage FormProcessing |
26 |
|
|
* |
27 |
|
|
* @copyright LGPL - See LICENCE |
28 |
|
|
*/ |
29 |
|
|
class FEListBox extends FEDataList { |
30 |
|
|
|
31 |
|
|
/** |
32 |
|
|
* This function builds and returns the |
33 |
|
|
* form element object |
34 |
|
|
* |
35 |
|
|
* @return object |
36 |
|
|
*/ |
37 |
|
|
function get_element() { |
38 |
|
|
|
39 |
|
|
$attributes = $this->_build_element_attributes(); |
40 |
|
|
|
41 |
|
|
if ($this->_height) { |
42 |
|
|
$attributes["size"] = 5; |
43 |
|
|
} |
44 |
|
|
|
45 |
|
|
$selected_value = $this->get_value(); |
46 |
|
|
|
47 |
|
|
$tag = new SELECTtag($attributes); |
48 |
|
|
|
49 |
|
|
foreach ($this->_data_list as $name=>$value) { |
50 |
|
|
|
51 |
|
|
$attributes = array("value"=>$value); |
52 |
jonen |
1.3 |
if ($value == $selected_value) { |
53 |
|
|
$attributes[] = "selected"; |
54 |
|
|
} |
55 |
|
|
if (isset($this->_disabled_items[$name])) { |
56 |
|
|
$attributes[] = "disabled"; |
57 |
|
|
} |
58 |
jonen |
1.1 |
|
59 |
|
|
$tag->add(new OPTIONtag($attributes, $name)); |
60 |
|
|
} |
61 |
|
|
return $tag; |
62 |
|
|
} |
63 |
|
|
} |
64 |
jonen |
1.2 |
|
65 |
|
|
/** |
66 |
|
|
* Build a Yes/No Select box |
67 |
|
|
* |
68 |
|
|
* @author Walter A. Boring IV <waboring@buildabetterweb.com> |
69 |
|
|
* @author Suren Markossian <suren@bcsweb.com> |
70 |
|
|
* @package phpHtmlLib |
71 |
|
|
* @subpackage FormProcessing |
72 |
|
|
* |
73 |
|
|
* @copyright LGPL - See LICENCE |
74 |
|
|
*/ |
75 |
|
|
class FEYesNoListBox extends FEListBox { |
76 |
|
|
|
77 |
|
|
/** |
78 |
|
|
* The Constructor |
79 |
|
|
* |
80 |
|
|
* @param label string - text label for the element |
81 |
|
|
* @param bool required - is this a required element |
82 |
|
|
* @param array data_list - list of data elements (name=>value) |
83 |
|
|
* @param int required - element width in characters, pixels (px), percentage (%) or elements (em) |
84 |
|
|
* @param string - the value to use for the 'yes' radio |
85 |
|
|
* NOTE: default is 'yes' |
86 |
|
|
* @param string - the value to use for the 'no' radio |
87 |
|
|
* NOTE: default is 'no' |
88 |
|
|
*/ |
89 |
|
|
function FEYesNoListBox($label, $required = TRUE, $width = NULL, $height = NULL, |
90 |
|
|
$yes_value="yes", $no_value="no") { |
91 |
|
|
$options = array("Yes" => $yes_value, "No" => $no_value); |
92 |
|
|
$this->FEListBox($label, $required, $width, $height, $options); |
93 |
|
|
} |
94 |
|
|
} |
95 |
jonen |
1.3 |
|
96 |
|
|
|
97 |
|
|
/** |
98 |
|
|
* This class builds a nested select box that |
99 |
|
|
* is used to select an entry from nested levels. |
100 |
|
|
* |
101 |
|
|
* NOTE: The data array must be in the format |
102 |
|
|
* array("test" => "testvalue", |
103 |
|
|
* "nestedtest" => array("value" => "nestedtestvalue", |
104 |
|
|
* "items" => array( "foo" => "foovalue", |
105 |
|
|
* "bar" => "barvalue")); |
106 |
|
|
* |
107 |
|
|
* Example |
108 |
|
|
* $data = array("Test" => 1, |
109 |
|
|
* "Foo" => array("value" => 2, |
110 |
|
|
* "items" => array("Blah" => 3, |
111 |
|
|
* "php" => 4)), |
112 |
|
|
* "Bar" => array("value" => 5, |
113 |
|
|
* "items" => array("testing" => array("value" => 6, |
114 |
|
|
* "items" => array("ugh" => 7)), |
115 |
|
|
* "again" => 8))); |
116 |
|
|
* |
117 |
|
|
* would result in |
118 |
|
|
* |
119 |
|
|
* <select > |
120 |
|
|
* <option value="1">Test</option> |
121 |
|
|
* <option value="2">Foo</option> |
122 |
|
|
* <option value="3"> Blah</option> |
123 |
|
|
* <option value="4"> php</option> |
124 |
|
|
* <option value="5">Bar</option> |
125 |
|
|
* <option value="6"> testing</option> |
126 |
|
|
* <option value="7"> ugh</option> |
127 |
|
|
* <option value="8"> again</option> |
128 |
|
|
* </select> |
129 |
|
|
* |
130 |
|
|
* |
131 |
|
|
* @author Walter A. Boring IV <waboring@buildabetterweb.com> |
132 |
|
|
* @package phpHtmlLib |
133 |
|
|
* @subpackage FormProcessing |
134 |
|
|
* |
135 |
|
|
* @copyright LGPL - See LICENCE |
136 |
|
|
*/ |
137 |
|
|
class FENestedListBox extends FEDataList { |
138 |
|
|
|
139 |
|
|
/** |
140 |
|
|
* This function builds and returns the |
141 |
|
|
* form element object |
142 |
|
|
* |
143 |
|
|
* @return object |
144 |
|
|
*/ |
145 |
|
|
function get_element() { |
146 |
|
|
|
147 |
|
|
$attributes = $this->_build_element_attributes(); |
148 |
|
|
|
149 |
|
|
if ($this->_height) { |
150 |
|
|
$attributes["size"] = 5; |
151 |
|
|
} |
152 |
|
|
|
153 |
|
|
$tag = new SELECTtag($attributes); |
154 |
|
|
|
155 |
|
|
$this->_add_array($this->_data_list, 0, $tag); |
156 |
|
|
return $tag; |
157 |
|
|
} |
158 |
|
|
|
159 |
|
|
|
160 |
|
|
/** |
161 |
|
|
* |
162 |
|
|
* This function is responsible for performing complete |
163 |
|
|
* validation and setting the appropriate error message |
164 |
|
|
* in case of a failed validation |
165 |
|
|
* |
166 |
|
|
* @param FormValidation object |
167 |
|
|
*/ |
168 |
|
|
function validate(&$_FormValidation) { |
169 |
|
|
// we make sure that the value is in the data list |
170 |
|
|
$value = $this->get_value(); |
171 |
|
|
|
172 |
|
|
if (!$this->_array_search_r($value, $this->_data_list, $temp)) { |
173 |
|
|
$this->set_error_message("Invalid value"); |
174 |
|
|
return FALSE; |
175 |
|
|
} |
176 |
|
|
return TRUE; |
177 |
|
|
} |
178 |
|
|
|
179 |
|
|
|
180 |
|
|
function _array_search_r($needle, $haystack, &$item){ |
181 |
|
|
//xxx($needle); |
182 |
|
|
$match = FALSE; |
183 |
|
|
|
184 |
|
|
foreach($haystack as $name=>$value){ |
185 |
|
|
if (is_array($value)) { |
186 |
|
|
if ($value["value"] == $needle) { |
187 |
|
|
$item = $name; |
188 |
|
|
$match = TRUE; |
189 |
|
|
} else { |
190 |
|
|
$match = $this->_array_search_r($needle, $value["items"], $item); |
191 |
|
|
$item = $name."::".$item; |
192 |
|
|
} |
193 |
|
|
} else if ($value==$needle) { |
194 |
|
|
$item = $name; |
195 |
|
|
$match = TRUE; |
196 |
|
|
} |
197 |
|
|
|
198 |
|
|
if ($match) |
199 |
|
|
return TRUE; |
200 |
|
|
} |
201 |
|
|
return $match; |
202 |
|
|
} |
203 |
|
|
|
204 |
|
|
|
205 |
|
|
/** |
206 |
|
|
* This provides a method |
207 |
|
|
* for the FormContent |
208 |
|
|
* to get access to the |
209 |
|
|
* text associated with a |
210 |
|
|
* field. This is only available |
211 |
|
|
* on FormElements that have text |
212 |
|
|
* associated with a field. |
213 |
|
|
* It is used during Confirmation |
214 |
|
|
* |
215 |
|
|
* @return string - the text associated |
216 |
|
|
*/ |
217 |
|
|
function get_value_text() { |
218 |
|
|
$ret = $this->_array_search_r($this->get_value(), |
219 |
|
|
$this->_data_list, $item); |
220 |
|
|
return $item; |
221 |
|
|
} |
222 |
|
|
|
223 |
|
|
|
224 |
|
|
/** |
225 |
|
|
* This is a recursive function used to add |
226 |
|
|
* an array of layers to the select box. |
227 |
|
|
* |
228 |
|
|
* @param array - the next level of name=>value pairs |
229 |
|
|
* @param int - the level |
230 |
|
|
* @param SELECTtag - the SELECTtag object to add the options |
231 |
|
|
* @return none |
232 |
|
|
*/ |
233 |
|
|
function _add_array($layer_arr, $level, &$tag) { |
234 |
|
|
if (!is_array($layer_arr)) { |
235 |
|
|
return; |
236 |
|
|
} |
237 |
|
|
|
238 |
|
|
foreach( $layer_arr as $name=>$value) { |
239 |
|
|
if (is_array($value)) { |
240 |
|
|
$tag->add( $this->_build_option($name, $value["value"], $level)); |
241 |
|
|
$this->_add_array($value["items"], $level+1, $tag); |
242 |
|
|
} else { |
243 |
|
|
|
244 |
|
|
$tag->add($this->_build_option($name, $value, $level)); |
245 |
|
|
} |
246 |
|
|
} |
247 |
|
|
} |
248 |
|
|
|
249 |
|
|
/** |
250 |
|
|
* This method builds the actual OPTIONtag object |
251 |
|
|
* |
252 |
|
|
* @param string the name |
253 |
|
|
* @param string the value |
254 |
|
|
* @param int the level |
255 |
|
|
* @return OPTIONtag object |
256 |
|
|
*/ |
257 |
|
|
function _build_option($name, $value, $level) { |
258 |
|
|
$selected_value = $this->get_value(); |
259 |
|
|
|
260 |
|
|
$attributes = array("value"=>$value); |
261 |
|
|
if ($value == $selected_value) { |
262 |
|
|
$attributes[] = "selected"; |
263 |
|
|
} |
264 |
|
|
|
265 |
|
|
if (isset($this->_disabled_items[$name])) { |
266 |
|
|
$attributes[] = "disabled"; |
267 |
|
|
} |
268 |
|
|
|
269 |
|
|
return new OPTIONtag($attributes, $this->_layer_name($name, $level)); |
270 |
|
|
} |
271 |
|
|
|
272 |
|
|
/** |
273 |
|
|
* This builds a layer's name |
274 |
|
|
* |
275 |
|
|
* @param string - original name |
276 |
|
|
* @param int the layer level |
277 |
|
|
* @return string the new name |
278 |
|
|
*/ |
279 |
|
|
function _layer_name($name, $level) { |
280 |
|
|
$newname = ''; |
281 |
|
|
|
282 |
|
|
if ($level == 0) { |
283 |
|
|
return $name; |
284 |
|
|
} else { |
285 |
|
|
$newname .= str_repeat(_HTML_SPACE, $level*2).$name; |
286 |
|
|
} |
287 |
|
|
|
288 |
|
|
return $newname; |
289 |
|
|
} |
290 |
|
|
} |
291 |
jonen |
1.2 |
|
292 |
jonen |
1.1 |
|
293 |
|
|
/** |
294 |
|
|
* This is the MultiListBox FormElement which builds a |
295 |
|
|
* select field with all of its options. It enables |
296 |
|
|
* the ability to have multiple selections. |
297 |
|
|
* It has no validation method. |
298 |
|
|
* |
299 |
|
|
* |
300 |
|
|
* @author Walter A. Boring IV <waboring@buildabetterweb.com> |
301 |
|
|
* @author Suren Markossian <suren@bcsweb.com> |
302 |
|
|
* @package phpHtmlLib |
303 |
|
|
* @subpackage FormProcessing |
304 |
|
|
* |
305 |
|
|
* @copyright LGPL - See LICENCE |
306 |
|
|
*/ |
307 |
|
|
class FEMultiListBox extends FEListBox { |
308 |
|
|
|
309 |
|
|
|
310 |
|
|
/** |
311 |
|
|
* This function creates element name |
312 |
|
|
* used in the form based on the text label |
313 |
|
|
* or any other parameters |
314 |
|
|
* |
315 |
|
|
* Overriding things function to make sure |
316 |
|
|
* an array is created instead of a single variable |
317 |
|
|
*/ |
318 |
|
|
function create_element_name() { |
319 |
|
|
|
320 |
|
|
parent::create_element_name(); |
321 |
|
|
|
322 |
|
|
$this->_element_name .= "[]"; |
323 |
|
|
} |
324 |
|
|
|
325 |
|
|
/** |
326 |
jonen |
1.3 |
* build the string for the confirmation page |
327 |
|
|
* |
328 |
|
|
* @return string |
329 |
|
|
*/ |
330 |
|
|
function get_value_text() { |
331 |
|
|
$value = $this->get_value(); |
332 |
|
|
if (empty($value)) { |
333 |
|
|
return ''; |
334 |
|
|
} |
335 |
|
|
|
336 |
|
|
$data_flip = array_flip( $this->_data_list ); |
337 |
|
|
foreach( $value as $val ) { |
338 |
|
|
$ret[] = $data_flip[$val]; |
339 |
|
|
} |
340 |
|
|
return implode(", ", $ret); |
341 |
|
|
} |
342 |
|
|
|
343 |
|
|
/** |
344 |
jonen |
1.1 |
* This function builds and returns the |
345 |
|
|
* form element object |
346 |
|
|
* |
347 |
|
|
* @return object |
348 |
|
|
*/ |
349 |
|
|
function get_element() { |
350 |
|
|
|
351 |
|
|
$attributes = $this->_build_element_attributes(); |
352 |
|
|
|
353 |
|
|
$attributes[] = "multiple"; |
354 |
|
|
|
355 |
|
|
if ($this->_height) { |
356 |
|
|
$attributes["size"] = 5; |
357 |
|
|
} |
358 |
|
|
|
359 |
|
|
$selected_values = $this->get_value(); |
360 |
|
|
|
361 |
|
|
$tag = new SELECTtag($attributes); |
362 |
|
|
|
363 |
|
|
foreach ($this->_data_list as $name=>$value) { |
364 |
|
|
|
365 |
|
|
$attributes = array("value"=>$value); |
366 |
jonen |
1.3 |
if (is_array($selected_values) && in_array($value, $selected_values)) { |
367 |
|
|
$attributes[] = "selected"; |
368 |
|
|
} |
369 |
|
|
if (isset($this->_disabled_items[$name])) { |
370 |
|
|
$attributes[] = "disabled"; |
371 |
|
|
} |
372 |
jonen |
1.1 |
|
373 |
|
|
$tag->add(new OPTIONtag($attributes, $name)); |
374 |
|
|
} |
375 |
|
|
return $tag; |
376 |
|
|
} |
377 |
|
|
} |
378 |
jonen |
1.3 |
|
379 |
|
|
/** |
380 |
|
|
* This class builds a FEDataList that shows |
381 |
|
|
* a select box for States of the U.S.A. |
382 |
|
|
* |
383 |
|
|
* @author Walter A. Boring IV |
384 |
|
|
*/ |
385 |
|
|
class FEUnitedStates extends FEListBox { |
386 |
|
|
|
387 |
|
|
/** |
388 |
|
|
* The states array |
389 |
|
|
* @var array |
390 |
|
|
*/ |
391 |
|
|
var $_states = array("Select State" => "", |
392 |
|
|
"Alabama" => "AL", |
393 |
|
|
"Alaska" => "AK", |
394 |
|
|
"Arizona" => "AZ", |
395 |
|
|
"Arkansas" => "AR", |
396 |
|
|
"California" => "CA", |
397 |
|
|
"Colorado" => "CO", |
398 |
|
|
"Connecticut" => "CT", |
399 |
|
|
"Deleware" => "DE", |
400 |
|
|
"District of Columbia" => "DC", |
401 |
|
|
"Florida" => "FL", |
402 |
|
|
"Georgia" => "GA", |
403 |
|
|
"Hawaii" => "HI", |
404 |
|
|
"Idaho" => "ID", |
405 |
|
|
"Illinois" => "IL", |
406 |
|
|
"Indiana" => "IN", |
407 |
|
|
"Iowa" => "IA", |
408 |
|
|
"Kansas" => "KS", |
409 |
|
|
"Kentucky" => "KY", |
410 |
|
|
"Louisiana" => "LA", |
411 |
|
|
"Maine" => "ME", |
412 |
|
|
"Maryland" => "MD", |
413 |
|
|
"Massachusetts" => "MA", |
414 |
|
|
"Michigan" => "MI", |
415 |
|
|
"Minnesota" => "MN", |
416 |
|
|
"Mississippi" => "MS", |
417 |
|
|
"Missouri" => "MO", |
418 |
|
|
"Montana" => "MT", |
419 |
|
|
"Nebraska" => "NE", |
420 |
|
|
"Nevada" => "NV", |
421 |
|
|
"New Hampshire" => "NH", |
422 |
|
|
"New Jersey" => "NJ", |
423 |
|
|
"New Mexico" => "NM", |
424 |
|
|
"New York" => "NY", |
425 |
|
|
"North Carolina" => "NC", |
426 |
|
|
"North Dakota" => "ND", |
427 |
|
|
"Ohio" => "OH", |
428 |
|
|
"Oklahoma" => "OK", |
429 |
|
|
"Oregon" => "OR", |
430 |
|
|
"Pennsylvania" => "PA", |
431 |
|
|
"Rhode Island" => "RI", |
432 |
|
|
"South Carolina" => "SC", |
433 |
|
|
"South Dakota" => "SD", |
434 |
|
|
"Tennessee" => "TN", |
435 |
|
|
"Texas" => "TX", |
436 |
|
|
"Utah" => "UT", |
437 |
|
|
"Vermont" => "VT", |
438 |
|
|
"Virginia" => "VA", |
439 |
|
|
"Washington" => "WA", |
440 |
|
|
"West Virginia" => "WV", |
441 |
|
|
"Wisconsin" => "WI", |
442 |
|
|
"Wyoming" => "WY", |
443 |
|
|
"Puerto Rico" => "PR", |
444 |
|
|
"Virgin Island" => "VI", |
445 |
|
|
"Northern Mariana Islands" => "MP", |
446 |
|
|
"Guam" => "GU", |
447 |
|
|
"American Samoa" => "AS", |
448 |
|
|
"Palau" => "PW", |
449 |
|
|
); |
450 |
|
|
|
451 |
|
|
/** |
452 |
|
|
* The constructor |
453 |
|
|
* |
454 |
|
|
* @param string text label for the element |
455 |
|
|
* @param boolean is this a required element? |
456 |
|
|
* @param int element width in characters, pixels (px), percentage (%) or elements (em) |
457 |
|
|
* @param int element height in px |
458 |
|
|
* @param array data_list - list of data elements (name=>value) |
459 |
|
|
*/ |
460 |
|
|
function FEUnitedStates($label, $required = TRUE, $width = NULL, $height = NULL) { |
461 |
|
|
$this->FEListBox($label, $required, $width, $height, $this->_states); |
462 |
|
|
} |
463 |
|
|
} |
464 |
|
|
|
465 |
|
|
|
466 |
|
|
/** |
467 |
|
|
* This builds a complex dual select box |
468 |
|
|
* with buttons to move entries from one |
469 |
|
|
* select box to another. |
470 |
|
|
* |
471 |
|
|
* From Actions To |
472 |
|
|
* -------- Add >> -------- |
473 |
|
|
* |------| Add All |------| |
474 |
|
|
* |------| |------| |
475 |
|
|
* |------| |------| |
476 |
|
|
* |------| << Remove |------| |
477 |
|
|
* |------| Remove All |------| |
478 |
|
|
* |------| |------| |
479 |
|
|
* -------- -------- |
480 |
|
|
* |
481 |
|
|
* @author Walter A. Boring IV |
482 |
|
|
*/ |
483 |
|
|
class FEComboListBox extends FEDataList { |
484 |
|
|
|
485 |
|
|
|
486 |
|
|
/** |
487 |
|
|
* Holds the list of available |
488 |
|
|
* data elements for the 'to' |
489 |
|
|
* box. |
490 |
|
|
* |
491 |
|
|
*/ |
492 |
|
|
var $_data_list_to = array(); |
493 |
|
|
|
494 |
|
|
/** |
495 |
|
|
* The from field's label |
496 |
|
|
* |
497 |
|
|
* @var string |
498 |
|
|
*/ |
499 |
|
|
var $_from_label = 'Available'; |
500 |
|
|
|
501 |
|
|
/** |
502 |
|
|
* The to field's label |
503 |
|
|
* |
504 |
|
|
* @var string |
505 |
|
|
*/ |
506 |
|
|
var $_to_label = 'Selected'; |
507 |
|
|
|
508 |
|
|
/** |
509 |
|
|
* This Form Element needs to |
510 |
|
|
* propogate some js to the |
511 |
|
|
* Form tag's onsubmit attribute |
512 |
|
|
* |
513 |
|
|
* @var string |
514 |
|
|
*/ |
515 |
|
|
var $_has_form_on_submit = true; |
516 |
|
|
|
517 |
|
|
|
518 |
|
|
/** |
519 |
|
|
* The constructor |
520 |
|
|
* |
521 |
|
|
* @param string text label for the element |
522 |
|
|
* @param boolean is this a required element? |
523 |
|
|
* @param int element width in characters, pixels (px), percentage (%) or elements (em) |
524 |
|
|
* @param int element height in px |
525 |
|
|
* @param array list of 'from' field data elements (name=>value) |
526 |
|
|
* @param array list of 'to' field data elements (name=>value) |
527 |
|
|
*/ |
528 |
|
|
function FEComboListBox($label, $required = TRUE, $width="200px", $height="100px", |
529 |
|
|
$from_data_list = array(), $to_data_list = array()) { |
530 |
|
|
$this->set_to_list_data($to_data_list); |
531 |
|
|
$this->FEDataList($label, $required, $width, $height, $from_data_list); |
532 |
|
|
} |
533 |
|
|
|
534 |
|
|
/** |
535 |
|
|
* This function sets the array of data |
536 |
|
|
* to be used in the data list |
537 |
|
|
* |
538 |
|
|
* @param array data_list - list of data elements (name=>value) |
539 |
|
|
*/ |
540 |
|
|
function set_to_list_data( $data_list = array() ) { |
541 |
|
|
$this->_data_list_to = $data_list; |
542 |
|
|
} |
543 |
|
|
|
544 |
|
|
/** |
545 |
|
|
* Use this method to set the label for the |
546 |
|
|
* 'from' field |
547 |
|
|
* |
548 |
|
|
* @param string |
549 |
|
|
* @return none |
550 |
|
|
*/ |
551 |
|
|
function set_from_label($label) { |
552 |
|
|
$this->_from_label = $label; |
553 |
|
|
} |
554 |
|
|
|
555 |
|
|
/** |
556 |
|
|
* Use this method to set the label for the |
557 |
|
|
* 'to' field |
558 |
|
|
* |
559 |
|
|
* @param string |
560 |
|
|
* @return none |
561 |
|
|
*/ |
562 |
|
|
function set_to_label($label) { |
563 |
|
|
$this->_to_label = $label; |
564 |
|
|
} |
565 |
|
|
|
566 |
|
|
|
567 |
|
|
/** |
568 |
|
|
* This function will set the |
569 |
|
|
* initial value for the element |
570 |
|
|
* |
571 |
|
|
* @param value mixed |
572 |
|
|
*/ |
573 |
|
|
function set_value($value) { |
574 |
|
|
//we need to see if we need to modify the |
575 |
|
|
//the 2 data sets so the values of each are |
576 |
|
|
//correctly displayed. |
577 |
|
|
|
578 |
|
|
if (isset($_REQUEST[FORM_VISITED])) { |
579 |
|
|
$all_list = array_merge( $this->_data_list, $this->_data_list_to); |
580 |
|
|
|
581 |
|
|
if (isset($_REQUEST[$this->_element_name])) { |
582 |
|
|
$diff = array_diff( $all_list, $_REQUEST[$this->_element_name]); |
583 |
|
|
$this->set_list_data( $diff ); |
584 |
|
|
$to_list = array(); |
585 |
|
|
|
586 |
|
|
if (is_array($_REQUEST[$this->_element_name])) { |
587 |
|
|
foreach( $_REQUEST[$this->_element_name] as $value ) { |
588 |
|
|
$key = array_search($value, $all_list); |
589 |
|
|
if ($key) { |
590 |
|
|
$to_list[$key] = $value; |
591 |
|
|
} |
592 |
|
|
} |
593 |
|
|
} else { |
594 |
|
|
if (!empty($_REQUEST[$this->_element_name])) { |
595 |
|
|
$to_list[array_search($_REQUEST[$this->_element_name], $all_list)] = $_REQUEST[$this->_element_name]; |
596 |
|
|
} |
597 |
|
|
} |
598 |
|
|
$this->set_to_list_data( $to_list ); |
599 |
|
|
} else { |
600 |
|
|
//the assigned list is empty |
601 |
|
|
$this->set_list_data( $all_list ); |
602 |
|
|
$this->set_to_list_data(array()); |
603 |
|
|
} |
604 |
|
|
} else { |
605 |
|
|
$this->_value = $value; |
606 |
|
|
} |
607 |
|
|
} |
608 |
|
|
|
609 |
|
|
|
610 |
|
|
|
611 |
|
|
/** |
612 |
|
|
* This function builds and returns the |
613 |
|
|
* form element object |
614 |
|
|
* |
615 |
|
|
* @return object |
616 |
|
|
*/ |
617 |
|
|
function get_element() { |
618 |
|
|
$table = html_table(); |
619 |
|
|
$table->add_row($this->_from_label, _HTML_SPACE, |
620 |
|
|
$this->_to_label); |
621 |
|
|
|
622 |
|
|
$from_select = form_select($this->_element_name.'_available', |
623 |
|
|
$this->_data_list,'', TRUE); |
624 |
|
|
$style = ''; |
625 |
|
|
if ($this->_height) { |
626 |
|
|
$style .= "height: ".$this->_height.";"; |
627 |
|
|
} |
628 |
|
|
if ($this->_width) { |
629 |
|
|
$style .= "width: ".$this->_width.";"; |
630 |
|
|
} |
631 |
|
|
|
632 |
|
|
//build the buttons |
633 |
|
|
$button_style = 'width: 90px;'; |
634 |
|
|
$f_name = $this->_element_name."_move_around"; |
635 |
|
|
$add = form_button($this->_element_name.'_add', 'Add >>', array('style' => $button_style, |
636 |
|
|
'onclick' => $f_name."('right',false);")); |
637 |
|
|
$add_all = form_button($this->_element_name.'_add_all', 'Add All', array('style' => $button_style, |
638 |
|
|
"onclick" => $f_name."('right', true);")); |
639 |
|
|
|
640 |
|
|
$remove = form_button($this->_element_name.'_remove', '<< Remove', array('style' => $button_style, |
641 |
|
|
'onclick' => $f_name."('left', false);")); |
642 |
|
|
$remove_all = form_button($this->_element_name.'_remove_all', 'Remove All', array('style' => $button_style, |
643 |
|
|
'onclick' => $f_name."('left', true);")); |
644 |
|
|
|
645 |
|
|
$to_select = form_select($this->_element_name.'[]', |
646 |
|
|
$this->_data_list_to, '', TRUE); |
647 |
|
|
|
648 |
|
|
if (strlen($style) > 0) { |
649 |
|
|
$from_select->set_style($style); |
650 |
|
|
$to_select->set_style($style); |
651 |
|
|
} |
652 |
|
|
|
653 |
|
|
$table->add_row( $from_select, |
654 |
|
|
new TDtag(array('align' => 'left'), |
655 |
|
|
$add, html_br(), $add_all, html_br(2), |
656 |
|
|
$remove, html_br(), $remove_all), |
657 |
|
|
$to_select ); |
658 |
|
|
|
659 |
|
|
return $table; |
660 |
|
|
} |
661 |
|
|
|
662 |
|
|
/** |
663 |
|
|
* |
664 |
|
|
* This function is responsible for performing complete |
665 |
|
|
* validation and setting the appropriate error message |
666 |
|
|
* in case of a failed validation |
667 |
|
|
* |
668 |
|
|
* NOTE: This makes sure that the data submitted for both |
669 |
|
|
* fields is in the original list. |
670 |
|
|
* |
671 |
|
|
* @param FormValidation object |
672 |
|
|
*/ |
673 |
|
|
function validate(&$_FormValidation) { |
674 |
|
|
//need to make sure we only allow |
675 |
|
|
//elements that the class has. |
676 |
|
|
$combined = array_flip(array_merge( $this->_data_list, $this->_data_list_to)); |
677 |
|
|
|
678 |
|
|
if (isset($_REQUEST[$this->_element_name])) { |
679 |
|
|
if (is_array($_REQUEST[$this->_element_name])) { |
680 |
|
|
foreach( $_REQUEST[$this->_element_name] as $value ) { |
681 |
|
|
if (!isset($combined[$value])) { |
682 |
|
|
return FALSE; |
683 |
|
|
} |
684 |
|
|
} |
685 |
|
|
return TRUE; |
686 |
|
|
} else { |
687 |
|
|
if (!isset($combined[$value])) { |
688 |
|
|
return FALSE; |
689 |
|
|
} else { |
690 |
|
|
return TRUE; |
691 |
|
|
} |
692 |
|
|
} |
693 |
|
|
} else { |
694 |
|
|
//empty value |
695 |
|
|
return TRUE; |
696 |
|
|
} |
697 |
|
|
|
698 |
|
|
return TRUE; |
699 |
|
|
} |
700 |
|
|
|
701 |
|
|
/** |
702 |
|
|
* This provides a method |
703 |
|
|
* for the FormContent |
704 |
|
|
* to get access to the |
705 |
|
|
* text associated with a |
706 |
|
|
* field. This is only available |
707 |
|
|
* on FormElements that have text |
708 |
|
|
* associated with a field. |
709 |
|
|
* It is used during Confirmation |
710 |
|
|
* |
711 |
|
|
* @param mixed - the value to look up |
712 |
|
|
* @return string - the text associated |
713 |
|
|
*/ |
714 |
|
|
function get_value_text() { |
715 |
|
|
return implode( ", ", array_keys( $this->get_value() ) ); |
716 |
|
|
} |
717 |
|
|
|
718 |
|
|
/** |
719 |
|
|
* This is a method for getting the JS needed |
720 |
|
|
* for the form tag's onsubmit attribute. |
721 |
|
|
* |
722 |
|
|
* @return string |
723 |
|
|
*/ |
724 |
|
|
function form_tag_onsubmit() { |
725 |
|
|
return $this->_element_name.'_check_submit();'; |
726 |
|
|
} |
727 |
|
|
|
728 |
|
|
|
729 |
|
|
/** |
730 |
|
|
* This method builds the Javascript needed for this |
731 |
|
|
* element. |
732 |
|
|
* |
733 |
|
|
* @return string The javascript. |
734 |
|
|
*/ |
735 |
|
|
function javascript() { |
736 |
|
|
|
737 |
|
|
$js = "function ".$this->_element_name."_move_around(direction, all) { |
738 |
|
|
if (direction==\"right\") { |
739 |
|
|
box1 = \"".$this->_element_name."_available\"; |
740 |
|
|
box2 = \"".$this->_element_name."[]\"; |
741 |
|
|
} else { |
742 |
|
|
box1 = \"".$this->_element_name."[]\"; |
743 |
|
|
box2 = \"".$this->_element_name."_available\" + \"\"; |
744 |
|
|
} |
745 |
|
|
|
746 |
|
|
for (var i=0;i<document.forms[0].elements[box1].length;i++) { |
747 |
|
|
if (document.forms[0].elements[box1][i].selected || all) { |
748 |
|
|
// add to the other list box |
749 |
|
|
document.forms[0].elements[box2].options[document.forms[0].elements[box2].length] = |
750 |
|
|
new Option(document.forms[0].elements[box1].options[i].text, document.forms[0].elements[box1][i].value); |
751 |
|
|
// remove from the current listbox |
752 |
|
|
document.forms[0].elements[box1][i] = null; |
753 |
|
|
i--; |
754 |
|
|
} |
755 |
|
|
} |
756 |
|
|
}"; |
757 |
|
|
|
758 |
|
|
|
759 |
|
|
$js .= "\nfunction ".$this->_element_name."_check_submit() { |
760 |
|
|
// select all items in the added ip list |
761 |
|
|
// in order to include in the post data |
762 |
|
|
box = \"".$this->_element_name."[]\"; |
763 |
|
|
if (document.forms[0].elements[box]) { |
764 |
|
|
for (var i=0;i<document.forms[0].elements[box].length;i++) { |
765 |
|
|
document.forms[0].elements[box][i].selected = true; |
766 |
|
|
} |
767 |
|
|
} |
768 |
|
|
|
769 |
|
|
// disable the buttons |
770 |
|
|
//document.forms[0]._form_action1.disabled = true; |
771 |
|
|
//if (document.forms[0]._form_action2) |
772 |
|
|
// document.forms[0]._form_action2.disabled = true; |
773 |
|
|
//document.forms[0].cancel.disabled = true; |
774 |
|
|
return true; |
775 |
|
|
}"; |
776 |
|
|
|
777 |
|
|
return trim($js); |
778 |
|
|
} |
779 |
|
|
|
780 |
|
|
/** |
781 |
|
|
* This function will return the |
782 |
|
|
* elements value |
783 |
|
|
* |
784 |
|
|
* @return mixed |
785 |
|
|
*/ |
786 |
|
|
function get_value() { |
787 |
|
|
return $this->_data_list_to; |
788 |
|
|
} |
789 |
|
|
|
790 |
|
|
|
791 |
|
|
/** |
792 |
|
|
* This method returns the hidden version of this |
793 |
|
|
* element for a confirmation page. |
794 |
|
|
* |
795 |
|
|
* NOTE: This is called by the FormProcessor only. |
796 |
|
|
* It shouldn't be called manually. |
797 |
|
|
* |
798 |
|
|
* @return INPUTtag of type hidden |
799 |
|
|
*/ |
800 |
|
|
function get_confirm_element() { |
801 |
|
|
$name = $this->get_element_name(); |
802 |
|
|
|
803 |
|
|
$c = container(); |
804 |
|
|
if (is_array( $_REQUEST[$name]) ) { |
805 |
|
|
foreach( $_REQUEST[$name] as $value ) { |
806 |
|
|
$c->add(form_hidden( $name."[]", $value)); |
807 |
|
|
} |
808 |
|
|
} else { |
809 |
|
|
$c->add(form_hidden($name."[]", $_REQUEST[$name] )); |
810 |
|
|
} |
811 |
|
|
|
812 |
|
|
return $c; |
813 |
|
|
} |
814 |
|
|
} |
815 |
|
|
|
816 |
|
|
/** |
817 |
|
|
* This class builds a FEDataList that shows |
818 |
|
|
* a select box for Months of the year |
819 |
|
|
* |
820 |
|
|
* @author Culley Harrelson <culley@fastmail.fm> |
821 |
|
|
* |
822 |
|
|
*/ |
823 |
|
|
|
824 |
|
|
class FEMonths extends FEListBox { |
825 |
|
|
|
826 |
|
|
/** |
827 |
|
|
* The constructor |
828 |
|
|
* |
829 |
|
|
* @param string text label for the element |
830 |
|
|
* @param boolean is this a required element? |
831 |
|
|
* @param int element width in characters, pixels (px), percentage (%) or elements (em) |
832 |
|
|
* @param int element height in px |
833 |
|
|
* @param string format should be F m or M: Full month name, digit, abbreviated month name |
834 |
|
|
*/ |
835 |
|
|
function FEMonths($label, $required = TRUE, $width = NULL, $height = NULL, $format = 'F') { |
836 |
|
|
|
837 |
|
|
// $format should be M m or F. Default to F if the user passes in garbage. |
838 |
|
|
switch ($format) { |
839 |
|
|
case 'M': |
840 |
|
|
$format = '%b'; |
841 |
|
|
break; |
842 |
|
|
case 'm': |
843 |
|
|
$format = '%m'; |
844 |
|
|
break; |
845 |
|
|
default: |
846 |
|
|
$format = '%B'; |
847 |
|
|
break; |
848 |
|
|
} |
849 |
|
|
|
850 |
|
|
for ($i = 1; $i < 13; $i++) { |
851 |
|
|
$months[$i] = strftime($format, strtotime("$i/12/2004")); |
852 |
|
|
} |
853 |
|
|
|
854 |
|
|
$this->FEListBox($label, $required, $width, $height, array_flip($months)); |
855 |
|
|
|
856 |
|
|
} |
857 |
|
|
} |
858 |
|
|
|
859 |
|
|
/** |
860 |
|
|
* This class builds a FEDataList that shows |
861 |
|
|
* a select box listing a range of years |
862 |
|
|
* |
863 |
|
|
* @author Culley Harrelson <culley@fastmail.fm> |
864 |
|
|
* |
865 |
|
|
*/ |
866 |
|
|
|
867 |
|
|
class FEYears extends FEListBox { |
868 |
|
|
|
869 |
|
|
/** |
870 |
|
|
* The constructor |
871 |
|
|
* |
872 |
|
|
* @param string text label for the element |
873 |
|
|
* @param boolean is this a required element? |
874 |
|
|
* @param int element width in characters, pixels (px), percentage (%) or elements (em) |
875 |
|
|
* @param int element height in px |
876 |
|
|
* @param int min_year |
877 |
|
|
* @param int max_year |
878 |
|
|
*/ |
879 |
|
|
function FEYears($label, $required = TRUE, $width = NULL, $height = NULL, $min_year = 2000, $max_year = 2010) { |
880 |
|
|
// this will be cleaner in php5 with array_combine() |
881 |
|
|
$list = range($min_year, $max_year); |
882 |
|
|
foreach ($list as $year) { |
883 |
|
|
$years[$year] = $year; |
884 |
|
|
} |
885 |
|
|
$this->FEListBox($label, $required, $width, $height, $years); |
886 |
|
|
} |
887 |
|
|
} |
888 |
|
|
|
889 |
|
|
/** |
890 |
|
|
* This class builds a FEDataList that shows |
891 |
|
|
* a select box listing the days of the month |
892 |
|
|
* |
893 |
|
|
* @author Culley Harrelson <culley@fastmail.fm> |
894 |
|
|
* |
895 |
|
|
*/ |
896 |
|
|
|
897 |
|
|
class FEDays extends FEListBox { |
898 |
|
|
|
899 |
|
|
/** |
900 |
|
|
* The constructor |
901 |
|
|
* |
902 |
|
|
* @param string text label for the element |
903 |
|
|
* @param boolean is this a required element? |
904 |
|
|
* @param int element width in characters, pixels (px), percentage (%) or elements (em) |
905 |
|
|
* @param int element height in px |
906 |
|
|
*/ |
907 |
|
|
|
908 |
|
|
function FEDays($label, $required = TRUE, $width = NULL, $height = NULL) { |
909 |
|
|
|
910 |
|
|
// this will be cleaner in php5 with array_combine() |
911 |
|
|
$list = range(1, 31); |
912 |
|
|
foreach ($list as $day) { |
913 |
|
|
// pad the single digit days with zeros |
914 |
|
|
$day = sprintf('%02d', $day); |
915 |
|
|
$days[$day] = $day; |
916 |
|
|
} |
917 |
|
|
$this->FEListBox($label, $required, $width, $height, $days); |
918 |
|
|
|
919 |
|
|
} |
920 |
|
|
} |
921 |
|
|
|
922 |
|
|
/** |
923 |
|
|
* This class builds a FEDataList that shows a group of select boxes |
924 |
|
|
* (FEYears, FEMonths, FEDays) representing a date. |
925 |
|
|
* |
926 |
|
|
* @author Culley Harrelson <culley@fastmail.fm> |
927 |
|
|
* @author Suren Markosian <suren@emicron.net> |
928 |
|
|
* |
929 |
|
|
*/ |
930 |
|
|
|
931 |
|
|
class FEDate extends FEBoxElement { |
932 |
|
|
|
933 |
|
|
/** |
934 |
|
|
* The earliest year shown in the year list. |
935 |
|
|
* @var int |
936 |
|
|
*/ |
937 |
|
|
var $_min_year; |
938 |
|
|
|
939 |
|
|
/** |
940 |
|
|
* The latest year shown in the year list. |
941 |
|
|
* @var string |
942 |
|
|
*/ |
943 |
|
|
var $_max_year; |
944 |
|
|
|
945 |
|
|
/** |
946 |
|
|
* The order in which to show the elements. This variable must be 3 |
947 |
|
|
* characters long and contain only one m only one d and only one y. |
948 |
|
|
* |
949 |
|
|
* @var string |
950 |
|
|
*/ |
951 |
|
|
var $_format = 'mdy'; |
952 |
|
|
|
953 |
|
|
/** |
954 |
|
|
* A printf style format string used to add punctuation to the confirmation |
955 |
|
|
* display. Defaults to space separated. The placeholders are filled |
956 |
|
|
* according to the order set in $_format |
957 |
|
|
* |
958 |
|
|
* @var string |
959 |
|
|
*/ |
960 |
|
|
var $_text_format = '%s %s %s'; |
961 |
|
|
|
962 |
|
|
/** |
963 |
|
|
* The year form element |
964 |
|
|
* |
965 |
|
|
* @var FEYears |
966 |
|
|
*/ |
967 |
|
|
var $_year; |
968 |
|
|
|
969 |
|
|
/** |
970 |
|
|
* The month form element |
971 |
|
|
* |
972 |
|
|
* @var FEMonths |
973 |
|
|
*/ |
974 |
|
|
var $_month; |
975 |
|
|
|
976 |
|
|
/** |
977 |
|
|
* The day form element |
978 |
|
|
* |
979 |
|
|
* @var FEDays |
980 |
|
|
*/ |
981 |
|
|
var $_day; |
982 |
|
|
|
983 |
|
|
/** |
984 |
|
|
* The constructor |
985 |
|
|
* |
986 |
|
|
* @param string text label for the element |
987 |
|
|
* @param boolean is this a required element? |
988 |
|
|
* @param int element width in characters, pixels (px), percentage (%) or elements (em) |
989 |
|
|
* @param int element height in px |
990 |
|
|
* @param string date format string. M m F Y y d D are valid. 3 characters max. |
991 |
|
|
* @param int min value for year drop down list |
992 |
|
|
* @param int max value for year drop down list |
993 |
|
|
* |
994 |
|
|
*/ |
995 |
|
|
|
996 |
|
|
function FEDate($label, $required = TRUE, $width = NULL, $height = NULL, $format = 'mdy', $min_year = 2000, $max_year = 2010) { |
997 |
|
|
|
998 |
|
|
$this->_set_format($format); |
999 |
|
|
$this->_min_year = $min_year; |
1000 |
|
|
$this->_max_year = $max_year; |
1001 |
|
|
|
1002 |
|
|
$this->_year = new FEYears($this->_element_name . '_years', $required, null, null, $min_year, $max_year); |
1003 |
|
|
$this->_month = new FEMonths($this->_element_name . '_months', $required, null, null, preg_replace('/[dy]/i', '', $this->_format)); |
1004 |
|
|
$this->_day = new FEDays($this->_element_name . '_days', $required, null, null); |
1005 |
|
|
$this->FEBoxElement($label, $required, $width, $height); |
1006 |
|
|
} |
1007 |
|
|
|
1008 |
|
|
/** |
1009 |
|
|
* This function builds and returns the |
1010 |
|
|
* form element object |
1011 |
|
|
* |
1012 |
|
|
* @return object |
1013 |
|
|
*/ |
1014 |
|
|
function get_element() { |
1015 |
|
|
|
1016 |
|
|
$container = new Container(); |
1017 |
|
|
|
1018 |
|
|
// add the elements in the order specified. |
1019 |
|
|
$chars = preg_split('//', $this->_format, -1, PREG_SPLIT_NO_EMPTY); |
1020 |
|
|
foreach ($chars as $char) { |
1021 |
|
|
switch ($char) { |
1022 |
|
|
case 'y': |
1023 |
|
|
$container->add($this->_year->get_element()); |
1024 |
|
|
break; |
1025 |
|
|
case 'm': |
1026 |
|
|
case 'F': |
1027 |
|
|
$container->add($this->_month->get_element()); |
1028 |
|
|
break; |
1029 |
|
|
case 'd': |
1030 |
|
|
$container->add($this->_day->get_element()); |
1031 |
|
|
break; |
1032 |
|
|
} |
1033 |
|
|
} |
1034 |
|
|
|
1035 |
|
|
return $container; |
1036 |
|
|
} |
1037 |
|
|
|
1038 |
|
|
/** |
1039 |
|
|
* This function will return the elements value as an array or month, day |
1040 |
|
|
* and year |
1041 |
|
|
* |
1042 |
|
|
* @return array |
1043 |
|
|
*/ |
1044 |
|
|
function get_value() { |
1045 |
|
|
|
1046 |
|
|
return $this->_value; |
1047 |
|
|
|
1048 |
|
|
} |
1049 |
|
|
|
1050 |
|
|
/** |
1051 |
|
|
* This function sets the default values for the date element The |
1052 |
|
|
* parameter should be a string representation of the date in ISO 8601 |
1053 |
|
|
* format. |
1054 |
|
|
* |
1055 |
|
|
* @param string |
1056 |
|
|
*/ |
1057 |
|
|
function set_value($value) { |
1058 |
|
|
|
1059 |
|
|
$date_parts = explode('-', $value); |
1060 |
|
|
$this->_year->set_value($date_parts[0]); |
1061 |
|
|
$this->_month->set_value($date_parts[1]); |
1062 |
|
|
$this->_day->set_value($date_parts[2]); |
1063 |
|
|
|
1064 |
|
|
} |
1065 |
|
|
|
1066 |
|
|
/** |
1067 |
|
|
* This returns a formatted string used for the confirmation display (and |
1068 |
|
|
* possibly elsewhere) |
1069 |
|
|
* |
1070 |
|
|
* @return string |
1071 |
|
|
*/ |
1072 |
|
|
function get_value_text() { |
1073 |
|
|
|
1074 |
|
|
// loop through the characters in $_format to properly set the placeholders |
1075 |
|
|
// determined in $_text_format |
1076 |
|
|
$chars = preg_split('//', $this->_format, -1, PREG_SPLIT_NO_EMPTY); |
1077 |
|
|
$i = 1; |
1078 |
|
|
foreach ($chars as $char) { |
1079 |
|
|
|
1080 |
|
|
switch ($char) { |
1081 |
|
|
case 'y': |
1082 |
|
|
$value = $this->_year->get_value_text(); |
1083 |
|
|
break; |
1084 |
|
|
case 'm': |
1085 |
|
|
case 'F': |
1086 |
|
|
$value = $this->_month->get_value_text(); |
1087 |
|
|
break; |
1088 |
|
|
case 'd': |
1089 |
|
|
$value = $this->_day->get_value_text(); |
1090 |
|
|
break; |
1091 |
|
|
} |
1092 |
|
|
|
1093 |
|
|
switch ($i) { |
1094 |
|
|
case 1: |
1095 |
|
|
$one = $value; |
1096 |
|
|
break; |
1097 |
|
|
case 2: |
1098 |
|
|
$two = $value; |
1099 |
|
|
break; |
1100 |
|
|
case 3: |
1101 |
|
|
$three = $value; |
1102 |
|
|
break; |
1103 |
|
|
} |
1104 |
|
|
|
1105 |
|
|
$i++; |
1106 |
|
|
} |
1107 |
|
|
|
1108 |
|
|
return sprintf($this->_text_format, $one, $two, $three); |
1109 |
|
|
} |
1110 |
|
|
|
1111 |
|
|
/** |
1112 |
|
|
* |
1113 |
|
|
* This function is responsible for performing complete |
1114 |
|
|
* validation and setting the appropriate error message |
1115 |
|
|
* in case of a failed validation |
1116 |
|
|
* |
1117 |
|
|
* @param FormValidation object |
1118 |
|
|
*/ |
1119 |
|
|
function validate(&$_FormValidation) { |
1120 |
|
|
$value = $this->get_value(); |
1121 |
|
|
|
1122 |
|
|
// we make sure that the date is valid |
1123 |
|
|
if (!checkdate($value["month"], $value["day"], $value["year"])) { |
1124 |
|
|
$this->set_error_message("Invalid date"); |
1125 |
|
|
return FALSE; |
1126 |
|
|
} |
1127 |
|
|
return TRUE; |
1128 |
|
|
} |
1129 |
|
|
|
1130 |
|
|
/** |
1131 |
|
|
* this method sets the display order for the elements in the widget |
1132 |
|
|
* |
1133 |
|
|
* @param string |
1134 |
|
|
* @return bool success or failure |
1135 |
|
|
*/ |
1136 |
|
|
function _set_format($format) { |
1137 |
|
|
|
1138 |
|
|
// must be 3 characters |
1139 |
|
|
if (strlen($format) != 3) { |
1140 |
|
|
return FALSE; |
1141 |
|
|
} |
1142 |
|
|
|
1143 |
|
|
// month can be represented by F m or M |
1144 |
|
|
if (strstr($format, 'F')) { |
1145 |
|
|
$month = 'f'; |
1146 |
|
|
} else { |
1147 |
|
|
$month = 'm'; |
1148 |
|
|
} |
1149 |
|
|
|
1150 |
|
|
// compare the characters sent with the characters needed. only set |
1151 |
|
|
// the property if one of each is present |
1152 |
|
|
$search_for = array ('y', $month, 'd'); |
1153 |
|
|
$chars = preg_split('//', strtolower($format), -1, PREG_SPLIT_NO_EMPTY); |
1154 |
|
|
|
1155 |
|
|
if (count(array_diff($search_for, $chars)) > 0) { |
1156 |
|
|
return FALSE; |
1157 |
|
|
} |
1158 |
|
|
|
1159 |
|
|
$this->_format = $format; |
1160 |
|
|
return TRUE; |
1161 |
|
|
|
1162 |
|
|
} |
1163 |
|
|
|
1164 |
|
|
/** |
1165 |
|
|
* this method sets the format string used in get_value_text(). Use this |
1166 |
|
|
* method to set special punctuation for the confirmation display. |
1167 |
|
|
* |
1168 |
|
|
* @param string |
1169 |
|
|
* |
1170 |
|
|
*/ |
1171 |
|
|
function set_text_format($format) { |
1172 |
|
|
|
1173 |
|
|
$this->_text_format = $format; |
1174 |
|
|
} |
1175 |
|
|
|
1176 |
|
|
/** |
1177 |
|
|
* This method returns the hidden version of this |
1178 |
|
|
* element for a confirmation page. |
1179 |
|
|
* |
1180 |
|
|
* NOTE: This is called by the FormProcessor only. |
1181 |
|
|
* It shouldn't be called manually. |
1182 |
|
|
* |
1183 |
|
|
* @return container |
1184 |
|
|
*/ |
1185 |
|
|
function get_confirm_element() { |
1186 |
|
|
$element_name = $this->get_element_name(); |
1187 |
|
|
|
1188 |
|
|
$c = container(); |
1189 |
|
|
$c->add(form_hidden("{$element_name}[year]", $this->_year->get_value())); |
1190 |
|
|
$c->add(form_hidden("{$element_name}[month]", $this->_month->get_value())); |
1191 |
|
|
$c->add(form_hidden("{$element_name}[day]", $this->_day->get_value())); |
1192 |
|
|
return $c; |
1193 |
|
|
} |
1194 |
|
|
|
1195 |
|
|
} |
1196 |
|
|
|
1197 |
jonen |
1.1 |
?> |