1 |
jonen |
1.1 |
<?php |
2 |
|
|
|
3 |
|
|
/** |
4 |
|
|
* This is an unrealistic example form that uses all available form elements. |
5 |
|
|
* No items have explicitly been marked as required, enabling you to test |
6 |
|
|
* individual elements by entering good data or garbage and seeing the result. |
7 |
|
|
* |
8 |
|
|
* $Id: form3.php,v 1.8 2004/03/28 19:46:20 culley Exp $ |
9 |
|
|
* |
10 |
|
|
* @author Culley Harrelson <culley@fastmail.fm> |
11 |
|
|
* @package phpHtmlLib |
12 |
|
|
* @subpackage form-examples |
13 |
|
|
* @version 1.0.0 |
14 |
|
|
* |
15 |
|
|
*/ |
16 |
|
|
function xxx($var) { echo "<xmp>"; var_dump($var); echo "</xmp>"; } |
17 |
|
|
|
18 |
|
|
// Include the phphtmllib libraries |
19 |
|
|
$phphtmllib = $_SERVER["DOCUMENT_ROOT"] . "/phphtmllib"; |
20 |
|
|
include_once("$phphtmllib/includes.inc"); |
21 |
|
|
|
22 |
|
|
// Include the Form Processing objects |
23 |
|
|
include_once($phphtmllib."/form/includes.inc"); |
24 |
|
|
|
25 |
|
|
|
26 |
|
|
//use the class we defined from |
27 |
|
|
//Example 3. |
28 |
|
|
include_once($phphtmllib."/examples/MyLayoutPage.inc"); |
29 |
|
|
|
30 |
|
|
/** |
31 |
|
|
* A simple Page Layout object child. this came from Example 3. |
32 |
|
|
* |
33 |
|
|
* @author Culley Harrelson <culley@fastmail.fm> |
34 |
|
|
* @package phpHtmlLib |
35 |
|
|
* @subpackage form-examples |
36 |
|
|
* |
37 |
|
|
*/ |
38 |
|
|
class Form3Page extends MyLayoutPage { |
39 |
|
|
|
40 |
|
|
function content_block() { |
41 |
|
|
//build the FormProcessor, and add the |
42 |
|
|
//Form content object that the FormProcessor |
43 |
|
|
//will use. Make the width of the form 95% |
44 |
|
|
return new FormProcessor(new SampleForm('95%')); |
45 |
|
|
} |
46 |
|
|
} |
47 |
|
|
|
48 |
|
|
|
49 |
|
|
/** |
50 |
|
|
* This is the Class that handles the building of the Form itself. It creates |
51 |
|
|
* the Form Elements inside the form_init_elements() method. |
52 |
|
|
* |
53 |
|
|
* @author Culley Harrelson <culley@fastmail.fm> |
54 |
|
|
* @package phpHtmlLib |
55 |
|
|
* @subpackage form-examples |
56 |
|
|
* |
57 |
|
|
*/ |
58 |
|
|
|
59 |
|
|
class SampleForm extends FormContent { // {{{ |
60 |
|
|
|
61 |
|
|
/** |
62 |
|
|
* This method gets called EVERY time the object is created. It is used to |
63 |
|
|
* build all of the FormElement objects used in this Form. |
64 |
|
|
* |
65 |
|
|
*/ |
66 |
|
|
function form_init_elements() { |
67 |
|
|
|
68 |
|
|
// we want an confirmation page for this form. |
69 |
|
|
$this->set_confirm(); |
70 |
|
|
|
71 |
|
|
// now start to add the Form Elements that will be used in this form. |
72 |
|
|
|
73 |
|
|
// FEButton (label $label, string $value, [string $action = NULL], |
74 |
|
|
// [int $width = NULL], [int $height = NULL]) |
75 |
|
|
$this->add_element(new FEButton("FEButton Label", 'button-value', 'javascript-action')); |
76 |
|
|
|
77 |
|
|
// FECheckBox (label $label, string $text) |
78 |
|
|
$this->add_element(new FECheckBox("FECheckBox Label", 'checkbox-text')); |
79 |
|
|
|
80 |
|
|
// FEDataList (string $label, [boolean $required = TRUE], [int $width |
81 |
|
|
// = NULL], [int $height = NULL], [array $data_list = array()]) |
82 |
|
|
$list = new FECheckBoxList("FECheckBoxList label", FALSE, |
83 |
|
|
"200px", "80px", |
84 |
|
|
array("Testing 123" => "foo", |
85 |
|
|
"my value is bar" => "bar", |
86 |
|
|
"Somone's test" => "blah", |
87 |
|
|
"Slerm" => "slerm", |
88 |
|
|
"my value is hat" => "hat", |
89 |
|
|
"One" => 1)); |
90 |
|
|
$list->disable_item("Testing 123"); |
91 |
|
|
$this->add_element($list); |
92 |
|
|
|
93 |
|
|
// FEComboListBox (string $label, [boolean $required = TRUE], [int |
94 |
|
|
// $width = "200px"], [int $height = "100px"], [array $from_data_list = |
95 |
|
|
// array()], [array $to_data_list = array()]) |
96 |
|
|
$combo_list = new FEComboListBox("FEComboListBox Label", false, '300px', |
97 |
|
|
'100px', array('one' => 1, 'two' => 2), array('three' => 3, 'four' => 4)); |
98 |
|
|
$combo_list->set_to_label('this is the to label'); |
99 |
|
|
$combo_list->set_from_label('this is the from label'); |
100 |
|
|
$this->add_element($combo_list); |
101 |
|
|
|
102 |
|
|
// FEConfirmActionButton (mixed $label, mixed $value, [mixed $message |
103 |
|
|
// = NULL], [mixed $width = NULL], [mixed $height = NULL]) |
104 |
|
|
$this->add_element(new FEConfirmActionButton("FEConfirmActionButton label", |
105 |
|
|
'click me for a javascript confirmation', 'Are you sure?')); |
106 |
|
|
|
107 |
|
|
// the constructor for FEPassword and FEConfirmPassword are the same as FEText |
108 |
|
|
$password = new FEPassword("FEPassword label", false, "200px"); |
109 |
|
|
$this->add_element($password); |
110 |
|
|
|
111 |
|
|
$confirm = new FEConfirmPassword("FEConfirmPassword label", false, "200px"); |
112 |
|
|
|
113 |
|
|
// add the password FormElement to the ConfirmPassword FormElement so |
114 |
|
|
// we can make sure they match. |
115 |
|
|
$confirm->password($password); |
116 |
|
|
$this->add_element($confirm); |
117 |
|
|
|
118 |
|
|
// These elements have the same constructor as FEText |
119 |
|
|
$this->add_element(new FEDomainName("FEDomainName label", false, "200px")); |
120 |
|
|
$this->add_element(new FEEmail("FEEmail label", false, "200px")); |
121 |
|
|
$this->add_element(new FEEmailMany("FEEmailMany label (comma separated)", false, "400px")); |
122 |
|
|
|
123 |
|
|
// file upload |
124 |
|
|
$file = new FEFile("FEFile label", false, "200px"); |
125 |
|
|
$file->add_valid_type('image/gif'); |
126 |
|
|
$file->add_valid_type('image/jpeg'); |
127 |
|
|
$file->set_max_size(1024 * 2); |
128 |
|
|
$this->add_element($file); |
129 |
|
|
|
130 |
|
|
// FEHidden (mixed $label, [mixed $value = NULL]) |
131 |
|
|
$this->add_element(new FEHidden("FEHidden label", 'the hidden value')); |
132 |
|
|
|
133 |
|
|
// FEHostNameWithPort (label $label, [bool $required = TRUE], [int |
134 |
|
|
// $width = NULL], [int $maxlength = NULL], [bool $seperate_port = |
135 |
|
|
// FALSE]) |
136 |
|
|
$this->add_element(new FEHostNameWithPort("FEHostNameWithPort label", false)); |
137 |
|
|
|
138 |
|
|
// Same constructor as FEText |
139 |
|
|
$this->add_element(new FEIPAddress("FEIPAddress label", false, "200px")); |
140 |
|
|
|
141 |
|
|
// Same constructor as FEHostNameWithPort |
142 |
|
|
$this->add_element(new FEIPAddressWithPort("FEIPAddressWithPort label", false)); |
143 |
|
|
|
144 |
|
|
// your standard drop down select list |
145 |
|
|
$list_box_collapsed = new FEListBox('FEListBoxCollapsed label', false, '200px'); |
146 |
|
|
$list_box_collapsed->set_list_data(array('one' => 1, 'two' => 2, 'three' => 3, 'four' => 4)); |
147 |
|
|
$this->add_element($list_box_collapsed); |
148 |
|
|
|
149 |
|
|
// same as the above select list but with a height setting |
150 |
|
|
$list_box = new FEListBox('FEListBox label', false, '200px', '100px'); |
151 |
|
|
$list_box->set_list_data(array('one' => 1, 'two' => 2, 'three' => 3, 'four' => 4)); |
152 |
|
|
$this->add_element($list_box); |
153 |
|
|
|
154 |
|
|
// FEMonths($label, $required = TRUE, $width = NULL, $height = NULL, $locale = 'en', $format = 'long') { |
155 |
|
|
$this->add_element(new FEMonths("FEMonths label", false)); |
156 |
|
|
|
157 |
|
|
// FEYears($label, $required = TRUE, $width = NULL, $height = NULL, $min_year = 2000, $max_year = 2010) { |
158 |
|
|
$this->add_element(new FEYears("FEYears label", false, null, null, date('Y'), date('Y') + 10)); |
159 |
|
|
|
160 |
|
|
// FEDays($label, $required = TRUE, $width = NULL, $height = NULL) { |
161 |
|
|
$this->add_element(new FEDays("FEDays label", false)); |
162 |
|
|
|
163 |
|
|
// set the locale to dutch |
164 |
|
|
setlocale(LC_TIME, 'nl_NL'); |
165 |
|
|
|
166 |
|
|
// TODO: document this |
167 |
|
|
$date_element = new FEDate("FEDate label", false, null, null, 'Fdy', 1970, 1975); |
168 |
|
|
// $date_element->set_short_months(); |
169 |
|
|
// $date_element->set_min_year(1970); |
170 |
|
|
// $date_element->set_max_year(1975); |
171 |
|
|
// $date_element->set_format('Fdy'); |
172 |
|
|
$date_element->set_text_format("%s %s, %s"); |
173 |
|
|
// $date_element->set_text_format("%04d-%02d-%02d"); |
174 |
|
|
$this->add_element($date_element); |
175 |
|
|
|
176 |
|
|
// a list box that allows you to select multiple items |
177 |
|
|
$m_list_box = new FEMultiListBox('FEMultiListBox label', false, '200px', '100px'); |
178 |
|
|
$m_list_box->set_list_data(array('one' => 1, 'two' => 2, 'three' => 3, 'four' => 4)); |
179 |
|
|
$this->add_element($m_list_box); |
180 |
|
|
|
181 |
|
|
// Same constructor as FEText |
182 |
|
|
$this->add_element(new FEName("FEName label", false, "200px")); |
183 |
|
|
|
184 |
|
|
$nested_list_box = new FENestedListBox('FENestedListBox label', false, '200px', '100px'); |
185 |
|
|
$data = array("Test" => 1, "Foo" => array("value" => 2, "items" => array("Blah" => 3, "php" => 4)), "Bar" => array("value" => 5, "items" => array("testing" => array("value" => 6, "items" => array("ugh" => 7)), "again" => 8))); |
186 |
|
|
$nested_list_box->set_list_data($data); |
187 |
|
|
$this->add_element($nested_list_box); |
188 |
|
|
|
189 |
|
|
// Same constructor as FEText |
190 |
|
|
$this->add_element(new FENumber("FENumber label", false, "200px")); |
191 |
|
|
$this->add_element(new FENumberFloat("FENumberFloat label", false, "200px")); |
192 |
|
|
$this->add_element(new FENumberFloat("FENumberFloat label", false, "200px")); |
193 |
|
|
|
194 |
|
|
// FENumberInRange (label $label, [bool $required = TRUE], [int $width |
195 |
|
|
// = NULL], [int $maxlength = NULL], int $min, [int $max = 100], |
196 |
|
|
// [boolean $label_flag = TRUE]) |
197 |
|
|
$this->add_element(new FENumberInRange("FENumberInRange label", false, "200px", null, 1, 10)); |
198 |
|
|
|
199 |
|
|
|
200 |
|
|
// Same constructor as FEText |
201 |
|
|
$this->add_element(new FENumberPrice("FENumberPrice label", false, "200px")); |
202 |
|
|
|
203 |
|
|
// FERadioGroup (label $label, [array $data_list = array()]) |
204 |
|
|
$this->add_element(new FERadioGroup("FERadioGroup label", |
205 |
|
|
array('one' => 1, 'two' => 2, 'three' => 3, 'four' => 4))); |
206 |
|
|
|
207 |
|
|
// this is the same as the above radio group but it is handled |
208 |
|
|
// differently in the display method below |
209 |
|
|
$this->add_element(new FERadioGroup("FERadioGroup vertical label", |
210 |
|
|
array('one' => 1, 'two' => 2, 'three' => 3, 'four' => 4))); |
211 |
|
|
|
212 |
|
|
// add constructor label here. |
213 |
|
|
$this->add_element( new FERegEx("FERegEx label", false, '200px', 3, |
214 |
|
|
'/^1[a-z]T$/', 'This field must equal 1[a-z]T') ); |
215 |
|
|
|
216 |
|
|
$this->add_element(new FEText("FEText label", false, "200px")); |
217 |
|
|
|
218 |
|
|
// FETextArea (label $label, [bool $required = TRUE], int $rows, int |
219 |
|
|
// $cols, [int $width = NULL], [int $height = NULL], [int |
220 |
|
|
// $limit_char_count = -1]) |
221 |
|
|
$this->add_element(new FETextArea("FETextArea label", false, 10, 50, null, 300)); |
222 |
|
|
|
223 |
|
|
// FEUnitedStates (string $label, [boolean $required = TRUE], [int |
224 |
|
|
// $width = NULL], [int $height = NULL], array 4) |
225 |
|
|
$this->add_element(new FEUnitedStates("FEUnitedStates label", false)); |
226 |
|
|
|
227 |
|
|
// Same constructor as FEText |
228 |
|
|
$this->add_element(new FEUrl("FEUrl label", false, "200px")); |
229 |
|
|
$this->add_element(new FEUrlStrict("FEUrlStrict label", false, "200px")); |
230 |
|
|
|
231 |
|
|
// FEYesNoListBox (label $label, [bool $required = TRUE], [array |
232 |
|
|
// $width = NULL], [int $height = NULL], [string $yes_value = "yes"], |
233 |
|
|
// [string $no_value = "no"]) |
234 |
|
|
$this->add_element(new FEYesNoListBox("FEYesNoListBox label", false)); |
235 |
|
|
|
236 |
|
|
// FEYesNoRadioGroup (label $label, [bool $required = TRUE], [string |
237 |
|
|
// $yes_value = "yes"], [string $no_value = "no"]) |
238 |
|
|
$this->add_element(new FEYesNoRadioGroup("FEYesNoRadioGroup label", false)); |
239 |
|
|
|
240 |
|
|
// FEZipcode (label $label, [bool $required = false], [int $width = |
241 |
|
|
// NULL], [int $maxlength = 5]) |
242 |
|
|
$this->add_element(new FEZipcode("FEZipcode label", false)); |
243 |
|
|
|
244 |
|
|
// FESubmitButton (label $label, string $value, [int $width = NULL], |
245 |
|
|
// [int $height = NULL]) |
246 |
|
|
$this->add_element(new FESubmitButton("FESubmitButton label", 'submit button value')); |
247 |
|
|
|
248 |
|
|
} |
249 |
|
|
|
250 |
|
|
/** |
251 |
|
|
* This method is called only the first time the form page is hit. This |
252 |
|
|
* enables u to query a DB and pre populate the FormElement objects with |
253 |
|
|
* data. |
254 |
|
|
* |
255 |
|
|
*/ |
256 |
|
|
function form_init_data() { |
257 |
|
|
//this sets the value to the FERadioGroup first value to 3 or 'three' |
258 |
|
|
$this->set_element_value('FERadioGroup label', 3); |
259 |
|
|
|
260 |
|
|
//this sets the value to the FERadioGroup vertical to 2 or 'two' |
261 |
|
|
$this->set_element_value('FERadioGroup vertical label', 2); |
262 |
|
|
|
263 |
|
|
//this sets the default value of the FEYesNoRadioGroup to no |
264 |
|
|
$this->set_element_value('FEYesNoRadioGroup label', 'no'); |
265 |
|
|
|
266 |
|
|
//the default values for check boxes take a boolean |
267 |
|
|
$this->set_element_value('FECheckBox Label', true); |
268 |
|
|
|
269 |
|
|
//the default values for FEDate elements should be an ISO 8601 date string |
270 |
|
|
$this->set_element_value('FEDate label', '1974-10-07'); |
271 |
|
|
} |
272 |
|
|
|
273 |
|
|
|
274 |
|
|
/** |
275 |
|
|
* This is the method that builds the layout of where the FormElements will |
276 |
|
|
* live. You can lay it out any way you like. |
277 |
|
|
* |
278 |
|
|
*/ |
279 |
|
|
function form() { |
280 |
|
|
|
281 |
|
|
$table = &html_table($this->_width,0,0,2); |
282 |
|
|
|
283 |
|
|
// add each element to the form as it was included above |
284 |
|
|
foreach(array_keys($this->_elements) as $label) { |
285 |
|
|
switch ($label) { |
286 |
|
|
case 'FERadioGroup vertical label': |
287 |
|
|
// a radio group can be displayed vertically by changing |
288 |
|
|
// the br flag on get_element to true |
289 |
|
|
$element =& $this->get_element($label); |
290 |
|
|
$table->add_row($this->element_label($label), $element->get_element(null, true)); |
291 |
|
|
break; |
292 |
|
|
default: |
293 |
|
|
$table->add_row($this->element_label($label), $this->element_form($label)); |
294 |
|
|
break; |
295 |
|
|
} |
296 |
|
|
} |
297 |
|
|
|
298 |
|
|
|
299 |
|
|
return $table; |
300 |
|
|
} |
301 |
|
|
|
302 |
|
|
/** |
303 |
|
|
* This method gets called after the FormElement data has passed the |
304 |
|
|
* validation. This enables you to validate the data against some backend |
305 |
|
|
* mechanism, say a DB. |
306 |
|
|
* |
307 |
|
|
*/ |
308 |
|
|
function form_backend_validation() { |
309 |
|
|
//$this->add_error("uh oh", "some bogus error happened"); |
310 |
|
|
//return FALSE; |
311 |
|
|
return TRUE; |
312 |
|
|
} |
313 |
|
|
|
314 |
|
|
/** |
315 |
|
|
* This method is called ONLY after ALL validation has passed. This is the |
316 |
|
|
* method that allows you to do something with the data, say insert/update |
317 |
|
|
* records in the DB. |
318 |
|
|
* |
319 |
|
|
*/ |
320 |
|
|
function form_action() { |
321 |
|
|
//$this->add_error("uh oh", "some bogus error happened"); |
322 |
|
|
//return FALSE; |
323 |
|
|
$this->set_action_message("WOO!"); |
324 |
|
|
$dump = html_xmp(); |
325 |
|
|
foreach( $this->_elements as $label => $element ) { |
326 |
|
|
$dump->add( $label." = ".print_r($element->get_value(),true) ); |
327 |
|
|
} |
328 |
|
|
|
329 |
|
|
print $dump->render(); |
330 |
|
|
exit; |
331 |
|
|
return TRUE; |
332 |
|
|
} |
333 |
|
|
} //}}} |
334 |
|
|
|
335 |
|
|
|
336 |
|
|
$page = new Form3Page("Form Example 3"); |
337 |
|
|
print $page->render(); |
338 |
|
|
|
339 |
|
|
?> |