Переменная область видимости в CF 10 по сравнению с CF MX7

У меня возникла странная проблема с моим кодом ColdFusion 10. Я новичок в ColdFusion, так что полегче со мной. Причина, по которой это странно, заключается в том, что этого не происходит в более старых версиях этой платформы (например, MX 7).

Сначала немного информации:

У меня две среды. ColdFusion 10 и ColdFusion MX 7 (IIS 7 и IIS 5 соответственно). В среде ColdFusion 10 у меня есть файл Application.cfc со следующим оператором...

<cfset CompanyLogoText = "Acme Company">

Этот файл Application.cfc находится в корневом каталоге (mydomain.com). У меня также есть файл CFM в подпапке корневого веб-сайта по адресу mydomain.com/pages/default.cfm. Он содержит следующую разметку...

<cfoutput><p>#CompanyLogoText#</p></cfoutput>

Проблема

Когда я перехожу к mydomain.com/pages/default.cfm, я получаю сообщение об ошибке от coldfusion. Ошибка "Переменная COMPANYLOGOTEXT не определена."

Странная часть

Я не получаю эту ошибку в ColdFusion MX 7. Единственное отличие состоит в том, что среда CF MX 7 использует файл Application.cfm, но с точно такой же строкой.

Вопрос

Как я могу заставить файл pages/default.cfm видеть мою переменную CompanyLogoText в среде CF 10?

Вот полная разметка

Приложение.cfc

<cfcomponent>
<cfset This.name = "test_cf">
<cfset This.Sessionmanagement="yes">
<cfset This.Sessiontimeout="#createtimespan(0,0,10,0)#">
<cfset This.applicationtimeout="#createtimespan(5,0,0,0)#">
<cfset This.setclientcookies="no" >
<cfset This.clientmanagement="no">


<cffunction name="onApplicationStart">

    <cfset CompanyLogoText = "Acme Company">    

</cffunction>



<cffunction name="onRequestStart">
    <cfargument name="requestname" required=true />
    <cfset CompanyLogoText = "Acme Company">    


</cffunction>


</cfcomponent>

Страницы/Default.cfm

<cftry>

<cfoutput><p>#CompanyLogoText#</p></cfoutput>

<cfcatch>

<p>Could not read CompanyLogoText<br/><br/>

<cfoutput>
<br/>Message:  #cfcatch.message#
<br/>Details:  #cfcatch.detail#.

</cfoutput>

</cfcatch>

</cftry>

person RyanCJI    schedule 14.03.2014    source источник
comment
Нужно больше кода App.cfc, чтобы дать правильный ответ. Если вы хотите воспроизвести функциональность App.cfm, я бы поместил ваше объявление переменной в функцию onRequestStart. Возможно, вам придется поместить его в область запроса. Вы также можете использовать функцию onRequest, но это связано с другими соображениями.   -  person Sean Coyne    schedule 14.03.2014
comment
Спасибо, Шон. Я попытался использовать onRequestStart, но это все равно не сработало. Но позвольте мне попробовать еще раз и перезапустить службу.   -  person RyanCJI    schedule 14.03.2014
comment
@rcjames прочтите это. bennadel.com/blog/   -  person fyroc    schedule 14.03.2014
comment
@rcjames, как я уже упоминал, с onRequestStart вы не можете напрямую использовать область переменных, вы можете установить ее в request.companylogotext, а затем ссылаться на нее таким же образом на других страницах. Если вам это нужно в области переменных, вам придется использовать onRequest(), но опять же, это связано с другими проблемами с определенными запросами. FWIW, вам, вероятно, следует установить его как переменную уровня приложения (если вам не нужно использовать ее по-другому или она меняется от запроса к запросу). если он не изменится, просто установите его один раз в области приложения.   -  person Sean Coyne    schedule 14.03.2014
comment
Я просто хотел бы добавить, что по сравнению со многими вопросами CFML здесь, этот был очень хорошо представлен. Спасибо (я говорю это, потому что иногда пытаюсь помочь людям, которые немного разрушают душу).   -  person Adam Cameron    schedule 14.03.2014


Ответы (3)


В этом разница между Application.cfm и Application.cfc

Используйте onRequest(), установите переменные, затем cfinclude целевой файл. Это единственный способ поделиться областью действия variables.

https://wikidocs.adobe.com/wiki/display/coldfusionen/onRequest

e.g.

<cffunction name="onRequest" returnType="void"> 
    <cfargument name="targetPage" type="String" required=true/> 

    <cfinclude template="globalVars.cfm">

    <cfset variables.foo = "bar">

    <cfinclude template="#Arguments.targetPage#">
</cffunction>

ЦИТАТА: CF8: переход с Application.cfm на Application.cfc

Поместите в метод onRequest любой код, устанавливающий переменные области видимости Variables, и добавьте тег cfinclude, который включает страницу, указанную в переменной Arguments.Targetpage метода.

person Henry    schedule 14.03.2014
comment
Спасибо Генри. Вы говорите, что я должен поместить <cfinclude template="Application.cfm"> в функцию OnRequestStart, содержащуюся в Application.cfc? - person RyanCJI; 14.03.2014

Как уже упоминалось, ваш application.cfc должен быть правильно отформатирован. Лучше всего прочитать это и соответствующим образом отформатировать файл .cfc.

http://www.bennadel.com/blog/726-ColdFusion-Application-cfc-Tutorial-And-Application-cfc-Reference.htm

person fyroc    schedule 14.03.2014

Пока не вижу отмеченного ответа. Если у вас есть файл application.cfm в подкаталоге, он переопределит файл application.cfc в корне. Просто возможность...

person David McCan    schedule 20.03.2014