Il logo di batmath
www.batmath.it

Invio dei risultati dei test tramite formmail, senza script CGI

Una delle opzioni importanti previste da HotPotatoes (dalla versione 5 in poi) è quella di consentire l'invio dei risultati dei test tramite mail. Normalmente questa funzionalità richiede l'uso di script CGI o simili, da collocare sul server. Se però il vostro server ha previsto un servizio formmail, si può evitare tutta questa trafila con una semplice modifica del codice dei template dei programmi. 

In quello che segue facciamo riferimento all'applicazione formmail, gratuitamente messa a disposizione da Digiland, semplicemente perché è quella che usiamo e che conosciamo meglio. Ci riferiamo inoltre al sorgente di JBC versione 5.4, che si trova nella cartella source di HotPotatoes, con il nome JBC5.ht_ Per gli altri programmi la procedura è simile. Queste modifiche possono essere facilmente estese anche alle successive versioni di JBC.

Il codice da modificare è quello contenuto tra le righe 124 e 144 comprese (lo chiameremo Sezione A), e tra le righe 760 e 776 comprese (lo chiameremo Sezione B).

In sostanza la Sezione A prepara il codice per una pagina html che viene poi scritta effettivamente dalla Sezione B, che provvede anche ad inviare la form secondo il metodo previsto. Poiché tutti i campi previsti nella sezione A sono "hidden", a video non si vedrà nulla.

Codice originale (le righe sono state numerate solo per riferimento, la numerazione non deve comparire nel template):

Sezione A

01 - [inclSendResults]
02 - var UserName = '';
03 - var StartTime = (new Date()).toLocaleString();
04 - 
05 - var ResultForm = '<html><body><form name="Results" action="[strFormMailURL]" method="post" enctype="x-www-form-encoded">';
06 - ResultForm += '<input type="hidden" name="recipient" value="[strEMail]"></input>';
07 - ResultForm += '<input type="hidden" name="subject" value="[strExerciseTitle]"></input>';
08 - ResultForm += '<input type="hidden" name="Exercise" value="[strExerciseTitle]"></input>';
09 - ResultForm += '<input type="hidden" name="realname" value=""></input>';
10 - ResultForm += '<input type="hidden" name="Score" value=""></input>';
11 - ResultForm += '<input type="hidden" name="Start_Time" value=""></input>';
12 - ResultForm += '<input type="hidden" name="End_Time" value=""></input>';
13 - ResultForm += '<input type="hidden" name="title" value="Thanks!"></input>';
14 - [inclPageBGColor]
15 - ResultForm += '<input type="hidden" name="bgcolor" value="[strPageBGColor]"></input>';
16 - [/inclPageBGColor]
17 - 
18 - ResultForm += '<input type="hidden" name="text_color" value="[strTitleColor]"></input>';
19 - ResultForm += '<input type="hidden" name="sort" value="order:realname,Exercise,Score,Start_Time,End_Time"></input>';
20 - ResultForm += '</form></body></html>';
21 - [/inclSendResults]

Sezione B

01 - [inclSendResults]
02 - function SendResults(Score){
03 - var today = new Date;
04 - var NewName = '' + today.getTime();
05 - var NewWin = window.open('Submission', NewName, 'toolbar=no,location=no,directories=no,status=no, menubar=no,scrollbars=yes,resizable=no,,width=400,height=300');
06 - 
07 - NewWin.document.clear();
08 - NewWin.document.open();
09 - NewWin.document.write(ResultForm);
10 - NewWin.document.close();
11 - NewWin.document.Results.Score.value = Score + '%';
12 - NewWin.document.Results.realname.value = UserName;
13 - NewWin.document.Results.End_Time.value = (new Date()).toLocaleString();
14 - NewWin.document.Results.Start_Time.value = StartTime;
15 - NewWin.document.Results.submit();
16 - }
17 - [/inclSendResults]

Le modifiche da apportare sono estremamente semplici e si limitano ad adeguare questa parte di codice alle specifiche richieste dell'applicazione formmail di Digiland. Le esaminiamo in dettaglio:

Attenzione a non inserire interruzioni di riga non previsti.

Codice modificato

Sezione A

[inclSendResults]
var UserName = '';
var StartTime = (new Date()).toLocaleString();

var ResultForm = '<html><body><form name="Results" action="[strFormMailURL]" method="post">';
ResultForm += '<input type="hidden" name="username" value="StringaGenerica1"></input>';
ResultForm += '<input type="hidden" name="oggetto" value="StringaGenerica2 "></input>';
ResultForm += '<input type="hidden" name="pagrisposta" value="StringaGenerica3 "></input>';
ResultForm += '<input type="hidden" name="Exercise" value="[strExerciseTitle]"></input>';
ResultForm += '<input type="hidden" name="realname" value=""></input>';
ResultForm += '<input type="hidden" name="Score" value=""></input>';
ResultForm += '<input type="hidden" name="Start_Time" value=""></input>';
ResultForm += '<input type="hidden" name="End_Time" value=""></input>';
[inclPageBGColor]
[/inclPageBGColor]

ResultForm += '</form></body></html>';
[/inclSendResults]

Sezione B

[inclSendResults]
function SendResults(Score){
var today = new Date;
var NewName = '' + today.getTime();
var NewWin = window.open('Submission', NewName, 'toolbar=no,location=no,directories=no,status=no, menubar=no,scrollbars=yes,resizable=no,,width=400,height=300');

NewWin.document.clear();
NewWin.document.open();
NewWin.document.write(ResultForm);
NewWin.document.close();
NewWin.document.Results.oggetto.value += UserName;
NewWin.document.Results.Score.value = Score + '%';
NewWin.document.Results.realname.value = UserName;
NewWin.document.Results.End_Time.value = (new Date()).toLocaleString();
NewWin.document.Results.Start_Time.value = StartTime;
NewWin.document.Results.submit();
}
[/inclSendResults]

Ci scusiamo con gli esperti se siamo stati un po' prolissi nella spiegazione, ma con Javascript, come con tutti i linguaggi di programmazione, non si può scherzare!.

Sono possibili moltissime altre personalizzazioni, tra cui, per esempio, il cambio dei nomi di alcune hiddenbox della form di invio dati, ma non si tratta di modifiche indispensabili. Se non siete assolutamente sicuri non fate altre modifiche: questo codice deve rispettare contemporaneamente le richieste del compilatore di JBC e quelle dell'applicazione formmail di Digiland.

Un ultimo consiglio: prima di procedere alla modifica fatevi una copia del file JBC5.ht_. Anche se una copia è già presente nella cartella srcbackup, è sempre meglio non rischiare!

A questo punto non vi resta che lanciare JBC come al solito, e nella scheda CGI di configurazione dell'esercizio inserire come indirizzo dello script CGI formmail quello di Digiland: http://digiland.iol.it/servlet/formmail. Potete lasciare in bianco l'indirizzo e-mail a cui inviare (Digiland manda automaticamente la mail all'indirizzo che avete indicato all'atto di adesione al servizio formmail).

Buon lavoro!

pagina pubblicata il 21/04/2002 - ultimo aggiornamento il 01/09/2003