Как включить UDF_library в application.cfm? - PullRequest
0 голосов
/ 01 февраля 2012

Я использую ColdFusion 8.0.1

Я работаю над существующим приложением, которое имеет тысячи страниц.Я пытаюсь включить библиотеку новых UDF в мой файл application.cfm.

Я добавил эту строку в application.cfm:

<!--- UDF library include --->
<cfinclude template="UDF/udf_library.cfm">

Библиотека UDF включает в себя другие файлы, содержащие UDF, например:

<cfinclude template="udf_powerreview.cfm">

У меня есть функции вфайл udf_powerreview.cfm, такой как:

// CREATE POWER REVIEWS SNIPPET
function createPRSnippet(Page_ID) {
    LOCAL.Page_ID =  ARGUMENTS.Page_ID;
    if (isNumeric(LOCAL.Page_ID) && LOCAL.Page_ID > 0) {
        LOCAL.Snippet = "<div class='pr_snippet_product'><script type='text/javascript'>var pr_snippet_min_reviews = 0; POWERREVIEWS.display.snippet(document, { pr_page_id : '#LOCAL.Page_ID#' });</script></div>";
    } else {
        LOCAL.Snippet = "";
    }
    return LOCAL.Snippet;
}

Инструмент отладки говорит, что UDF / udf_library.cfm и udf_powerreview.cfm успешно включены.

Проблема в том, что когда я вызываю функцию на другой странице, я получаю сообщение об ошибке, в котором говорится, что функция не существует.Когда я могу скопировать функцию и поместить ее непосредственно на страницу, на которой она используется, она работает просто отлично.И я не получаю сообщение об ошибке «подпрограммы не могут быть объявлены дважды».

На каждом сайте, который я создаю, я создаю udf_library.cfm или udf_library.cfc точно таким же образом.Они всегда работают нормально.

Что может помешать доступу и доступу к функциям?Есть ли настройка приложения, которую нужно установить?

Ответы [ 3 ]

1 голос
/ 01 февраля 2012

Это проблема объема страницы.Не думайте о Application.cfm как о включении на всех ваших страницах, просто знайте, что он запускается первым.То, что он инициализирует, будет перенесено на вашу существующую область страницы, а некоторые - нет.Использование Application.cfc вместо application.cfm решает большую часть двусмысленности.

Чтобы сделать ваш UDF доступным для всего вашего приложения, я бы предложил использовать шаблон проектирования "Singleton".Сначала возьмите свои UDF и поместите их в формат CFC.Это сделает их более переносимыми.

в вашем application.cfm вы можете поместить следующие строки:

<cfif NOT isdefined('session.udf_powerreview') or isdefined('url.resetudf')>
  <cfset  session.udf_powerreview = createobject('Component','udf.udf_powerreview')/>
  <!--- this 'udf.udf_powerreview' represents the physical path udf/udf_powerreview.cfc --->
</cfif>

Я вставляю это в область сеанса вместо области приложения, потому чтоу вас не будет хорошего способа сброса области приложения, если вы измените свои UDF.

В любом случае, как только это будет в вашем файле application.cfm, вы сможете увидеть свои функции на любой странице.

<cfdump var="#session.udf_powerreview#">
1 голос
/ 01 февраля 2012

Вот одна стратегия, которую я использую. Это в основном называет UDFs «по требованию». Он не будет повторно импортировать UDF, если он уже существует. Однако вы должны иметь именованные аргументы, в противном случае вам придется удалить UDFName из набора аргументов. Однако я беспокоюсь, что порядок аргументов не может быть сохранен, я не исследовал это.

application.cfm

<cfapplication 
    name="udftest_001" />

<cffunction name="udf">
    <cfargument name="udfname" type="string" required="true">
    <cfif NOT isDefined(udfname)>
        <cfinclude template='./udfs/#udfname#.cfm'>
    </cfif>
    <cfset tempfunc = variables[udfname]>
    <cfreturn tempfunc(argumentCollection=arguments)>
</cffunction>

index.cfm

<cfoutput>
#udf(udfname='testUDF',firstname='John',lastname='Smith')#<br/>
#udf(udfname='testUDF',firstname='Betty',lastname='Ford')#<br/>
</cfoutput>

/ UDFs / testudf.cfm

<cfscript>
function testUDF() {
    return 'Hello ' & arguments.firstname & ' #arguments.lastname#';
}
</cfscript>
0 голосов
/ 01 февраля 2012

Я подозреваю, что что-то не так с относительными путями.

Можете ли вы сделать "UDF" отображением?Тогда вы можете сделать

<cfinclude template="/UDF/udf_library.cfm">
...