Layer 06

CF – Scope o non Scope?

Blog di Merlinox!

Provocato dall’amico Galapagoss ho scoperto che purtroppo anche questo funziona:
<cfset url.client.id_utente=10> <cfoutput>#client.id_utente#</cfoutput>
Chiaramente funziona anche con le variabili session!!!

In ColdFusion gli scope delle variabili base, delle variabili URL e delle variabili FORM sono facoltativi. Si possono non usare, ma al momento che vengono usati le cose cambiano. Spieghiamo meglio. Se io scrivo:

<cfif isDefined(“id_utente”)>

il server verifica l’esistenza della variabile id_utente negli scope variables, url, form indipendentemente. Se ne trova uno ritorna true. Se invece scrivo:

<cfif isDefined(“form.id_utente”)>

il server cerca solamente quel tipo di variabile. Nel caso in cui fosse definita una variabile variables.id_utente o url.id_utente ma non form.id_utente, la funzione di controllo ritornerebbe False. Dove nasce il problema? Il problema nasce al momento in cui utilizzo una variabile form/url, es.: form.id_utente   Se viene chiamata la pagina: test.cfm?form.id_utente=13 viene create onDemand una variabile form.id_utente come oggetto della struttura url. Ad esclusione del tag cfparam e della funzione isDefined, ogni operazione fatta sulla variabile form.id_utente, viene fatta su url.form.id_utente (allo stesso modo in cui possiamo evitare lo scope usando miaVariabile al posto di url.miaVariabile).   Per risolvere il problema è necessario fare il check della variabile in arrivo necessaria tramite isDefined() che invece funziona correttamente, riconoscendo la variaibile in modo corretto come url.form.id_utente oppure tramite <cfparam …> Questo perchè trova la variabile form.id_utente all’interno della struttura url trova cioè url.form.id_utente che però legge come form.id_utente, bypassando i controlli. Per capire meglio provate questo breve codice:

<cfif form.id_utente gt 10> Ciao mamma </cfif>

<cfdump var=”#url#” label=”URL”> <cfdump var=”#form#” label=”FORM”>   richiamate la pagina (test.cfm) in questo modo: test.cfm?form.id_utente=100 e vedrete che “Ciao mamma” compare, mentre dentro alla struttura form non esiste alcuna variabile id_utente   Per ovviare si può correggere il codice in questo modo:

<cfif isDefined(“form.id_utente”) and form.id_utente gt 10> Ciao mamma </cfif>

<cfdump var=”#url#” label=”URL”> <cfdump var=”#form#” label=”FORM”> Segnalo inoltre che lo scope corretto risulta prioritario rispetto ad uno scope “alternativo”. Quindi l’esempio che riporto:  

<cfset form.id_utente=”idUtenteForm”> <cfset url.form.id_utente=”idUtenteUrl”> <cfoutput>#form.id_utente#</cfoutput>   Restituirà in output la variabile corretta, quindi pre-dichiarando

<cfparam name=”form.id_utente” default=”0″>

  Possiamo essere sicuri che le operazioni (<cfif>,…) saranno sempre basate sullo scope corretto!]]>