views:

119

answers:

2

Actually I have a CGI form which consists of textfields and I need a combobox in which I can enter my own data dynamically. May be it seems very silly question but I am new to cgi-perl as well as HTML so no idea what to do. Here is my form:

 #!C:\perl\bin\perl.exe

use CGI;
use CGI qw/:standard/;
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
my $q = new CGI;
use DBI;
use CGI qw(:all);
use strict;
use warnings;
print "Content-Type: text/html\n\n";
print $q->header ( );

if ( $q->param("submit") )
{
process_form ( );
}
else
{
display_form ( );
}


sub process_form
{
 if ( validate_form ( ) )
 {
  display_form ( );
  }
  }


 sub validate_form
 {
 my $User_Name = $q->param("User_Name");
 my $User_Password= $q->param("User_Password");
 my $User_Permission = $q->param("User_Permission");
 my $User_Department= join(", ",$q->param("User_Department"));
 my $error_message = "";
 $error_message .= "Please enter your name<br/>" if( !$User_Name );
 $error_message .= "Please enter your Password<br/>" if( ! $User_Password );
 $error_message .= "Please Select a permission<br/>" if( !$User_Permission );
 $error_message .= "Please select atleast 1 department<br/>" if(!$User_Department);

 if ( $error_message )
  {
    display_form ( 
   $error_message,$User_Name,$User_Password,$User_Permission,$User_Department);
    return 0;
  }
 else
 {
 my $dbh = DBI->connect("dbi:SQLite:DEVICE.db","", "",{RaiseError => 1, AutoCommit =>
  1 } );
 my $sql = "SELECT COUNT(UserName) FROM UsersList WHERE UserName='$User_Name'";
 my $sth = $dbh->prepare($sql) or die("\n\nPREPARE ERROR:\n\n$DBI::errstr");
  $sth->execute or die("\n\nQUERY ERROR:\n\n$DBI::errstr");
 my ($n) = $dbh->selectrow_array($sth);
 $sth->finish();
 if ($n > 0) {
 print "Record Already Exists";
 }
  else {
  my $sql = "INSERT INTO UsersList (UserName,Password,Permission,Department) VALUES 
  ('$User_Name ',' $User_Password','$User_Permission','$User_Department')";
   my $sth = $dbh->prepare($sql);
   $sth->execute;
  print "Record Added Successfully";
  $sth->finish();
  $dbh->commit or die $dbh->errstr;
    }
   $dbh->disconnect;
   }
   }

      sub display_form
 {
  my $error_message = shift;
 my $User_Name = shift;
  my $User_Password = shift;
 my $User_Permission= shift;
 my $User_Department= shift;

 my $User_Permission_Add_sel = $User_Permission eq "Add" ? " checked" : "";
 my $User_Permission_Edit_sel =$User_Permission eq "Edit" ? " checked" : "";
 my $User_Permission_Delete_sel =$User_Permission eq "Delete" ? " checked" : "";
 my $User_Permission_View_sel =$User_Permission eq "View" ? " checked" : "";

 my $User_Department_html = "";
 my $dbh = DBI->connect("dbi:SQLite:DEVICE.db","", "",{RaiseError => 1, AutoCommit =>
  1 } );
 my $sql = "select DepartmentName from Departments order by DepartmentName";
  my $sth = $dbh->prepare($sql);
 $sth->execute() ;

 while (my  $User_Department_option= $sth->fetchrow_array)
 {
   $User_Department_html.= "<option value=\"$User_Department_option\"";
   $User_Department_html.= " selected" if ( $User_Department_option eq
    $User_Department );
   $User_Department_html.= ">$User_Department_option</option>";
  }
  $sth->finish();
  $dbh->commit or die $dbh->errstr;
  print <<END_HTML;
  <html>
 <head><title>Form Validation</title></head>
 <body>

 <form action="AddUser.cgi" method="post">
 <input type="hidden" name="submit" value="Submit">

 <p>$error_message</p>


 <TABLE BORDER="1" align="center">
  <TR>
 <TD>Name</TD>
 <TD> <input type="text" name="User_Name" value="$User_Name"></TD>
 </TR>

  <TR>
<TD>Password</TD>
 <TD colspan="2"><input type="password" name="User_Password" value="$User_Password" 
   size="20" maxlength="15" /></TD>

  </TR>
  <TR>
 <TD>Role</TD>
 <TD>"HERE I NEED A COMBOBOX"</TD>
  </TR>

<TR>
 <TD>Permission</TD>
  <TD><input type="radio" name="User_Permission" 
   value="Add"$User_Permission_Add_sel>Add<input type="radio" name="User_Permission"
   value="Edit"$User_Permission_Edit_sel>Edit<input type="radio" 
   name="User_Permission" value="Delete"$User_Permission_Delete_sel>Delete<input
   type="radio" name="User_Permission" value="View"$User_Permission_View_sel>View</TD>
</TR>

<TR>
<TD>Department</TD>
<TD colspan="2"> <select name="User_Department" MULTIPLE
  SIZE=4>$User_Department_html</select></TD>

</TR>
</TR>
<TR>
<TD align="center" colspan="2">
<input type="submit" name="submit" value="ADD">
</TD>
 </TR>
 </TABLE
  </form>

   </body></html>
   END_HTML

 }
A: 

In place of "HERE I NEED A COMBOBOX" you have to write :

<select name='User_Department' id='User_Department'>
$User_Department_html
</select>

However, you retrieve parameters within your sub display_form but you've never passed any.

M42
Sorry, i don't know such element in html.
M42
+2  A: 

What you're looking for here isn't done on the Perl side, but on the HTML+Javascript side. As noted by others, HTML does not have a built-in combo box form element. So, you're stuck with Javascript.

Personally, I like using JQuery whenever working with Javascript. It's a Javascript library which makes manipulating web pages elements much easier.

Specific to your question, you'll want to look at http://jqueryui.com/demos/autocomplete/ (there is an actual combobox demo linked on the right, if you really, really need a combobox instead of a Google-style autocomplete text field.

Not related to the combobox, but you might also want to look at Template::Toolkit - a templating system for Perl (and others) that will allow you to take the HTML out of your perl scripts. Believe me, having the HTML embedded in CGI scripts for anything beyond the most basic usages will turn into a nightmare soon enough.

RickF