# User-friendly html.pl # Short/Long Display version # # Save this file as -- html.pl -- and use it instead of the script by the same name # that comes with the DBMan archive. Be sure to read the notes that accompany the # script which follow the copyright information. # # ---------------------- # DBMan # ---------------------- # Database Administrator # # File: html.pl # Description: This file contains all the HTML that the program generates. # Author: Alex Krohn # Email: alex@gossamer-threads.com # Web: http://www.gossamer-threads.com/ # Version: 2.04 # # COPYRIGHT NOTICE: # # Copyright 1997 Gossamer Threads Inc. All Rights Reserved. # # This program is being distributed as shareware. It may be used and # modified free of charge for personal, academic, government or non-profit # use, so long as this copyright notice and the header above remain intact. # Any commercial use should be registered. Please also send me an email, # and let me know where you are using this script. By using this program # you agree to indemnify Gossamer Threads Inc. from any liability. # # Selling the code for this program without prior written consent is # expressly forbidden. Obtain permission before redistributing this # program over the Internet or in any other medium. In all cases # copyright and header must remain intact. # # Please check the README file for full details on registration. # ===================================================================== # # # Notes on the "user-friendly html.pl": # # Look closely at the sections marked "HTML Globals," and "Page Layout" to # set up your database to appear the way you would like it to. # You can also edit the "Record Layout" section to create your own forms and # page displays. # In each of the rest of the subroutines, you will have several variables you can set # to your liking: # $page_title # $submit_button -- only on pages with forms -- the text of the submit button # $reset_button -- only on pages with forms -- the text of the reset button # Also, the form definitions have been moved a little so it is easier to know what you # can and cannot edit. To clarify things even more, each subroutine has the area where # you can enter any text you want to for that page. Enter or edit your own text between # # <-- Start page text --> # print qq| # and # |; # # <-- End page text --> # # If you have more than one DBMan database on your site and you would like to have all # the pages coordinate, you can cut the "HTML Globals" and "Page Layout" sections from # each of your html.pl scripts and place the sections in a separate file. Name the file # format.pl # and upload it into the same directory as the other DBMan scripts. Set the permissions # to 644 [-rw-r--r--]. Uncomment (that is, delete the # at the beginning of the line) # the next line in each of your html.pl scripts. # require $db_script_path . "/format.pl"; ########################################################## ## HTML Globals ## ########################################################## # Put any globals you like in here for your html pages. $html_title = 'Database Manager Demo'; # Add your email address. Be sure to leave the \ before the @ $admin_email = "you\@server.com"; # Set your font preferences below # $face = 'font face=Verdana, Arial, Helvetica'; # font face for pages $font = "$face size=2"; # size of normal text $font_color = "$font color=#003399"; # an alternate color font for html_record $font_title = "$face size=4"; # size of title text $error_color = 'font color=red'; # color of error messages $font_error = "$face size=4 color=red"; # large font for error messages ########################################################## ## Page Layout ## ########################################################## sub html_page_top { # -------------------------------------------------------- # This is where you define what all of your web pages will look like. # You can change the background color, add a background image (be sure to use the # complete URL to your background image and not a relative URL), define the color of # normal text and links -- all just as you would do with a regular html page. # Be sure to leave in the first line -- &html_print_headers -- and to put your html # formatting between "print qq|" and "|;" &html_print_headers; print qq| $html_title: $page_title
"; # do not remove this! It is necessary to make the records display properly } sub html_record_long { #---------------------------------------------------------------- my (%rec) = @_; if ($db_total_hits > 1) { # create links to previous and next records $next_url = $ENV{'QUERY_STRING'}; $next_url =~ s/\&nh=\d+//; $next_hit = $nh + 1; $prev_hit = $nh - 1; if ($prev_hit) { $previous = qq~<$font>Previous~; } else { $previous = " "; } if ($next_hit <= $db_total_hits) { $next = qq~<$font>Next~; } else { $next = " "; } # create link back to short display $list_url = $next_url; $list_url =~ s/\&mh=\d+//; $mh = $db_max_hits; $lh = int(($nh-1)/$mh) + 1; $list = qq~<$font>Back to record list~; # print out the links print qq|
$html_title: $page_title

