Вы не можете делать именно то, что пытаетесь сделать в своем примере кода. У вас есть несколько вариантов.
Метод 1: Удаленно доступный объект
Переместите ваши функции в CFC и получите к ним доступ через URL-адрес CFC. Этот метод доступа требует, чтобы функция использовала атрибут разрешения access='remote'
- если установлено общедоступное (по умолчанию) или частное (или пакет, или любые уровни роли и т. Д.), То при попытке выполнить метод не найден чтобы получить к нему удаленный доступ.
Делая это, вы создаете веб-сервис SOAP и используете его через AJAX. Вы делаете это, используя следующий формат в вашем запросе jQuery:
http://domain.com/path/to/your.cfc?method=functionName&argument1=arg1Val&foo=bar&...
Если у вас ColdFusion 8, вы также можете указать аргумент returnFormat='format'
url, который будет преобразовывать любые собственные объекты данных ColdFusion, которые вы возвращаете, в запрошенный формат на лету. Он поддерживает JSON, XML и 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>
Доступ по URL:
http://domain.com/path/to/foo.cfc?method=foobar&arg1=some%20value&returnFormat=JSON
Метод 2: Удаленный прокси-объект
Негативная сторона подхода # 1 заключается в том, что при создании экземпляров CFC наблюдается незначительное снижение эффективности, поэтому, если этот конкретный метод AJAX будет выполняться очень часто, и / или ваш CFC будет содержать несколько методов или длиннее, чем метод. пара сотен строк, вы не хотите создавать его снова и снова для каждого запроса. Вместо этого вы захотите взглянуть на шаблон удаленного прокси , где вы кэшируете CFC, который реализует функциональность в области приложения, и имеете отдельный CFC «удаленный прокси», который гораздо легче и просто действует в качестве прокси (отсюда и имя) между запросом http и кэшированным CFC.
В этом шаблоне ваш бизнес-объект (тот, у которого есть функция, выполняющая реальную работу) может иметь access=public
(или пакет и т. Д.), Если прокси-сервер имеет к нему доступ. Сам прокси должен иметь 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>
Доступ по URL:
http://domain.com/path/to/proxy.cfc?method=foobar&arg1=some%20value&returnFormat=JSON
Метод 3: Сделай сам
Наконец, вы можете вручную реализовать вызов функции и вернуться в шаблон CFM. Этот метод не включает (незначительное) снижение производительности при написании CFC, но будет более типичным для вас и дополнительными потенциальными точками отказа. Для этого включите свои функции в шаблон CFM и обработайте выходной поток как всего лишь: поток текста, который будет возвращен браузеру.
Вы должны быть осторожны, чтобы управлять пробелами в возвращаемом значении (используйте output=false
в определениях функций, рассмотрите возможность использования <cfsetting enableCFOutputOnly='true'
и просто будьте осторожны с вашим интервалом в целом). Если ваш запрос jQuery ожидает возвращения JSON, вам нужно его сериализовать. (Если вам нужно сериализовать данные в JSON в ColdFusion 6 или 7, я рекомендую JSONUtil )
При таком подходе вы указываете свой запрос AJAX на файл .cfm с параметрами URL, а затем вам нужно написать код, который принимает эти параметры URL и передает их в функцию, а затем отображает (по существу, возвращает в AJAX). запрос) результат функции.
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>