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