<$font_title>$page_title

|; } sub html_error_page_top { # -------------------------------------------------------- # This subroutine should be almost identical to the previous one. The only difference # is that there are error messages included with the title and the title is in whatever # you have set your $error_color variable to be. &html_print_headers; print qq| $html_title: Error! $page_title
$html_title: Error: $page_title

<$font_title>Error: <$error_color>$page_title

|; } sub html_page_bottom { # -------------------------------------------------------- # Here is where you finish off your web pages. If you have not paid for the script, # be sure to leave the Gossamer Threads logo in place. # The second "print qq" statement is where you end off any tables or other formatting # that you started in the "page_top" subroutines. It makes it easier to see what # to do if you maintain the indenting of lines. print qq|
<$font>Copyright 1998 Gossamer Threads Inc. Database Powered by Gossamer Threads Inc.
|; print qq|
|; } sub html_print_headers { # -------------------------------------------------------- # Print out the headers if they haven't already been printed. if (!$html_headers_printed) { print "Content-type: text/html\n\n"; $html_headers_printed = 1; } } sub html_footer { # -------------------------------------------------------- # Print the menu. # # We only print options that the user have permissions for. # print qq!

<$font>!; print qq!| Home !; print qq!| Add ! if ($per_add); print qq!| View ! if ($per_view); print qq!| Delete ! if ($per_del); print qq!| Modify ! if ($per_mod); print qq!| List All ! if ($per_view); print qq!| Admin ! if ($per_admin); print qq!| Log Off ! unless (($db_userid eq "default") || ($db_userid eq "")); print qq!|

!; } sub html_search_options { # -------------------------------------------------------- # Search options to be displayed at the bottom of search forms. # print qq~

<$font>Search Options:
Match Any Match Case Whole Words Reg. Expression
Keyword Search (will match against all fields)
Return records in a list or one record at a time. Sort By: Sort Order:

Search Tips:
    - use '*' to match everything in a field)
    - put a '>' or '<' at the beginning to to do range searches.
~; } ########################################################## ## Record Layout ## ########################################################## sub html_record_form { # -------------------------------------------------------- # The form fields that will be displayed each time a record is # edited (including searching). You don't want to put the #

and
tags for each field. # The values to be displayed are in %rec and should be incorporated # into your form. You can use &build_select_field, &build_checkbox_field # and &build_radio_field to generate the respective input boxes. Text and # Textarea inputs can be inserted as is. If you turn on form auto # generation, the program will build the forms for you (all though they may # not be as nice). See the README for more info. my (%rec) = @_; ($db_auto_generate and print &build_html_record_form(%rec) and return); print qq|
<$font_color>ID:  
<$font_color>Title:  
<$font_color>URL:  
<$font_color>Type:  |; print &build_select_field ("Type", "$rec{'Type'}"); print qq|
<$font_color>Date:  
<$font_color>Category:  |; print &build_select_field ("Category", "$rec{'Category'}"); print qq|
<$font_color>Description:  
<$font_color>Validated:  |; print &build_radio_field ("Validated", "$rec{'Validated'}"); print qq|
<$font_color>Popular:  |; print &build_checkbox_field ("Popular", "$rec{'Popular'}"); print qq|
|; } sub html_record { # -------------------------------------------------------- # How a record will be displayed. This is used primarily in # returning search results and how it is formatted. The record to # be displayed will be in the %rec hash. # This is the "short display" -- the list of records that are returned # from a search. my (%rec) = @_; # create link to full display $record_number = ((($nh - 1) * $db_max_hits) + $i); $long_url = $ENV{'QUERY_STRING'}; $long_url =~ s/\&nh=\d+//; $long_url =~ s/\&mh=\d+//; $long_url = "$db_script_url?$long_url&nh=$record_number&mh=1"; print "
"; # do not remove this! It is necessary to make the records display properly # Below is where you define what you want to appear for each record in the "short" display. # You can make this whatever you want, and display as many fields as you would like. # Choose which of the fields you would like for users to click on to reach the full display # of records and use that field name in place of "Title" below. # # Be sure that you use for the link to your full record display. # <-- Start of short display formatting -- > print qq| $rec{'Title'} |; # <-- End of short display formatting -- > print "
$previous $next
$list
<$font>Record $nh of $db_total_hits
|; } # Below is where you define your form. # <-- Start of record display --> my $font_color = 'Font face="Verdana, Arial, Helvetica" Size=2 Color=#003399'; print qq|
<$font_color>ID:  <$font>$rec{'ID'}
<$font_color>Title:  <$font>$rec{'Title'}
<$font_color>URL:  <$font>$rec{'URL'}
<$font_color>Type:  <$font>$rec{'Type'}
<$font_color>Date:  <$font>$rec{'Date'}
<$font_color>Category:  <$font>$rec{'Category'}
<$font_color>Description:  <$font>$rec{'Description'}
<$font_color>Validated:  <$font>$rec{'Validated'}
<$font_color>Popular:  <$font>$rec{'Popular'}
|; # <-- End of record display --> } ########################################################## ## Home Page ## ########################################################## sub html_home { # -------------------------------------------------------- # The database manager home page. $page_title = "Main Menu"; &html_page_top; # < -- Start page text -- > print qq| <$face size="1"> Permissions: |; print " View " if ($per_view); print " Add " if ($per_add); print " Delete " if ($per_del); print " Modify " if ($per_mod); print " Admin " if ($per_admin); print " None " if (!($per_view || $per_add || $per_del || per_mod)); print qq|

