Recipe 19.10 Creating Sticky Widgets

19.10.1 Problem

You want form fields to default to the last values submitted. For instance, you want a search form like Google ( where the keywords you searched for appear in the search dialog above the results.

19.10.2 Solution

Use's HTML shortcuts to create your form, which automatically provides previous values as defaults:

print textfield("SEARCH");          # previous SEARCH value is the default

19.10.3 Discussion

Example 19-8 is a simple script for producing the list of users currently logged in.

Example 19-8. who.cgi
  #!/usr/bin/perl -wT
  # who.cgi - run who(1) on a user and format the results nicely
  use CGI qw(:standard);
  # print search form
  print header( ), start_html("Query Users"), h1("Search");
  print start_form( ), p("Which user?", textfield("WHO")); submit( ), end_form( );
  # print results of the query if we have someone to look for
  $name = param("WHO");
  if ($name) {
      print h1("Results");
      $html = '';
      # call who and build up text of response
      foreach (`who`) {
          next unless /^$name\s/o;            # only lines matching $name
          s/&/&/g;                        # escape HTML
          $html .= $_;
      # nice message if we didn't find anyone by that name
      $html = $html || "$name is not logged in";
      print pre($html);
  print end_html( );

The call to textfield generates HTML for a text entry field whose parameter name is WHO. After printing the form, we check whether we were called with a value for the WHO parameter. If so, we try to find lines in the output from who for that user.

19.10.4 See Also

The documentation for the standard CGI module; Recipe 19.4; Recipe 19.6