2010-09-09 89 views
-3

其實我有一個由文本框組成的CGI表單,我需要一個組合框,我可以在其中動態輸入自己的數據。可能這似乎很愚蠢的問題,但我是新的cgi-perl以及HTML所以不知道該怎麼做。這裏是我的形式:在HTML中創建組合框

#!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 

} 
+1

你確定你需要一個組合框而不是下拉選擇嗎?大多數人混淆了這兩個,我猜你沒有REA只需要一個組合。 – 2010-09-09 13:43:23

+0

最初我想確認這是他們的任何東西就像html中的組合框?即文本字段和下拉列表的組合.......請讓我知道... – sonya 2010-09-13 05:08:02

回答

-1

在地方的"HERE I NEED A COMBOBOX"你必須寫:

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

但是,您找回您的sub display_form內的參數,但是你從來沒有通過任何。

+1

對不起,我不知道這樣的HTML元素。 – Toto 2010-09-09 13:59:58

2

你在這裏找的東西不是在Perl方面完成的,而是在HTML + Javascript方面。正如其他人所指出的,HTML沒有內置的組合框表單元素。所以,你堅持使用Javascript。

就我個人而言,我喜歡在使用Javascript時使用JQuery。這是一個Javascript庫,它使操作網頁元素變得更容易。

具體到你的問題,你會想看看http://jqueryui.com/demos/autocomplete/(有右側鏈接,如果你真的需要一個組合框,而不是一個谷歌式的自動填充文本字段的實際組合框的演示。

與組合框無關,但您可能也想看看Template :: Toolkit - 一個用於Perl(和其他)的模板系統,它可以讓您從您的Perl腳本中取出HTML。相信我,讓HTML嵌入在CGI腳本中,任何超出最基本用法的腳本都會很快變成惡夢。