| 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 |
?> |