Versione 1.22
NOTA: Queste istruzioni sono "personalizzate" per il sito www.poli.studenti.to.it, per cui il programma è stato sviluppato. Nella versione distribuita in questo archivio sono disabilitati tutti i controlli sulla posizione dei file, che possono essere collocati in qualsiasi posizione.
L'inserimento di un modulo richiede normalmente la stesura e l'installazione sul server di un programma personalizzato che ne riceva i dati e li elabori. Poichè tuttavia la realizzazione di un simile programma richiede discrete conoscenze di programmazione nonchè l'accesso interattivo al server, questa strada non è generalmente percorribile per voi.
Il vostro beneamato webmaster ha quindi preparato un processore di moduli che permette di leggere il contenuto di un generico modulo e di compiere alcune operazioni predefinite, come spedirne il contenuto per posta elettronica o memorizzarlo in un file. Apparentemente il suo funzionamento può sembrare complicato, ma lo è molto meno che se doveste scrivere voi a mano il programma per trattare la form: vi invito quindi ad utilizzarlo e anche a farmi avere i vostri commenti in merito. Alla fine di queste istruzioni troverete comunque alcuni esempi per rendere più chiaro l'uso del programma.
Esempi:
1. Form per inviare commenti
2. Questionario
3. Guestbook
Il processore di moduli viene richiamato inserendo come ACTION della form il percorso /cgi-bin/formproc.cgi; il metodo (attributo METHOD) può essere uno qualsiasi tra POST e GET, a vostra scelta. Quando l'utente premerà il pulsante di "submit" della form, il processore verrà richiamato ed eseguirà le operazioni che voi richiederete di fare.
Le operazioni compiute dal programma sono le seguenti:
Per prima cosa, al vostro modulo deve essere associato un file di configurazione, a cui potete dare un nome qualsiasi, ma che deve essere memorizzato da qualche parte nella vostra home directory o nelle sue sottodirectory, al di fuori della zona visibile via WWW (directory HTML: questo per motivi di sicurezza). Il nome del file di configurazione deve essere specificato in un apposito campo della form denominato config: a questo scopo, inserite nel vostro modulo l'istruzione HTML seguente:
<INPUT TYPE="hidden" NAME="config" VALUE="percorso_del_file">
Questo creerà un campo invisibile, che gli utenti non vedranno, e servirà a fornire al processore il nome del file di configurazione. Il percorso deve essere specificato in modo assoluto, ossia deve cominciare dalla radice del sito e arrivare fino al file; ricordate che la vostra home directory corrisponde al percorso /utenti/sXXXXX/, per cui ad esempio se il vostro file si chiama form.cfg e si trova in una sottodirectory chiamata moduli nella vostra home directory, il percorso è /utenti/sXXXXX/moduli/form.cfg. Non dimenticate la barra iniziale!
Il file di configurazione è un normale file di testo ASCII, che contiene istruzioni (una per riga) che devono seguire il seguente schema:
$param{'nome_parametro'} = 'valore_parametro';
In questo modo potrete assegnare un valore a vari parametri che determinano il comportamento del programma. E' obbligatorio assegnare un valore almeno ai primi due parametri. Ecco l'elenco:
Nome parametro | Valore da assegnare |
---|---|
azione | Stabilisce quale azione compiere con il contenuto della form: i valori possibili sono spedisci, per inviarlo per posta elettronica, scrivi, per memorizzarlo in un file cancellando i risultati dell'invio precedente, appendi, per aggiungerlo alla fine di un file in cui vengono memorizzati tutti i dati inviati, e inserisci, per inserirlo in una posizione predefinita all'interno di un file in cui vengono memorizzati tutti i dati inviati. |
schema | Specifica il percorso del file di schema (vedi sotto) in cui verranno inseriti i valori del modulo e su cui sarà poi compiuta l'azione specificata. |
file | Nel caso delle azioni scrivi, appendi e inserisci, specifica il percorso completo del file in cui vengono memorizzati i risultati. |
output | Specifica il percorso del file HTML da spedire all'utente dopo aver elaborato il modulo. Se non specificato, il programma spedisce una pagina standard. |
marcatore | Nel caso dell'azione inserisci, indica una stringa che segnala al programma il punto in cui devono essere inseriti i dati, e che deve stare da sola su una riga e non comparire da alcuna altra parte nel file. Se il file di destinazione è un file HTML, è opportuno utilizzare come marcatore un commento HTML, ad esempio <!-- INSERISCI QUI -->. |
posizione | Nel caso dell'azione inserisci, stabilisce se i nuovi dati devono essere inseriti prima o dopo di quelli inviati in precedenza; i valori possibili sono prima e dopo (il valore di default, in assenza di indicazioni, è dopo, con cui i dati più recenti vengono inseriti dopo quelli più vecchi). |
Nel file di configurazione, in caso di necessità, è possibile inserire righe vuote oppure righe di commento; queste ultime devono iniziare con il carattere #.
Ad esempio, ecco un possibile file di configurazione:
$param{'azione'} = 'spedisci'; # supponiamo che il login dell'utente sia s76786 $param{'schema'} = '/utenti/s76786/HTML/schema.txt'; # il file seguente sarà spedito al browser del visitatore $param{'output'} = '/utenti/s76786/HTML/risposta.htm';
I percorsi dei file vanno specificati con le stesse regole di quello del file di configurazione; il file di output e il file di schema (ma non il file di memorizzazione) possono trovarsi anche nella zona della vostra area visibile dal WWW.
Gli attributi del file di memorizzazione devono permettere la scrittura a tutti; dovrete probabilmente modificarli a mano o, in alternativa, utilizzare per tale file una directory aperta in scrittura a tutti. Dopo che il file sarà stato trattato dal server WWW, i suoi privilegi saranno modificati e la sua proprietà passerà all'utente nobody. Se volete utilizzare l'azione inserisci, anche la directory in cui è posto il file di memorizzazione dovrà essere aperta in scrittura a tutti! Se tutto sembra funzionare correttamente, ma i nuovi dati non vengono inseriti nel vostro file, questa è probabilmente la causa del problema.
Il file di schema è un normale file di testo ASCII, al cui interno potete però inserire delle "variabili" contenenti i valori forniti dall'utente, e racchiuse tra segni di percentuale (%). Ad esempio, supponiamo che nel vostro modulo ci sia un campo denominato commenti, generato con l'istruzione seguente:
<INPUT TYPE="text" NAME="commenti">
Quando lo schema verrà letto, una eventuale variabile %commenti% sarà sostituita dal valore inserito dall'utente in quel campo del modulo. Potrete così ad esempio usare lo schema
L'utente ha inserito questi commenti: %commenti%
e, se ad esempio l'utente ha inserito nel campo commenti del modulo la frase Mi piacciono molto le tue pagine., nel file che sarà memorizzato sull'hard disk comparirà:
L'utente ha inserito questi commenti: Mi piacciono molto le tue pagine.
Se l'azione da voi selezionata è spedisci, lo schema dovrà iniziare con le righe di intestazione To: e Subject: tipiche degli e-mail: ad esempio:
To: n.cognome@studenti.to.it Subject: Messaggio automatico generato dalla form L'utente ha inserito questi commenti: %commenti%
In questo modo potete stabilire a quale indirizzo spedire il risultato del modulo e il subject del messaggio; potete inserire nello schema anche altre righe di intestazione (ad esempio una riga From:). Non dimenticate la riga vuota dopo le righe di intestazione del messaggio.
Esistono comunque alcune restrizioni dovute a motivi di sicurezza. In particolare, non è possibile inserire delle variabili contemporaneamente nei campi From: e To:; almeno uno dei due deve essere fisso e determinato nello schema. Difatti, qualche utente particolarmente ingenuo aveva preparato un modulo di questo tipo, che è stato puntualmente utilizzato per spedire messaggi anonimi di dubbio gusto a mezzo mondo. Comunque, oltre alle vostre righe di intestazione, il programma inserirà tre righe proprie, che segnalano che l'invio è avvenuto tramite il processore di moduli e contengono le informazioni necessarie per risalire al modulo da cui è stato generato il messaggio (e quindi all'utente che lo ha realizzato).
Una nota particolare riguarda i campi di tipo checkbox: in questo caso, se voi inserite più campi con lo stesso nome otterrete come risultato tutti i valori selezionati separati dal segno +. Ad esempio, se nel vostro modulo compare:
Quali di queste nazioni hai visitato?<P> <INPUT TYPE="checkbox" NAME="nazioni" VALUE="Francia"> La Francia<BR> <INPUT TYPE="checkbox" NAME="nazioni" VALUE="Spagna"> La Spagna<BR> <INPUT TYPE="checkbox" NAME="nazioni" VALUE="Germania"> La Germania<BR>
e l'utente barra le caselle relative a Francia e Germania, la variabile %nazioni% varrà Francia+Germania. Tuttavia, potreste voler vedere nel risultato se l'utente ha barrato una determinata casella: questo si può ottenere, ad esempio in questo caso, con la variabile %nazioni=Francia%, che varrà 1 se la casella della Francia è stata barrata, altrimenti corrisponderà a una stringa vuota. Questo tipo di notazione è particolarmente utile se volete preparare uno schema da leggere successivamente con un programma tipo Excel, per elaborare statistiche sulle varie risposte (vedi esempi al fondo).
Sono infine disponibili alcune variabili particolari: %data% e %ora% contengono data e ora in cui il modulo è stato spedito, mentre %args% vi mostra la stringa originaria che il server ha generato alla spedizione del modulo (solo per i più curiosi...)
Inoltre, sono ora disponibili altre variabili legate all'interfaccia CGI, e precisamente:
%CGI_IP% | Indirizzo IP del visitatore che ha compilato il modulo |
%CGI_host% | Nome dell'host (se disponibile) del visitatore che ha compilato il modulo |
%CGI_browser% | Browser usato dal visitatore che ha compilato il modulo |
%CGI_referer% | Indirizzo della pagina da cui è stato richiamato il modulo |
A seconda dell'azione selezionata, dopo aver sostituito le variabili con i loro valori, il risultato viene salvato nel file specificato o spedito per posta elettronica.
L'ultima fase è la spedizione del file di output: questo file è un documento HTML che viene letto e inviato al browser dell'utente. Anche in questo file è possibile inserire le variabili sopra citate, che verranno sostituite dai valori. Ad esempio:
<HTML><BODY> Grazie per avermi detto che: <B>%commenti%</B> </BODY></HTML>
E' possibile far compiere ad ogni invio della form più di una azione. Ciò si ottiene "concatenando" tra loro più file di configurazione, ognuno dei quali descrive una azione da compiere; all'interno di ogni file di configurazione è possibile specificare un successivo file di configurazione da leggere e processare assegnando un valore al parametro config, esattamente come se si trattasse del campo config della form. Ad esempio, inserendo in un file di configurazione l'assegnazione
$param{'config'} = '/utenti/sXXXXX/moduli/form2.cfg';
il programma, dopo aver eseguito l'azione descritta nel file di configurazione che sta venendo elaborato, leggerà il file /utenti/sXXXXX/moduli/form2.cfg ed eseguirà l'azione in esso descritta. Tutti i parametri a cui, nel secondo file di configurazione, non sarà esplicitamente assegnato un valore manterranno il valore assegnato nel file di configurazione precedente, ad eccezione ovviamente di config per evitare loop infiniti. Verrà comunque inviata all'utente una sola pagina di output, corrispondente all'ultimo valore assegnato al parametro output.
Il programma cerca di intercettare i possibili errori e di spedire dei messaggi d'errore comprensibili, ad esempio indicando il file o la riga della configurazione che non sono corretti. Vi invito a leggere con attenzione questi messaggi, spero che siano abbastanza chiari...
Se comunque continuate ad avere problemi, è disponibile una modalità di log (in collaborazione con il webmaster): se inserite nel vostro primo file di configurazione
$param{'log'} = '1';
i vari passi compiuti dal processore saranno memorizzati in un log a disposizione del webmaster. Prima di contattare il webmaster per problemi, quindi, attivate il log (e soprattutto, pensate bene e fate molti tentativi... il webmaster svolge questo lavoro a titolo volontario e non ha il tempo di fornire assistenza "banale" a 1500 utenti).
Un'ultima nota: tutti i file in oggetto (configurazione, schema, output, dati...) sono normali file di testo ASCII (usate ad esempio il Blocco Note per realizzarli) e devono essere trasferiti da e per il server usando la modalità ASCII dell'FTP.
Spero che il sistema vi piaccia!
Per prima cosa, ecco un possibile modulo da inserire in una pagina HTML:
<FORM METHOD="POST" ACTION="/cgi-bin/formproc.cgi"> Inserisci i tuoi commenti:<P> <TEXTAREA NAME="commenti" COLS=60 ROWS=10> Queste pagine mi piacciono molto! </TEXTAREA><P> Se vuoi, puoi darmi il tuo nome: <INPUT TYPE="text" SIZE=30 NAME="nome"><BR> e il tuo indirizzo di e-mail: <INPUT TYPE="text" SIZE=30 NAME="indirizzo"><BR> <INPUT TYPE="submit" VALUE="Invia"> <INPUT TYPE="hidden" NAME="config" VALUE="/utenti/s76786/form/commenti.cfg"> </FORM>
In questo modulo, abbiamo specificato come file di configurazione il file /utenti/s76786/form/commenti.cfg: useremo in generale una sottodirectory chiamata form nella home directory per memorizzare questi file. Dopo aver realizzato il modulo, possiamo quindi realizzare il file di configurazione: ad esempio:
$param{'azione'} = 'spedisci'; $param{'schema'} = '/utenti/s76786/form/commenti.txt'; $param{'output'} = '/utenti/s76786/HTML/risposta.htm';
Lo schema specificato per la generazione del messaggio, da memorizzare nel file /utenti/s76786/form/commenti.txt, potrebbe essere:
From: %indirizzo% To: s76786@studenti.to.it Subject: Commenti alle pagine Il giorno %data% alle %ora%, %nome% <%indirizzo%> ha scritto: %commenti%
Questo è lo schema del messaggio di posta elettronica che sarà generato; grazie alla riga From:, il messaggio sembrerà provenire direttamente dal vostro visitatore.
Infine, è necessario realizzare il file /utenti/s76786/HTML/risposta.htm, che contiene la risposta da inviare all'utente: potrebbe essere ad esempio:
<HTML> <BODY> I tuoi commenti erano:<P> %commenti%<P> Erano proprio stupidi!! </BODY> </HTML>
E' anche ammesso scrivere come risposta qualcosa di più gentile.
Supponiamo che un visitatore compili il modulo alle 10:15 del 30 agosto 1997, inserendo come nome Pinco Pallino, come indirizzo pinco@spit.it e come commenti Le tue pagine sono bellissime.. Quando egli invierà il modulo, verrà spedito un messaggio di posta elettronica all'indirizzo s76786@studenti.to.it, con mittente pinco@spit.it e subject Commenti alle pagine, contenente il seguente testo:
Il giorno 30/8/97 alle 10:15, Pinco Pallino <pinco@spit.it> ha scritto: Le tue pagine sono bellissime.
Cominciamo a realizzare il modulo:
Il file di configurazione /utenti/s76786/form/question.cfg potrebbe essere:
L'azione selezionata è appendi, in modo da inserire tutte le risposte l'una dopo l'altra nello stesso file, che potrà poi essere letto tutto in una volta.
Un tipico schema adatto al nostro scopo sarà:
Il tutto sta su una sola riga, ed è terminato da un Invio alla fine, in modo che ad ogni serie di risposte corrisponda una riga nel file. I vari "campi" (quelli che diventeranno una cella nel foglio elettronico) sono separati da punto e virgola; le ultime cinque colonne diranno, per ciascun corso, se l'utente ha barrato quella particolare casella, e faranno comparire in tal caso un 1 nella cella.
E' necessario preparare il file di dati /utenti/s76786/form/question.dat, in cui saranno salvate le risposte: è necessario che tale file esista e sia aperto in scrittura a tutti, per cui conviene che prepariate un file ASCII vuoto (o contenente, ad esempio, soltanto un Invio), lo copiate in quella posizione, e lo apriate in scrittura a tutti.
Dopo un po', il file conterrà qualcosa del tipo:
A tutti e due piaceva Analisi I... bah, che gusti... Al primo piacevano anche Fisica I e Fondamenti, mentre al secondo (che non ha inserito la matricola) Geometria e Chimica.
E ora... preparate i vostri sondaggi...
Il primo file di configurazione, indicato dal campo config della form, potrebbe allora essere:
e lo schema per la mail, nel file /utenti/s76786/HTML/schema.mail.txt:
Il secondo file di configurazione potrebbe invece essere:
Il file /utenti/s76786/HTML/schema.html conterrà il blocco di HTML che deve essere inserito nel guestbook ad ogni invio della form, come ad esempio:
Nel file di destinazione, invece, occorre predisporre tutto affinchè l'inserimento possa avvenire; in particolare, il file deve essere aperto in scrittura a tutti, e deve contenere il marcatore indicato; anche la directory in cui è posto il file deve essere aperta in scrittura a tutti. Ad esempio:
Ogni volta che qualcuno invierà la form, nel punto indicato dal marcatore saranno inseriti i dati forniti dall'utente, formattati secondo lo schema indicato. A seconda del valore del parametro posizione, i dati forniti saranno ordinati in modo che i più recenti si trovino in basso (come in questo caso, dove non si è indicato nulla) o in alto (assegnando al parametro il valore prima).
2. Questionario
Sempre lo stesso utente vuole realizzare un mini-questionario agli studenti; per ognuno, chiederà il numero di matricola, l'anno di iscrizione, e quindi quali tra i corsi del primo anno gli sono piaciuti. Le risposte saranno memorizzate, l'una dietro l'altra, in un file, che verrà poi elaborato con un database o un foglio elettronico, ad esempio Microsoft Excel. L'obiettivo è quello di avere in ogni riga del foglio elettronico le risposte di ogni studente, e in ogni colonna le risposte alla stessa domanda.
<FORM METHOD="POST" ACTION="/cgi-bin/formproc.cgi">
Numero di matricola: <INPUT TYPE="text" NAME="matricola"><P>
Anno di iscrizione:
<INPUT TYPE="radio" NAME="anno" VALUE="1">I
<INPUT TYPE="radio" NAME="anno" VALUE="2">II
<INPUT TYPE="radio" NAME="anno" VALUE="3">III
<INPUT TYPE="radio" NAME="anno" VALUE="4">IV
<INPUT TYPE="radio" NAME="anno" VALUE="5">V
<P>
Quali tra questi corsi ti sono piaciuti?<P>
<INPUT TYPE="checkbox" NAME="corsi" VALUE="Analisi I">Analisi I<BR>
<INPUT TYPE="checkbox" NAME="corsi" VALUE="Chimica">Chimica<BR>
<INPUT TYPE="checkbox" NAME="corsi" VALUE="Fisica I">Fisica I<BR>
<INPUT TYPE="checkbox" NAME="corsi" VALUE="Fondamenti">Fondamenti di Inf.<BR>
<INPUT TYPE="checkbox" NAME="corsi" VALUE="Geometria">Geometria
<P>
<INPUT TYPE="submit" VALUE="Invia"> <INPUT TYPE="reset" VALUE="Pulisci">
<INPUT TYPE="hidden" NAME="config" VALUE="/utenti/s76786/form/question.cfg">
</FORM>
$param{'azione'} = 'appendi';
$param{'schema'} = '/utenti/s76786/form/question.txt';
$param{'file'} = '/utenti/s76786/form/question.dat';
$param{'output'} = '/utenti/s76786/HTML/grazie.htm';
%data%;%ora%;%matricola%;%anno%;%corsi=Analisi I%;%corsi=Chimica%;%corsi=Fisica I%;%corsi=Fondamenti%;%corsi=Geometria%
30/8/97;10:15;72243;3;1;;1;1;
30/8/97;15:03;;2;1;1;;;1
Visto così sembra un insieme di caratteri senza significato, ma aprendo il file con Excel (come file di testo, specificando ; come separatore) otterrete un foglio con le seguenti celle:
-------+-----+-----+-+-+-+-+-+-+-
30/8/97|10:15|72243|3|1| |1|1| |
-------+-----+-----+-+-+-+-+-+-+-
30/8/97|15:03| |2|1|1| | |1|
-------+-----+-----+-+-+-+-+-+-+-
3. Guestbook
L'utente vuole realizzare un guestbook, costituito da una pagina HTML in cui vengono inseriti i commenti inviati dall'utente; vuole inoltre che i commenti gli siano inviati anche per E-mail. Supponiamo che egli abbia inserito nella form un campo denominato nome, contenente il nome del visitatore, e un campo denominato commenti, contenente i commenti. Dovendo effettuare due azioni, sarà necessario usare due file di configurazione; scegliamo ad esempio di far spedire il risultato dal primo file e di far aggiornare la pagina HTML dal secondo.
$param{'azione'} = 'spedisci';
# supponiamo che il login dell'utente sia s76786
$param{'schema'} = '/utenti/s76786/HTML/schema.mail.txt';
# va specificato il secondo file di configurazione
$param{'config'} = '/utenti/s76786/form/guest2.cfg';
From: %indirizzo%
To: s76786@studenti.to.it
Subject: Inserimento nel guestbook
Il giorno %data% alle %ora%, %nome% ha scritto che: %commenti%
$param{'azione'} = 'inserisci';
# supponiamo che il login dell'utente sia s76786
$param{'schema'} = '/utenti/s76786/HTML/schema.html';
# questo e' il file in cui saranno inseriti i dati
$param{'file'} = '/utenti/s76786/HTML/guestbook.htm';
# va indicato il marcatore
$param{'marcatore'} = '<!-- INSERISCI QUI -->';
# il file seguente sarà spedito al browser del visitatore
$param{'output'} = '/utenti/s76786/HTML/guest-risposta.htm';
<SMALL><I>Il giorno %data% alle ore %ora%, il signor %nome% ha scritto:</I></SMALL><BR>
<B>%commenti%</B>
<HR>
<HTML><HEAD>
<TITLE>I miei visitatori</TITLE>
</HEAD>
<BODY>
Questi sono i commenti dei miei visitatori:<P>
<!-- INSERISCI QUI -->
Grazie per aver partecipato!
</BODY></HTML>
Versioni del processore
1/9/1997: Versione 1.0.
12/11/1997: Versione 1.1. Aggiunta la modalità "inserisci" e la possibilità di avere più file di configurazione in catena.
13/5/1998: Versione 1.2. Aggiunte le variabili CGI e la modalità di log.
15/9/1998: Versione 1.21. Aggiunto il controllo di sicurezza per bloccare mail con entrambi i campi From: e To: variabili, e gli header automatici X-* nei messaggi.
(C) 1997 Vittorio Bertola - webmaster@studenti.to.it