<$font> This database has been set up so any user can view any other users information, but you can only modify and delete your own records. If you have admin access, you can of course do anything you like.

Enjoy! and let me know if you have any comments!

|; # < -- End page text --> &html_footer; &html_page_bottom; } ########################################################## ## Adding ## ########################################################## sub html_add_form { # -------------------------------------------------------- # The add form page where the user fills out all the details # on the new record he would like to add. You should use # &html_record_form to print out the form as it makes # updating much easier. Feel free to edit &get_defaults # to change the default values. $page_title = "Add a New Record"; &html_page_top; $submit_button = "Add Record"; $reset_button = "Reset Form"; # < -- Start page text -- > print qq| |; # < -- End page text --> print qq|
|; &html_record_form (&get_defaults); print qq|

 

|; &html_footer; &html_page_bottom; } sub html_add_success { # -------------------------------------------------------- # The page that is returned upon a successful addition to # the database. You should use &get_record and &html_record # to verify that the record was inserted properly and to make # updating easier. $page_title = "Record Added"; &html_page_top; # < -- Start page text -- > print qq|

<$font>The following record was successfully added to the database: |; # < -- End page text --> &html_record_long(&get_record($in{$db_key})); &html_footer; &html_page_bottom; } sub html_add_failure { # -------------------------------------------------------- # The page that is returned if the addition failed. An error message # is passed in explaining what happened in $message and the form is # reprinted out saving the input (by passing in %in to html_record_form). my ($message) = $_[0]; $page_title = "Unable to Add Record"; &html_error_page_top; $submit_button = "Add Record"; $reset_button = "Reset Form"; # < -- Start page text -- > print qq| <$font>There were problems with the following fields: $message

Please fix any errors and submit the record again.

|; # < -- End page text --> print qq|
|; &html_record_form (%in); print qq|

 

|; &html_footer; &html_page_bottom; } ########################################################## ## Viewing ## ########################################################## sub html_view_search { # -------------------------------------------------------- # This page is displayed when a user requests to search the # database for viewing. # Note: all searches must use GET method. # $page_title= "Search the Database"; &html_page_top; $submit_button = "View Records"; $reset_button = "Reset Form"; # < -- Start page text -- > print qq| |; # < -- End page text --> print qq|
|; &html_record_form(); &html_search_options; print qq|

 

