$numArray = array( “1”=>”ichii”, “2”=>”nii”, “3”=>”san”, “4”=>”shi” ); $s->select(“options”, $numArray); $s->h3(“make form elements inside a table!”); $myArray = array( array($s->gTag(“b”,”name”), $s->gTextbox(“name”)), array($s->gAddText(“address”), $s->gTextbox(“address”)), array($s->gAddText(“phone”), $s->gTextbox(“phone”)), array($s->gAddText(“favorite number”), $s->gSelect(“number”, $numArray)) ); $s->buildTable($myArray); $s->submit(); $s->addText(“</form> \n”); $s->h3(“results from previous form (if any)”); $s->formResults(); $s->buildBottom(); print $s->getPage(); ?> Building a Simple Form and Adding a Text Box The following code snippet builds the most basic SuperHTML form: $s->addText(“<form>”); $s->textbox(“userName”, “Joe”); $s->submit(); $s->addText(“</form>”); I used the addText() method to provide the basic form tags and then created a textbox and submit button using the SuperHTML object’s special methods. 243 C h a p t e r 7 W r i t i n g P r o g r a m s w i t h O b j e c t s You might be surprised that I don’t have special methods to begin and end the form. They would be easy, but I felt they wouldn’t simplify things much, so I just used the addText() method to add form tags. (Of course you are free to add these methods yourself if you wish. The SuperHTML project is designed as a framework only, and I’m eager to see people add new functionality to it.) The textbox() method can take one or two parameters. The first parameter is the name of the resulting <input> element. The second (optional) parameter is the ele- ment’s default value. If you do not specify a value, it is left blank. Of course, the submit button resolves to almost the same kind of HTML code, and it works very much like the textbox. However, if you leave off the submit method’s second parameter, your HTML code will show the typical Submit Query caption. Building Drop-Down Menus There are a number of times you’ll want the user to choose input from a limited number of options. Often, the value you want to send to the next program isn’t exactly what the user sees. The appropriate HTML device for this situation is the <select> element with a bunch of <option> objects inside. If you try to map the select and option combination to a PHP structure, the most obvious comparison is an associative array as you used in chapter 5, “Better Arrays and String Handling.” Take a look at the following code fragment to see how this works. $numArray = array( “1”=>”ichii”, “2”=>”nii”, “3”=>”san”, “4”=>”shi” ); $s->select(“options”, $numArray); I created an associative array using numbers as indices and the Japanese names for the numerals as the values. Once I had created the array, it was easy to create a select object with the cleverly named select() method. The two parameters are the name of the resulting select object and the array. This code produces the following HTML: <select name = “options” > <option value = “1”>ichii</option> <option value = “2”>nii</option> HINT 244 P H P 5 /M y S Q L P r o g r a m m i n g f o r t h e A b s o l u t e B e g i n n e r <option value = “3”>san</option> <option value = “4”>shi</option> </select> Building Form Elements Inside a Table It’s important to have professional-looking documents. Most programmers place all form elements inside a table. The SuperHTML object makes this relatively easy to do, using the buildTable() method described previously in this chapter. How- ever, there’s one new twist. Take a look at the code and see if you can spot it. $myArray = array( array($s->gTag(“b”,”name”), $s->gTextbox(“name”)), array(“address”, $s->gTextbox(“address”)), array(“phone”, $s->gTextbox(“phone”)), array(“favorite number”, $s->gSelect(“number”, $numArray)) ); $s->buildTable($myArray); The $myArray variable is a big array that controls the eventual table. Each row con- sists of two columns. The first column is a label specifying the type of data being collected; the second column is some sort of form element. Here’s the twist: Although the methods used inside the array look familiar, every single one is new! Recall that all the methods for building a page in SuperHTML work by adding content directly to some variable in memory. This is done to make the program more flexible, so it can be used both to print a result and save it to a file. When I’m building the array, I don’t want to actually add anything to the HTML document. Instead, I want to receive the results of the function so I can add it to my array. I then add the entire array to the page using the buildTable() method. Most SuperHTML methods have a get variant, preceded with g. For example, recall that $s->tag(“b”,“name”) produces the code <b>name</b> and immediately adds that code to the internal HTML document. The g variant of the same command (following) produces exactly the same code but does not add it to the internal representation: $s->gTag(“b”, “name”); Instead, it returns the value so you can do whatever you want with it. In this case, I simply want to add the code to my table as a pseudo-heading. (In fact I could do any kind of HTML here, including Cascading Style Sheets magic to get exactly the look I want.) 245 C h a p t e r 7 W r i t i n g P r o g r a m s w i t h O b j e c t s All other elements in the table are either plain text (the other labels) or other calls to get versions of methods in the SuperHTML object. After describing all the information in a two-dimension array, it’s very easy to add it to the internal doc- ument using the buildTable() method. Although it may seem tedious to build a two-dimension array, consider the com- plexity of the output that is produced by this function: <table border = 1> <tr> <td><b> name </b> </td> <td><input type = “text” name = “name” value = “” /> </td> </tr> <tr> <td>address</td> <td><input type = “text” name = “address” value = “” /> </td> </tr> <tr> <td>phone</td> <td><input type = “text” name = “phone” value = “” /> </td> </tr> <tr> <td>favorite number</td> <td><select name = “number” > <option value = “1”>ichii</option> <option value = “2”>nii</option> <option value = “3”>san</option> <option value = “4”>shi</option> </select> </td> 246 P H P 5 /M y S Q L P r o g r a m m i n g f o r t h e A b s o l u t e B e g i n n e r </tr> </table> I think the version written with SuperHTML is quite a bit easier to understand and maintain. I like that most of the details are hidden away in the object definition. Viewing Form Results Usually when I build a PHP page that responds to a form, I begin by retrieving the names and values of all the fields that come from the form. This is useful because often I make mistakes in my field names or forget exactly what I’m expecting the form to send. It would be nice to have a really easy way to do this. Of course, SuperHTML has this feature built in. If you fill in the form elements in Forms.php and click the submit button, you get another version of Forms.php, but this one also includes form data, as shown in Figure 7.7. The code that produces these results is quite simple: $s->formResults(); If there was no previous form, formResults() returns an empty string. If the page has been called from a form, the resulting code looks something like this: <table border = “1”> <tr> <td>userName</td> 247 C h a p t e r 7 W r i t i n g P r o g r a m s w i t h O b j e c t s FIGURE 7.7 After submitting Forms.php, the second call to Forms.php returns a table of field names and values. . this feature built in. If you fill in the form elements in Forms .php and click the submit button, you get another version of Forms .php, but this one also includes form data, as shown in Figure 7.7. The. W r i t i n g P r o g r a m s w i t h O b j e c t s FIGURE 7.7 After submitting Forms .php, the second call to Forms .php returns a table of field names and values. . save it to a file. When I’m building the array, I don’t want to actually add anything to the HTML document. Instead, I want to receive the results of the function so I can add it to my array. I