Non si può fare esattamente quello che stai cercando di nel codice esempio. Hai alcune opzioni, però.
Metodo 1: a distanza oggetto accessibile
Spostare la funzione (s) in un CFC, e accedervi tramite l'URL del CFC. Questo metodo di accesso richiede che la funzione utilizzi l'attributo di autorizzazione access='remote'
- se impostato su pubblico (predefinito) o privato, (o pacchetto, o qualsiasi livello di ruolo, ecc.) Verrà visualizzato un errore di metodo non trovato durante il tentativo di accesso da remoto.
In questo modo, si crea un servizio Web SOAP e lo si consuma tramite AJAX. A tale scopo, utilizzando il seguente formato nella richiesta jQuery:
http://domain.com/path/to/your.cfc?method=functionName&argument1=arg1Val&foo=bar&...
Se si dispone di ColdFusion 8, è anche possibile specificare l'argomento returnFormat='format'
URL, che permette di convertire qualsiasi oggetti dati ColdFusion nativo si torna al formato richiesto su il volo. Supporta JSON, XML e WDDX.
foo.cfc
<cfcomponent output="false">
<cffunction name="foobar" output="false" access="remote" hint="...">
<cfargument name="arg1" type="string" required="true" />
...
<cfreturn someVar />
</cffunction>
</cfcomponent>
Accesso con URL:
http://domain.com/path/to/foo.cfc?method=foobar&arg1=some%20value&returnFormat=JSON
Metodo 2: oggetto proxy remoto
Il lato negativo di approccio # 1 è che c'è una leggera colpo di efficienza su istanziazione di CFC, quindi se questo particolare metodo AJAX verrà eseguito molto frequentemente, e/o il tuo CFC contiene più di alcuni metodi o è più lungo di un paio di centinaia di righe, non vuoi istanziarlo più e più volte per ogni richiesta. Invece, dovresti esaminare lo remote proxy pattern, dove memorizzi nella cache il CFC che implementa la funzionalità in ambito Application e avere un CFC separato 'proxy remoto' che è molto più leggero, e agisce semplicemente come come proxy (quindi il nome) tra la richiesta http e il CFC memorizzato nella cache.
In questo modello, il tuo oggetto business (quello che ha la funzione che fa il vero lavoro) può avere access=public
(o pacchetto, ecc.), Purché il proxy abbia accesso ad esso. Il proxy stesso deve avere access=remote
, tuttavia.
proxy.cfc
<cfcomponent output="false">
<cffunction name="foobar" output="false" access="remote" hint="...">
<cfargument name="arg1" type="string" required="true" />
<!--- Application.foo is an instantiated object of foo.cfc --->
<cfreturn Application.foo.foobar(argumentCollection=arguments) />
</cffunction>
</cfcomponent>
Accesso con URL:
http://domain.com/path/to/proxy.cfc?method=foobar&arg1=some%20value&returnFormat=JSON
Metodo 3: Do It Yourself
Infine, si potrebbe ma implementare in modo sfumato la funzione invocazione e ritorno in un modello CFM. Questo metodo non comporta il (leggero) impatto sulle prestazioni della scrittura di un CFC, ma sarà più tipografico per te e ulteriori potenziali punti di errore. Per fare ciò, includi le tue funzioni nel modello CFM e considera il flusso di output proprio come questo: un flusso di testo che verrà restituito al browser.
È necessario fare attenzione a gestire gli spazi bianchi nel valore restituito (utilizzare output=false
sulle definizioni di funzione, prendere in considerazione l'utilizzo di <cfsetting enableCFOutputOnly='true'
e fare solo attenzione alla spaziatura complessiva). Se la tua richiesta jQuery si aspetta JSON, devi serializzarlo. (Se è necessario serializzare i dati su JSON su ColdFusion 6 o 7, si consiglia di JSONUtil)
Con questo approccio, si punta la richiesta AJAX al file .cfm con i parametri URL, e quindi è necessario scrivere il codice che richiede questi parametri url e li passa nella funzione, quindi visualizza (essenzialmente, restituisce alla richiesta AJAX) il risultato della funzione.
foo.cfm
<cfsetting enableCFOutputOnly="true">
<cfparam name="arg1" default="defaultVal"/>
<cffunction name="foobar" output="false" access="remote" hint="...">
<cfargument name="arg1" type="string" required="true" />
...
<cfreturn someVar />
</cffunction>
<cfset variables.result = foobar(url.arg1) />
<cfoutput>#serializeJSON(variables.result)#</cfoutput>
Vedere la risposta di razzed qui sotto. A un livello leggermente più alto, stai semplicemente facendo una richiesta http e facendo qualcosa con il risultato. Avresti potuto fare la stessa chiamata alla homepage di StackOverflow e recuperare l'HTML che il tuo browser avrebbe, ma invece hai fatto la chiamata a una pagina Coldfusion personalizzata e tornare indietro qualunque pagina restituisse. Puoi lasciarlo come HTML o far restituire XML, JSON o anche il testo normale a Coldfusion. –