Humanities Home page   Office of Digital Humanities
Back     BYU LiveCode Lessons Gateway

DigHT 310
Server-side LiveCode scripting
Forms and Database Assignment

For this assignment you will draw on what we have learned regarding HTML forms, GET and POST, and databases to create an on-line report creator based on your own database. Here are the parameters for this assignment:

(See this link to a partially completed example of the type of online report you will be creating in this assignment.)

Step-by-step guide

  1. Find the file called template.irev in the Templates folder on the DigHT 310 file server. Make a copy of it and save it someplace easy to get to. This template will become the framework of your three irev files. If you can't find this template file, it's just a simple html document template with a few common header tags. Add your scripting between the comments. The template looks like this:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
       <meta http-equiv="content-type" content="text/html; charset=utf-8" />
       <title>Untitled</title>
       <link type="text/css" rel="stylesheet" href="http://livecode.byu.edu/baseStyles.css" />
       
    </head>
    <body>
    <!-- Page content goes here: -->
    
    
    <!-- End of page content -->
    </body>
    </html>
    
  2. In your first page create a form for choosing which table to base the report on. Use the GET method for submitting the form.

    <p>
    Select the Report Area:
    </p>
    <form action="configreport.irev" method="get" name="choosetable">
    <p>
       <select name="choice">
       <option label="People" value="people">People</option>
       <option label="Departments" value="department">Departments</option>
       </select>
    </p>
    <p>
       <input name="Go" type="submit" />
    </p>
    
  3. Create a second irev document using the template. Make sure the name of your second document matches the action="" attribute from the form on the first page. It should also be saved in the same directory on the server.

  4. This page should give the user checkboxes to choose what they want to include in the report. The checkboxes will vary depending upon what was selected on the first page.

    Remember that a form using the GET method creates argument lists in this form:

      ?name1=value1&name2=value2, etc.

    When we worked with web services in LiveCode stacks we had to break these arg lists down ourselves. RevServer does this for us automatically. It puts the arguments into a special array variable called $_GET. So for the arg list above we would have:

      $_GET["name1"] --> contents is "value1"
      $_GET["name2"] --> contents is "value2"
  5. So by checking the $_GET array in our page two document, and using a simple if-then-else statement, we can create a customized form for each choice from page 1.

    <?rev
    set the errormode to "inline" -- this is useful for debugging
    include "scripts.irev"
    put $_GET["choice"] into tWhich
    ?>
    <p>Configure your <?rev put tWhich ?> report:</p>
    <div>
    <form method="post" action="displayreport.irev">
    <p>Include the following information:</p>
    <?rev
    if tWhich is "people" then
       # Example of building html with livecode scripting
       put "<p><input name=" & q("dept") & " type=" & q("checkbox") & " value=" & q("yes") & " />Department </p>" & return
       put "<p><input name=" & q("phone") & " type=" & q("checkbox") & " value=" & q("yes") & " />Phone Number </p>" & return
       put "<p><input name=" & q("office") & " type=" & q("checkbox") & " value=" & q("yes") & " />Office </p>" & return
    else if tWhich is "department" then
    ?>
    	<!-- Example of mixing LiveCode blocks with HTML blocks -->
       <p><input name="supervisor" type="checkbox" value="yes" />Supervisor </p>
       <p><input name="phone" type="checkbox" value="yes" />Dept. Phone Number
       <p><input name="office" type="checkbox" value="yes" />Office </p>
    <?rev 
    end if
    ?>
    <input name="choice" type="hidden" value="<?rev put tWhich ?>" />
    <p><input name="submit" type="submit" value="Create Report" />
    </form>
    </div>
    

    In this form we're using the POST method and a third irev page to process the action. (There is no particular reason for using POST here instead of GET; it's just to show that we can use either in irev documents.)

  6. Create a third irev document using the template. Make sure the name of this document matches the action="" attribute from the form on the second page. Save it in the same directory on the server as the other two pages.

  7. This page will query the database using the criteria determined on the second page and display the results. Here is the code for doing that, but without formatting the database query results:

    <?rev
    set the errormode to "inline"
    put "<p>Something here?</p>" 
    
    function q pString
       return quote & pString & quote
    end q
    
    put $_POST["choice"] into tWhich
    if tWhich is "people" then
       put $_POST["dept"] into tIncludeDept
       put $_POST["phone"] into tIncludePhone
       put $_POST["office"] into tIncludeOffice
       put "SELECT fname,lname" into tQuery
       if tIncludeDept <> empty then 
         put comma & "dept" after tQuery
       end if
       if tIncludePhone <> empty then
         put comma & "phone" after tQuery
       end if
       if tIncludeOffice <> empty then
         put comma & "office" after tQuery
       end if
    else if tWhich is "department" then
       put $_POST["supervisor"] into tIncludeSuper
       put $_POST["phone"] into tIncludePhone
       put $_POST["office"] into tIncludeOffice
       put "SELECT name" into tQuery
       if tIncludeSuper <> empty then
         put comma & "supervisor" after tQuery
       end if
       if tIncludePhone <> empty then
         put comma & "phone" after tQuery
       end if
       if tIncludeOffice <> empty then
         put comma & "office" after tQuery
       end if
    end if
    put " FROM " & tWhich after tQuery
    
    # create database connection
    put revOpenDatabase("mysql","hummac.byu.edu:33600","acmeco",\
       "chum310","livec0de") into tConnID
    put revDataFromQuery(,,tConnID,tQuery) into tReport
    revCloseDatabase tConnID
    
    put "<p>"
    put tReport -- debugging
    put "</p>"
    ?>
    
  8. The script above confirms that we're getting valid results. Now we have to format the results into a readable form. An HTML table works nicely for this purpose. Remember that HTML tables use the following tag set:

     <table cellpadding="20">
        <tr>
          <th>Header 1</th><th>Header 2</th>
       </tr>
       <tr>
          <td>Row 1 cell 1</td><td>Row 1 cell 2</td>
       </tr>
       <tr>
          <td>Row 2 cell 1</td><td>Row 2 cell 2</td>
       </tr>
    </table>
    

    You can add border='n' and cellpadding='n' attributes to the table tag to create borders around the cells and empty space around the cell contents if you wish, like this:

    <table border='1' cellpadding='4'>
    

    Here's one formatting solution. You will note that lines are added to the if-then statements to create the proper table headers. The last block of code creates the necessary table elements to frame the query results neatly.

    <?rev
    set the errormode to "inline"
    
    function q pString
       return quote & pString & quote
    end q
    
    put $_POST["choice"] into tWhich
    if tWhich is "people" then
       put $_POST["dept"] into tIncludeDept
       put $_POST["phone"] into tIncludePhone
       put $_POST["office"] into tIncludeOffice
       put "SELECT fname,lname" into tQuery
       put "<th>First name</th><th>Last name</th>" into tHeader 
       if tIncludeDept <> empty then 
         put comma & "dept" after tQuery
         put "<th>Department</th>" after tHeader  
       end if
       if tIncludePhone <> empty then
         put comma & "phone" after tQuery
         put "<th>Phone</th>" after tHeader
       end if
       if tIncludeOffice <> empty then
         put comma & "office" after tQuery
         put "<th>Office</th>" after tHeader
       end if
    else if tWhich is "department" then
       put $_POST["supervisor"] into tIncludeSuper
       put $_POST["phone"] into tIncludePhone
       put $_POST["office"] into tIncludeOffice
       put "SELECT name" into tQuery
       put "<th>Dept name</th>" into tHeader 
       if tIncludeSuper <> empty then
         put comma & "supervisor" after tQuery
         put "<th>Supervisor</th>" after tHeader
       end if
       if tIncludePhone <> empty then
         put comma & "phone" after tQuery
         put "<th>Phone</th>" after tHeader
       end if
       if tIncludeOffice <> empty then
         put comma & "office" after tQuery
         put "<th>Office</th>" after tHeader
       end if
    end if
    put " FROM " & tWhich after tQuery
    
    # create database connection
    put tQuery & "<br />" --debugging
    put revOpenDatabase("mysql","hummac.byu.edu:33600","acmeco",\
       "chum310","livec0de") into tConnID
    put revDataFromQuery(,,tConnID,tQuery) into tReport
    revCloseDatabase tConnID
    
    # create the table elements for displaying the results
    put "<table border='1' cellpadding='4'>" & return
    put "<tr>" & tHeader & "</tr>" & return
    set the itemDelimiter to tab
    repeat for each line tLine in tReport
       replace tab with "</td><td>" in tLine
       put "<tr><td>" & tLine & "</td></tr>" & return after tFormattedRept
    end repeat
    put tFormattedRept
    put "</table>"
    ?>
    
  9. Test your forms using various choices to change the final report contents. Make sure each variation is working correctly. You may also want to add explanatory text to the report page so that the user knows what the report is for.

  10. Here is a link to a partially completed example of the online report described here. You'll notice that we haven't substituted Department names for department id in the people report, nor supervisor names for person ids in the department report. Based on how we did this in the stack-based version of our report, figure out a way to do it in your own web-based report.

This asssignment is due next class period.


Back     BYU LiveCode Lessons Gateway
Maintained by Devin Asay.
Copyright © 2005 Brigham Young University