|; &html_footer; &html_page_bottom; } sub html_view_success { # -------------------------------------------------------- # This page displays the results of a successful search. # You can use the following variables when displaying your # results: # # $numhits - the number of hits in this batch of results. # $maxhits - the max number of hits displayed. # $db_total_hits - the total number of hits. # $db_next_hits - html for displaying the next set of results. # my (@hits) = @_; my ($numhits) = ($#hits+1) / ($#db_cols+1); my ($maxhits); $in{'mh'} ? ($maxhits = $in{'mh'}) : ($maxhits = $db_max_hits); $in{'nh'} ? ($nh = $in{'nh'}) : ($nh = 1); $page_title = "Search Results"; &html_page_top; # Go through each hit and convert the array to hash and send to # html_record for printing. if (($db_total_hits == 1) || ($maxhits == 1)) { &html_record_long(&array_to_hash(0, @hits)); } else { print qq|

<$font>Your search returned $db_total_hits matches.|; if ($db_next_hits) { print "
<$font>Pages: $db_next_hits"; } $i = 1; print ""; for (0 .. $numhits - 1) { print ""; &html_record (&array_to_hash($_, @hits)); print ""; ++$i; } print "
"; if ($db_next_hits) { print "
<$font>Pages: $db_next_hits";} } &html_footer; &html_page_bottom; } sub html_view_failure { # -------------------------------------------------------- # The search for viewing failed. The reason is stored in $message # and a new search form is printed out. my ($message) = $_[0]; $page_title = "Search Failed"; &html_page_top; $submit_button = "View Records"; $reset_button = "Reset Form"; # < -- Start page text -- > print qq| <$font>

There were problems with the search. Reason: <$error_color>$message
Please fix any errors and submit the record again.

|; # < -- End page text --> print qq|
|; &html_record_form(%in); &html_search_options; print qq|

 

|; &html_footer; &html_page_bottom; } ########################################################## ## Deleting ## ########################################################## sub html_delete_search { # -------------------------------------------------------- # The page is displayed when a user wants to delete records. First # the user has to search the database to pick which records to delete. # That's handled by this form. $page_title = "Search the Database for Deletion"; &html_page_top; $submit_button = "Search"; $reset_button = "Reset Form"; # < -- Start page text -- > print qq| <$font>

Search the database for the records you wish to delete or list all:

|; # < -- End page text --> print qq|
|; &html_record_form(); &html_search_options; print qq|

 

|; &html_footer; &html_page_bottom; } sub html_delete_form { # -------------------------------------------------------- # The user has searched the database for deletion and must now # pick which records to delete from the records returned. This page # should produce a checkbox with name=ID value=delete for each record. # We have to do a little work to convert the array @hits that contains # the search results to a hash for printing. my ($status, @hits) = &query("mod"); my ($numhits) = ($#hits+1) / ($#db_cols+1); my ($maxhits); $in{'mh'} ? ($maxhits = $in{'mh'}) : ($maxhits = $db_max_hits); $in{'nh'} ? ($nh = $in{'nh'}) : ($nh = 1); my (%tmp); $page_title = "Delete Record(s)"; &html_page_top; $submit_button = "Delete Checked Record(s)"; $reset_button = "Reset Form"; if ($status ne "ok") { # There was an error searching! print qq|

<$font_error>Error: $status

|; } else { print qq|
|; # Go through each hit and convert the array to hash and send to # html_record for printing. Also add a checkbox with name=key and value=delete. if (($db_total_hits == 1) || ($maxhits == 1)) { print qq|

<$font> If you would like to delete this record, check the box and then press "Delete Records":|; %tmp = &array_to_hash(0, @hits); print qq|
|; &html_record_long(&array_to_hash(0, @hits)); print qq|
|; } else { print qq|

<$font> Check which records you wish to delete and then press "Delete Records":
Your search returned $db_total_hits matches. |; if ($db_next_hits) { print "
<$font>Pages: $db_next_hits"; } $i = 1; print ""; for (0 .. $numhits - 1) { %tmp = &array_to_hash($_, @hits); print qq||; &html_record (%tmp); print ""; ++$i; } print "
"; if ($db_next_hits) { print "
<$font>Pages: $db_next_hits"; } } print qq|

 

|; } &html_footer; &html_page_bottom; } sub html_delete_success { # -------------------------------------------------------- # This page let's the user know that the records were successfully # deleted. my $message = shift; $page_title = "Record(s) Deleted"; &html_page_top; # < -- Start page text -- > print qq| <$font>The following records were deleted from the database: '$message'.

|; # < -- End page text --> &html_footer; &html_page_bottom; } sub html_delete_failure { # -------------------------------------------------------- # This page let's the user know that some/all of the records were # not deleted (because they were not found in the database). # $errstr contains a list of records not deleted. my ($errstr) = $_[0]; $page_title = "Record(s) Not Deleted"; &html_error_page_top; # < -- Start page text -- > print qq| <$font>The records with the following keys were not found in the database: <$error_color>'$errstr'.

|; # < -- End page text --> &html_footer; &html_page_bottom; } ########################################################## ## Modifying ## ########################################################## sub html_modify_search { # -------------------------------------------------------- # The page is displayed when a user wants to modify a record. First # the user has to search the database to pick which record to modify. # That's handled by this form. $page_title = "Search the Database for Modifying"; &html_page_top; $submit_button = "Search"; $reset_button = "Reset Form"; # < -- Start page text -- > print qq| <$font>

Search the database for the records you wish to modify or list all:

|; # < -- End page text --> print qq|
|; &html_record_form(); &html_search_options; print qq|

 

|; &html_footer; &html_page_bottom; } sub html_modify_form { # -------------------------------------------------------- # The user has searched the database for modification and must now # pick which record to modify from the records returned. This page # should produce a radio button with name=modify value=ID for each record. # We have to do a little work to convert the array @hits that contains # the search results to a hash for printing. my (%tmp); my ($status, @hits) = &query("mod"); my ($numhits) = ($#hits+1) / ($#db_cols+1); if (($numhits == 1) and !$in{'nh'}) { $in{'modify'} = $hits[$db_key_pos]; &html_modify_form_record(); return; } my ($maxhits); $in{'mh'} ? ($maxhits = $in{'mh'}) : ($maxhits = $db_max_hits); $in{'nh'} ? ($nh = $in{'nh'}) : ($nh = 1); $page_title = "Modify Record"; &html_page_top; $submit_button = "Modify Record"; $reset_button = "Reset Form"; if ($status ne "ok") { # Error searching database! print qq|

<$font_error>Error: $status|; } else { print qq|

|; # Go through each hit and convert the array to hash and send to # html_record for printing. Also add a radio button with name=modify # and value=key. if (($db_total_hits == 1) || ($maxhits == 1)) { print qq|

<$font> If you would like to modify this record, select the button and then press "Modify Record": |; %tmp = &array_to_hash(0, @hits); print qq||; &html_record_long(&array_to_hash(0, @hits)); } else { print qq|

<$font> Check which record you wish to modify and then press "Modify Records":
Your search returned $db_total_hits matches. |; if ($db_next_hits) { print "
<$font>Pages: $db_next_hits"; } $i = 1; print ""; for (0 .. $numhits - 1) { %tmp = &array_to_hash($_, @hits); print qq||; &html_record (%tmp); print ""; ++$i; } print "
"; if ($db_next_hits) { print "
<$font>Pages: $db_next_hits"; } } print qq|

 

|; } &html_footer; &html_page_bottom; } sub html_modify_form_record { # -------------------------------------------------------- # The user has picked a record to modify and it should appear # filled in here stored in %rec. If we can't find the record, # the user is sent to modify_failure. my (%rec) = &get_record($in{'modify'}); if (!%rec) { &html_modify_failure("unable to find record/no record specified: $in{'modify'}"); return; } $page_title = "Modify a Record"; &html_page_top; $submit_button = "Modify Record"; $reset_button = "Reset Form"; # < -- Start page text -- > print qq| |; # < -- End page text --> print qq|
|; &html_record_form (%rec); print qq|

 

|; &html_footer; &html_page_bottom; } sub html_modify_success { # -------------------------------------------------------- # The user has successfully modified a record, and this page will # display the modified record as a confirmation. $page_title = "Record Modified"; &html_page_top; # < -- Start page text -- > print qq| <$font>The following record was successfully modified:

|; # < -- End page text --> &html_record_long(&get_record($in{$db_key})); &html_footer; &html_page_bottom; } sub html_modify_failure { # -------------------------------------------------------- # There was an error modifying the record. $message contains # the reason why. my ($message) = $_[0]; $page_title = "Unable to Modify Record"; &html_error_page_top; $submit_button = "Modify Record"; $reset_button = "Reset Form"; # < -- Start page text -- > print qq| <$font>There were problems modifying the record: <$error_color>$message
Please fix any errors and submit the record again.

|; # < -- End page text --> print qq|
|; &html_record_form (%in); print qq|

 

|; &html_footer; &html_page_bottom; } ########################################################## ## Authentication ## ########################################################## sub html_login_form { # -------------------------------------------------------- # The login screen. $page_title = "Login"; &html_page_top; $submit_button = "Logon"; $reset_button = "Cancel"; # < -- Start page text -- > print qq| <$font>Welcome! You need to have an active account to access $html_title. For the demo, you can use userid/passwords: 'admin/admin', 'author/author', 'guest/guest'.

