nie można zrobić dokładnie to, co starasz się w przykładowym kodzie. Masz jednak kilka opcji.
Metoda 1: Zdalnie dostępny obiekt
Najedź funkcję (-ów) do CFC, a dostęp do nich za pośrednictwem adresu URL CFC. Ta metoda dostępu wymaga, aby funkcja korzystała z atrybutu uprawnień access='remote'
- jeśli jest ustawiona jako publiczna (domyślna) lub prywatna ((lub pakiet, lub dowolne poziomy ról itp.), Otrzymasz komunikat o błędzie metody, który nie został znaleziony podczas próby uzyskania dostępu to zdalnie.
W ten sposób tworzysz usługę internetową SOAP i używasz jej przez AJAX. Można to zrobić za pomocą następującego wzoru we wniosku jQuery:
http://domain.com/path/to/your.cfc?method=functionName&argument1=arg1Val&foo=bar&...
Jeśli masz ColdFusion 8, można również określić argument returnFormat='format'
zawartości, co będzie przekształcić cokolwiek rodzimy danych ColdFusion obiektów wrócisz do żądanego formatu na Mucha. Obsługuje JSON, XML i 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>
Dostęp URL:
http://domain.com/path/to/foo.cfc?method=foobar&arg1=some%20value&returnFormat=JSON
Metoda 2: Zdalny obiekt proxy
Negatywna strona podejście # 1 jest to, że istnieje niewielkie Efektywność w tworzeniu instancji CFC, więc jeśli ta konkretna metoda AJAX będzie uruchamiana bardzo często i/lub Twoja CFC zawiera więcej niż kilka metod lub jest dłuższa niż kilkaset linii, nie chcesz tworzyć jej w kółko dla każdego żądania. Zamiast tego warto zajrzeć do wersji remote proxy pattern, w której buforowane jest CFC, które implementuje funkcjonalność w zakresie aplikacji, i mają osobną "CFC zdalnego serwera", która jest znacznie lżejsza i po prostu działa jako jako proxy (stąd nazwa) między żądaniem http a pamięcią podręczną CFC.
W tym wzorze obiekt biznesowy (ten, który ma funkcję wykonującą prawdziwą pracę) może mieć access=public
(lub pakiet itp.), O ile serwer proxy ma do niego dostęp. Sam serwer proxy musi jednak mieć numer access=remote
.
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>
Dostęp URL:
http://domain.com/path/to/proxy.cfc?method=foobar&arg1=some%20value&returnFormat=JSON
Metoda 3: Do It Yourself
Wreszcie, można MA natywnie zaimplementuj wywołanie funkcji i zwróć ją w szablonie CFM. Ta metoda nie wiąże się z (niewielkim) trafieniem wydajności pisania CFC, ale będzie dla Ciebie pisaniem częściej i dodatkowymi potencjalnymi punktami awarii. Aby to zrobić, umieść swoje funkcje w szablonie CFM i traktuj strumień wyjściowy jako: strumień tekstu, który zostanie zwrócony przeglądarce.
Powinieneś zachować ostrożność, zarządzając białymi znakami w wartości zwracanej (użyj output=false
dla definicji funkcji, rozważ użycie opcji <cfsetting enableCFOutputOnly='true'
i zachowaj ostrożność w ogólnym rozstawie). Jeśli twoje żądanie jQuery oczekuje JSON z powrotem, musisz serializować go. (Jeśli potrzebujesz serializować dane do JSON na ColdFusion 6 lub 7, polecam JSONUtil)
Przy takim podejściu wskaż twoje żądanie AJAX do pliku .cfm z parametrami URL, a następnie musisz napisać kod, który te parametry adresu URL i przekazuje je do funkcji, a następnie wyświetla (w zasadzie zwraca do żądania AJAX) wynik działania.
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>
Zobacz odpowiedź razzed poniżej. Na nieco wyższym poziomie, po prostu tworzysz zapytanie http i robisz coś z wynikiem. Mogłeś wykonać to samo połączenie ze stroną główną StackOverflow i odzyskać kod HTML przeglądarki, ale zamiast tego nawiązujesz połączenie z niestandardową stroną ColdFusion i odzyskujesz to, co ta strona zwróci. Możesz zostawić to jako HTML, albo mieć ColdFusion zwracający XML, JSON, a nawet zwykły tekst. –