Array e form: come usarli al meglio

di Luca Milan, in ASP - Basi,

Generalmente quando si parla di array si fa riferimento ad un argomento specifico della programmazione classica, ma nel nostro caso studieremo il loro utilizzo all'interno della pagine ASP.

Possiamo considerare un array come una "megavariabile", capace di contenere al suo interno un nemero definito di valori, al contrario delle variabili scalari le quali sono associate in modo univoco ad un solo valore. Gli array sono quindi dei contenitori multidimensionali capaci di contenere un gran volume di informazioni, pronte e disponibili in ogni momento. Essendo indicizzati gli array necessitano di cicli for..next per l'estrazione delle informazioni in essi stipati.

Chi produce siti web a livello professionale si è sicuramente scontrato con form con un elevato numero di controlli, pensiamo ad esempi a form di contatto o registrazione che possono avere anche oltre 20-25 controlli al loro interno.
Gestire 20-25 controlli (text, radio, checkbox, select, ecc..) ed i valori ad essi associati non è del tutto semplice soprattuto quando diventa necessario applicare routine di validazione server/side più o meno complesse sui singoli campi del form e magari in seguito spedire il contenuto del form ad un database o ad un component come CDONTS per spedire un email.

Poniamo il caso che il nostro cliente compili un form di questa complessità, fatto questo invii il form ad una pagina ASP che processa i campi del form, li valida e in caso di errore ri-posta i valori al form iniziale per la correzione degli stessi.
Tornando al form iniziale il cliente troverebbe il messaggio di errore, ma, purtroppo, anche i campi vuoti là dove le risposte erano corrette. Al poveretto non rimane che ricompilare il form daccapo e con pazienza rinviare il tutto.
Per evitare cose di questo genere provate a dare una occhiata allo scripts ASP qui sotto.

Per comodità ho disegnato due pagine ASP, la prima contiene una utile Funzione in VBS che si occupa di recuperare i valori contenuti nell'array che abbiamo definito nella testata della stessa pagina, ed inoltre il codice HTML del form vero e proprio che dobbiamo compilare.
Analizzando nel dettaglio il codice vediamo che se l'array non è pieno, cioè nel caso in cui accediamo per la prima volta alla pagina del form, i campi del form si presenteranno vuoti e quindi dovranno essere compilati dall'utente.
Una volta compilato, l'utente invia il contenuto del form alla seconda pagina ASP, la quale contiene il codice ASP per riempire l'arrayform con i valori dei controlli.
Qui viene ridimensionato e riempito (attraverso un ciclo for..next) un array bidimensionale contenente le coppie "nome del controllo / valore del controllo della form", i suddetti valori si ottengono svuotando il Request.Form del suo contenuto attraverso un ciclo for..next.
Una volta fatto questo ridimensiono l'array alle giuste dimensioni, e ne metto il contenuto in una session variable per poterlo passare da una pagina ASP all'altra.
Nell'ultima parte di codice della seconda pagina possiamo vedere a video il contenuto dell'array appena creato e ridimensionato.
La cosa si fa nteressante se premiamo il tasto back del nostro browser, difatti ci apparirà il nostro form ma con i campi riempiti dai valori precedentemente immessi. Proviamo a cambiare alcuni valori e rinviamo il form, ripetiamo l'operazione di prima (tasto back) e vedremo il form con i nuovi valori.

Quale utilità?

A prima vista forse non si capisce bene la comodità nell'utilizzo dell'array per la gestione dei form, ma vediamo qualche dettaglio:

  • L'utente non deve più riscrivere tutti i campi in caso di errore, molto comodo per form con 10-20 o più controlli
  • Se utilizziamo una routine di validazione server/side sui valori dell'array possiamo creare dei sistemi molto sofisticati per posizionare l'utente sui campi errati.
  • Si scrive codice più ordinato e leggibile, con un elevato grado di riutilizzo, grazie alle function in VBS.
  • L'utilizzo di variabili session permette di rendere disponibile i valori dell'array lungo tutta la sessione de browser, ma questo è argomento di questo articolo.

Prima Pagina ASP

 &ltHTML&gt
&lt%

'recupero il nome della pagina corrente
NomePagina = Request.ServerVariables("SCRIPT_NAME")
NomePagina = Mid(NomePagina, InstrRev(NomePagina, "/") + 1)
'recupero l'array dalla variabile session, se esiste ovviamente...
arrayForm = Session(NomePagina) 
 Function RecuperaValArray(NomeControlloForm, ValoreAssociato)
   On Error Resume Next
  'cerco il numero di valori contenuti nell'array
    intValoreArry = UBound(arrayForm, 2)
  'se la funzione Ubound() non mi genera errori
   If Err.Number &lt&gt 0 Then Exit Function 
  'comincio a leggere l'array per 
  'recuperare i valori dei controlli della precedente sessione
   For intLoop = 0 To intValoreArry
  'guardo se il nome del controllo è presente nell'array
   If LCase(arrayForm(0, intLoop)) = LCase(NomeControlloForm) Then 
  'se c'è valuto la possibilità che il valore ad esso
    'associato sia quello di una checkbox o un bottone di opzione, ad esempio
   If ValoreAssociato &lt&gt "" Then
    'se è così setto il valore appropriato
     If LCase(ValoreAssociato) = LCase(arrayForm(1, intLoop)) Then
      RecuperaValArray = "CHECKED"
     Else
      RecuperaValArray = ""
     End If 
   Else
    'se invece il valore è una stringa
      RecuperaValArray = arrayForm(1, intLoop)
   End If
     Exit Function  
   End If
   Next
 End Function

