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!