|; # < -- End page text --> print qq|

<$font_color>User ID:
<$font_color>Password:

 

|; if ($auth_signup) { print qq|You can sign up for an account online right here.|; } if ($auth_lookup) { print qq| <$font>If you have forgotten your user name or password, you can have it emailed to you. |; } &html_page_bottom; } sub html_login_failure { # -------------------------------------------------------- # There was an error loggin in. The error message is stored in $message. my ($message) = $_[0]; $page_title = "Login Error"; &html_page_top; $submit_button = "Logon"; $reset_button = "Cancel"; # < -- Start page text -- > print qq| <$font>Oops, there was a problem logging into the system: <$error_color>$message.

Please try logging in again, or contact the system administrator. |; # < -- End page text --> print qq|

<$font_color>User ID:
<$font_color>Password:

 

|; if ($auth_lookup) { print qq| <$font>If you have forgotten your user name or password, you can have it emailed to you. |; } if ($auth_signup) { print qq|You can sign up for an account online right here.|; } &html_page_bottom; } sub html_admin_display { # -------------------------------------------------------- # The displays the list of current users. my ($message, $user_list, $password, $permissions) = @_; $page_title = "User Management"; &html_page_top; $submit_button = "Update/Create User"; # < -- Start page text -- > print qq|

<$font><$error_color>$message

|; # < -- End page text --> print qq|
<$font>User List: $user_list
<$font>New Username:
<$font>Change Password:
<$font>Permissions:
$permissions

|; &html_footer; &html_page_bottom; } sub html_unauth { # -------------------------------------------------------- # A user tried to do something he was not authorized for. $page_title = "Unauthorized Action"; &html_error_page_top; # < -- Start page text -- > print qq| <$font>The database program received a command that you are not authorized for. |; # < -- End page text --> &html_footer; &html_page_bottom; } sub html_signup_form { # -------------------------------------------------------- # This form is displayed for new users who want to create an account. # my $error = shift; $page_title = "Create Account"; &html_page_top; $submit_button = "Create"; $reset_button = "Cancel"; # < -- Start page text -- > print qq| <$font>To create your own account, simply enter in your desired username and password.

|; # < -- End page text --> if ($error) { print "$error

"; } print qq|
<$font_color>User ID:
<$font_color>Password:

 

|; &html_page_bottom; } sub html_signup_success { # -------------------------------------------------------- # The user has successfully created a new account. $page_title = "Account Created"; &html_page_top; $submit_button = "Logon"; $reset_button = "Cancel"; # < -- Start page text -- > print qq| <$font>Your account has been set up! Use your username and password to log in. |; # < -- End page text --> print qq|

<$font_color>User ID:
<$font_color>Password:

 

|; &html_page_bottom; } ########################################################## ## Misc ## ########################################################## sub html_unkown_action { # -------------------------------------------------------- # The program received a command it did not recognize. $page_title = "Unknown Action"; &html_error_page_top; # < -- Start page text -- > print qq| <$font>The database program received a command that it did not understand.

|; # < -- End page text --> &html_footer; &html_page_bottom; } 1;