AjaxExample.pl ============================================================ #!perl use DBI qw(:sql_types); use CGI; use CGI qw/:standard/; use CGI::Ajax; my $cgi = new CGI(); #-------------------------------------------------------------------- # Mapping the Perl subroutine to the triggering function #-------------------------------------------------------------------- my $ajax = new CGI::Ajax( 'saveStudInfo_JScript' => \&saveStudInfo_PerlScript ); $cgi->header(-charset=>'US-ASCII'); print $ajax->build_html($cgi,\&generateHTML); #-------------------------------------------------------------------- # Subroutine which generates the HTML #-------------------------------------------------------------------- sub generateHTML { # Hash which contains existing data %Students = get_Student_Info(); $cnt = 1; # Write the html code in the form of a string $returnHTML .= "\n<HTML>"; $returnHTML .= "\n<HEAD>"; $returnHTML .= "\n<TITLE>Student Information</TITLE>"; $returnHTML .= "<SCRIPT language=\"javascript\" src=\"/javascript/student.js\" type=\"text/javascript\"></SCRIPT>"; $returnHTML .= "\n</HEAD>"; $returnHTML .= "\n<BODY bgColor=\"#ffffff\">"; $returnHTML .= "<FORM method=\"POST\" enctype=\"multipart/form-data\" name=\"StudentForm\">"; $returnHTML .= "\n<BR>"; $returnHTML .= "\n<BR>"; $returnHTML .= "\n<TABLE cellspacing=\"0\" cellpadding=\"0\" align=\"center\">"; $returnHTML .= "\n<TR><TD>"; $returnHTML .= "\n<TABLE width=\"100%\" align=\"center\" border=\"1\" cellpadding=\"3\" cellspacing=\"1\" id= \"StudentInfoTable\">"; $returnHTML .= "\n<TR>"; $returnHTML .= "\n<TD align=\"center\" >SL No</TD>"; $returnHTML .= "\n<TD align=\"center\" nowrap>Name </TD>"; $returnHTML .= "\n<TD align=\"center\" nowrap>Marks </TD>"; $returnHTML .= "\n<TD align=\"center\" > </TD>"; $returnHTML .= "\n</TR >"; foreach $key (sort { $a <=> $b }(keys %Students)) { #View row $returnHTML .= "\n<INPUT type=\"hidden\" name=\"SerialNo\" id=\"SerialNo_$key\" value=\"$key\">"; $returnHTML .= "\n<TR style=\"display:block\">"; $returnHTML .="\n<TD align=\"center\" >$key</TD>"; $returnHTML .="\n<TD align=\"center\" nowrap><Div id=\"Div_Name_$key\">". (($Students{$key}->{Name}) ? $Students{$key}->{Name} : " ")."</DIV></TD>"; $returnHTML .="\n<TD align=\"center\" nowrap><Div id=\"Div_Marks_$key\">". (($Students{$key}->{Name}) ? $Students{$key}->{Marks} : " ")."</DIV></TD>"; $returnHTML .= "\n<TD align=\"center\"><INPUT type=\"button\" name=\"EditButton\" value=\"Edit\" style=\"cursor: hand; width: 40px\" onClick=\"makeRowEditable($cnt,'StudentInfoTable')\"></TD>"; $returnHTML .= "\n</TR >"; #Edit row $returnHTML .= "\n<TR style=\"display:none\">"; $returnHTML .="\n<TD align=\"center\" nowrap>$key</TD>"; $returnHTML .="\n<TD align=\"center\" nowrap><INPUT type=\"text\" size=\"30\" id=\"Student_Name_$key\" value=\"$Students{$key}->{Name}\" style=\"text-align: center\"></TD>"; $returnHTML .="\n<TD align=\"center\" nowrap><INPUT type=\"text\" size=\"10\" id=\"Student_Marks_$key\" value=\"$Students{$key}->{Marks}\" style=\"text-align: center\"></TD>"; $returnHTML .= "\n<TD align=\"center\"><INPUT type=\"button\" name=\"SaveButton\" value=\"Save\" style=\"cursor: hand; width: 40px\" onClick=\"saveStudInfo_JScript(['Student_Name_$key','Student_Marks_$key','SerialNo_$key','NO_CACHE'],['Div_Name_$key','Div_Marks_$key'],'POST');makeRowViewable($cnt,'StudentInfoTable')\"></TD>"; $returnHTML .= "\n</TR >"; $cnt += 2; } $returnHTML .= "\n</TABLE>"; $returnHTML .= "\n</TD></TR>"; $returnHTML .= "\n</Table>"; } #-------------------------------------------------------------------- # Perl Subroutine which is called aschronously #-------------------------------------------------------------------- sub saveStudInfo_PerlScript { # Accept Input my $Name = shift; my $Marks = shift; my $SerialNo = shift; # Call subroutine which does database update update_Student_Info($SerialNo,$Name,$Marks); # Return Output return (@Return, ($Name ne "") ? $Name : " ",($Marks ne "") ? $Marks : " "); } #-------------------------------------------------------------------- # Subroutine which fetches the data #-------------------------------------------------------------------- sub get_Student_Info { my %Details; my ($sql, $sth, $row); # DSN with the name "mydsn" points to the Db $DB = "mydsn"; # User name and password if any need to be specified. Currently no user name and pwd set."; $DB_USER = ""; $DB_PASS= ""; $dbh = DBI->connect("dbi:ODBC:$DB", $DB_USER, $DB_PASS); $sql = "SELECT * FROM Student"; $sth = $dbh->prepare($sql); $sth->execute; $cnt = 1; while ($row = $sth->fetchrow_hashref) { $Details{$cnt++} = $row; } $sth->finish(); return %Details; } #-------------------------------------------------------------------- # Subroutine which updates the Student Table in DB #-------------------------------------------------------------------- sub update_Student_Info { my $SerialNo = shift; my $Name = shift; my $Marks = shift; my ($sql, $sth,$row); # DSN with the name "mydsn" points to the Db $DB = "mydsn"; # User name and password if any need to be specified. Currently no user name and pwd set. $DB_USER = ""; $DB_PASS= ""; $dbh = DBI->connect("dbi:ODBC:$DB", $DB_USER, $DB_PASS); $sql = "Update Student set Name = '$Name',Marks = $Marks where Sl_No = $SerialNo "; $sth = $dbh->prepare($sql); $sth->execute; $sth->finish(); return $sql; } ============================================================ student.js ============================================================ /* * Toggles the rows from EDIT mode to VIEW mode. * Invoked on clicking the 'SAVE' button in last column. */ function makeRowViewable(rowNumber,id) { var table = document.all ? document.all[id] : document.getElementById ? document.getElementById(id) : null; var editableRowNumber = rowNumber + 1 ; var nonEditableRowNumber = editableRowNumber -1 ; table.rows[editableRowNumber].style.display = "none" ; table.rows[nonEditableRowNumber].style.display = "block" ; } /* * Toggles the rows from view mode to edit mode. * Invoked on clicking the 'EDIT' button in last column. */ function makeRowEditable(rowNumber,id) { var table = document.all ? document.all[id] : document.getElementById ? document.getElementById(id) : null; var editableRowNumber = rowNumber + 1 ; var nonEditableRowNumber = editableRowNumber -1 ; table.rows[editableRowNumber].style.display = "block" ; table.rows[nonEditableRowNumber].style.display = "none" ; } ============================================================