2009-06-25 4 views
3

Мы запускаем ColdFusion MX7.Где хранить общие функции в ColdFusion

Одна из проблем заключается в том, что у нас есть много функций, которые мы используем на многих наших страницах. Было бы неплохо, если бы они жили в глобальной области ColdFusion, а не включали их на всех наших страницах.

Есть ли способ сделать это, который не включает пользовательские теги или тому подобное?

Я знаю, что мы могли бы прикреплять некоторые объекты к областям приложений или серверов, но тогда мы должны ссылаться на них как таковые.

Просто добавление их в глобальную сферу было бы идеальным.

EDIT

Благодаря предложениям, вот что я придумал. В принципе, для каждого запроса в функции OnRequestStart назначьте правильно названную переменную в области клиента ссылку на функцию (this.functionName).

Application.cfc:

<cfcomponent OUTPUT="FALSE"> 
<cfset This.name = "MyApp"> 
<CFSET This.clientManagement = true> 
<CFSET This.SessionManagement = true> 

<CFFUNCTION NAME="Coalesce" OUTPUT="FALSE" access="public"> 
    <CFARGUMENT NAME="ARG1"> 
    <CFARGUMENT NAME="ARG2"> 

    <CFIF ARG1 NEQ ""> 
     <CFRETURN ARG1> 
    <CFELSE> 
     <CFRETURN ARG2> 
    </CFIF> 
</CFFUNCTION> 

<cffunction name="onRequestStart"> 
    <CFSET CLIENT.COALESCE = this.COALESCE> 
</cffunction> 

</cfcomponent> 

Страницы, которые в соответствии с настоящим приложением счастливо ответить на вызов:

<CFOUTPUT>#COALESCE("ONE","TWO")#</CFOUTPUT> 

Работает отлично!

+2

«но тогда мы должны ссылаться на них как таковой.», А не на самом деле. CF будет искать функцию в области приложений для вас. Итак, если у вас есть funcA() в области приложения, вы можете просто вызвать funcA(), и он будет работать. Вам не нужно вызывать Application.funcA() – Henry

+0

Мне не удалось получить публичную функцию для ответа из области приложения (с помощью application.cfc). Я что-то пропустил? –

+0

Спасибо, что поделились кодом, которым вы закончили пользоваться. Вместо того, чтобы добавлять его к вопросу, вы должны опубликовать его в качестве ответа. –

ответ

6

Нет такой вещи, как «глобальный охват».

Если вы говорите об области переменных на каждой странице, вы можете попробовать включить UDF внутри Application.cfm.

Если вы используете Application.cfc, найдите документ onRequest() в документе CF7.

+0

Под «Глобальной областью» Я имею в виду область действия CF, которая ставит стандартные функции, такие как now(). Я не уверен, где он хранит их. –

+0

Хорошо, что «магический глобальный охват» нам недоступен. :) – Henry

+0

Ну, это хорошо, должно быть.; o) –

2

Один из вариантов, которым я был доволен, заключается в создании компонента (или аналогичного имени) в Application.cfc. Добавьте все свои функции к этому компоненту и создайте его, когда приложение создано. Это улучшит время загрузки, поскольку функции будут кэшироваться в приложении, а также сделать функции доступными для любого файла в этом приложении. Конечно, тогда вам нужно будет вызвать функцию, например application.services.myUsefulFunction()

Смежные вопросы