%&gt
&ltHEAD&gt
&ltTITLE&gtForm per per la dimostrazione dell'uso degli array&lt/TITLE&gt
&lt/HEAD&gt
&ltBODY&gt&ltFONT  SIZE="2"&gt

&ltFORM ACTION="array1.asp" METHOD="POST"&gt


TuoNome: &ltINPUT TYPE="TEXT" NAME="TuoNome"       VALUE="&lt% = RecuperaValArray("TuoNome", "") %&gt"&gt &ltBR&gt
TuoCognome:  &ltINPUT TYPE="TEXT" NAME="TuoCognome"      VALUE="&lt% = RecuperaValArray("TuoCognome", "") %&gt"&gt &ltP&gt
Cosa ti piace mangiare ? 
&ltINPUT TYPE="CHECKBOX" NAME="Pastasciutta" &lt% = RecuperaValArray("Pastasciutta", "on") %&gt&gt Pastasciutta  
&ltINPUT TYPE="CHECKBOX" NAME="Lasagne" &lt% = RecuperaValArray("Lasagne", "on") %&gt&gt Lasagne  
&ltINPUT TYPE="CHECKBOX" NAME="Brodino" &lt% = RecuperaValArray("Brodino", "on") %&gt&gt Brodino
&ltP&gt 

CantantiPreferiti: &ltINPUT TYPE="TEXT" NAME="CantantiPreferiti"      VALUE="&lt% = RecuperaValArray("CantantiPreferiti(1)", "") %&gt"&gt &ltBR&gt
CantantiPreferiti: &ltINPUT TYPE="TEXT" NAME="CantantiPreferiti"     VALUE="&lt% = RecuperaValArray("CantantiPreferiti(2)", "") %&gt"&gt &ltBR&gt
CantantiPreferiti: &ltINPUT TYPE="TEXT" NAME="CantantiPreferiti"     VALUE="&lt% = RecuperaValArray("CantantiPreferiti(3)", "") %&gt"&gt &ltP&gt

Vivo in:

&ltINPUT TYPE="RADIO" NAME="Paese" VALUE="Italia" &lt% = RecuperaValArray("Paese", "Italia") %&gt&gt Italia  
&ltINPUT TYPE="RADIO" NAME="Paese" VALUE="Europa" &lt% = RecuperaValArray("Paese", "Europa") %&gt&gt Europa  
&ltINPUT TYPE="RADIO" NAME="Paese" VALUE="altrove" &lt% = RecuperaValArray("Paese", "altrove") %&gt&gt altrove   &ltP&gt
&ltINPUT TYPE="SUBMIT" VALUE="Submit"&gt  
&ltINPUT TYPE="RESET" VALUE="Reset"&gt  

&lt/FORM&gt&lt/FONT&gt
&lt/BODY&gt
&lt/HTML&gt

Seconda Pagina ASP

 &ltHTML&gt
&ltHEAD&gt
&ltTITLE&gtImmagazzinare i valori di un Form in un Array&lt/TITLE&gt
&lt/HEAD&gt
&ltBODY&gt

&lt%
'creiamo un array bidimensionale, un po abbondante visto
' che non conosco il numero di controlli del form
ReDim arrayForm(1, 255)
intIndice = 0
'andiamo a "loppare" Request.Form per ricevere tutte le informazioni contenute

For Each varItem in Request.Form
  If Request.Form(varItem).count &gt 1 Then
  'se il numero di controlli del form e maggiore di uno
  For intLoop = 1 to Request.Form(varItem).count 
  'immagazzino nell'array le coppie nome-controllo/valore-controllo
  arrayForm(0, intIndice) = varItem & "(" & intLoop & ")"
  arrayForm(1, intIndice) = Request.Form(varItem)(intLoop)
  intIndice = intIndice + 1
  Next
  Else 
  'nel caso sia presente un singolo valore nell'oggetto Request.Form invece:
  arrayForm(0, intIndice) = varItem
  arrayForm(1, intIndice) = Request.Form(varItem)
  intIndice = intIndice + 1
  End If
Next

'ridimensiono l'array alle giuste dimensioni, dato che ora
' conosco il numero di controlli del form
ReDim Preserve arrayForm(1, intIndice - 1)

'Ricevo il nome dalla variabile session 
'attraverso questo script
NomePaginaPrec = Request.ServerVariables("HTTP_REFERER")
NomePaginaPrec = Mid(NomePaginaPrec, InstrRev(NomePaginaPrec, "/") + 1)

'salvo l'array nella Sessione
Session(NomePaginaPrec) = arrayForm

Response.Write "&ltBR&gt&lth2&gt---- Valori Ricevuti dal Form ed immagazzinati dall'Array----&lt/h2&gt&ltBR&gt"
'MOSTRO A VIDEO IL CONTENUTO DELL'ARRAY
For intIndice = 0 To UBound(arrayForm, 2)
  Response.Write arrayForm(0, intIndice) & " = " _
     & arrayForm(1, intIndice) & "&ltBR&gt"
Next

%&gt
&lt/BODY&gt
&lt/HTML&gt

Questi sono solo alcuni dei vantaggi ottenibili dall'uso degli array, in seguito scrivero altri articoli per mostrare la validazione applicata alle form con array, la gestione dei valori del form all'interno di un database e la creazione via CDONTS di un report email personalizzato che sfrutti i valori contenuti nell'array.

Ed anche per questa volta è tutto. Buona programmazione!

Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

Nessuna risorsa collegata