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:
enctype="x-www-form-encoded", compreso lo spazio bianco davanti a
enctype.username nella prima di queste due righe, per consentire al codice di
distinguere questo nome dalla variabile UserName.UserName esattamente con le
maiuscole e minuscole indicate.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]
StringaGenerica1 dovete mettere il vostro nickname di Digiland.
Attenzione a non mettere alcuno spazio bianco tra le virgolette.StringaGenerica2 dovete mettere una stringa che serva a farvi
capire l'oggetto della mail. Noi usiamo "Esercitazione di: ". Questa
stringa sarà poi dinamicamente completata, dalla nuova riga inserita nella sezione B, con il
nome di chi risolve l'esercizio. E' una opzione estremamente utile perché Digiland
la inserisce come oggetto della mail che ricevete.StringaGenerica3 , se decidete di far comparire una pagina di
greetings, dovete mettere l'indirizzo web completo (cioè del tipo
http://...) di questa pagina. 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!