Невозможно получить доступ к переменным при преобразовании из application.cfm в application.cfc - PullRequest
1 голос
/ 30 марта 2012

Я пытаюсь преобразовать приложение, которое я поддерживаю, из application.cfm в application.cfc. Я следовал учебному пособию Бена Наделя ColdFusion Application.cfc и справочнику Application.cfc , но мои страницы не могут получить доступ ни к одной из переменных в области приложения, без добавления APPLICATION. к переменной. Как примечание, это приложение использует 0 CFC в настоящее время.

вот мое приложение.cfc.

<cfcomponent displayname="Application" hint="Handle the application" output="true">

    <cfset THIS.Name = "AAS" />
    <cfset THIS.ApplicationTimeout = CreateTimeSpan( 0, 60, 0 , 0) />
    <cfset THIS.SessionManagement = true />
    <cfset THIS.setClientCookies = false />
    <cfset THIS.versionNum = '1'>
    <cfset THIS.genericUserID = 'o005265'>
    <cfset THIS.genericPassword = 'zo005265'>

    <cffunction 
        name="OnApplicationStart" 
        hint="Fires when the application is first created." 
        access="public" 
        output="false" 
        returntype="boolean">

       <cfset APPLICATION.aasURL = 'http://127.0.0.1:8500/aaas'>
       <cfset APPLICATION.dsn = 've0_aaas'>
       <cfset APPLICATION.aas_system = 'development (studio)'>

    <cfreturn true />
  </cffunction>
</cfcomponent>

По сути, я просто скопировал то, что было на странице application.cfm, и подумал, что это будет работать так же. Я предполагаю, что я должен вызвать это где-нибудь? Это единственное, о чем я могу думать. Любая помощь будет великолепна.

--- РЕДАКТИРОВАТЬ ---

Я добавил методы OnRequest и OnApplicationStart после того, как @EvikJames ответил

<cffunction name="OnApplicationStart" access="public" returntype="boolean" output="false" hint="Fires when the application is first created.">
    <!--- Return out. --->
    <cfset APPLICATION.aasURL = 'http://127.0.0.1:8500/aaas'>
    <cfset APPLICATION.datasource = 've0_aaas'>
    <cfset APPLICATION.aas_system = 'development (studio)'>
    <cfreturn true />
</cffunction>


<cffunction name="OnRequest" access="public" returntype="void" output="true" hint="Fires after pre page processing is complete.">
    <!--- Define arguments. --->
    <cfargument name="TargetPage" type="string" required="true">
    <!--- Include the requested page. --->
    <cfinclude template="#ARGUMENTS.TargetPage#" />

    <cfset VARIABLES.dsn = APPLICATION.dsn>
    <cfset VARIABLES.aasURL = APPLICATION.aasURL>
    <cfset VARIABLES.aas_system = APPLICATION.aas_system>
    <!--- Return out. --->
    <cfreturn />
</cffunction>

Ответы [ 5 ]

4 голосов
/ 30 марта 2012

Вы на самом деле не пытаетесь использовать переменные «приложения» (которые всегда должны быть ограничены).Я подозреваю, что ваша старая страница application.cfm имела что-то вроде.

<cfapplicatin name="blah"...>

<cfset dsn = 'mydsn'/>

И тогда вы смогли сделать:

<cfquery datasource="#dsn#">

Этот подход не использует application scope ... он просто использует тот факт, что ваш application.cfm всегда выполняется независимо от того, что.На самом деле он помещает переменные в область действия variable .Поскольку CF всегда сначала проверяет область «переменных», вы, например, # dsn # works, но это не то же самое, что область приложения.

Чтобы имитировать это поведение в Application.cfc (как было предложено), вывам нужно будет поместить вашу переменную в функцию "onRequest ()" вместо функции "onApplicationstart ()" - например, так:

<cffunction name="onRequest">
<cfset dsn = 'mydsn'/>
</cffunction>
3 голосов
/ 30 марта 2012

что ожидается. Чтобы сослаться на переменные приложения, вам нужно добавить к ним префикс приложения.

2 голосов
/ 30 марта 2012

В вашем методе запуска onApplication сделайте следующее:

<cfset APPLICATION.datasource = 'MyDSN'>

В вашем методе onRequest сделайте следующее:

<cfset VARIABLES.DSN = APPLICATION.datasource>

Затем этот запрос будет работать:

<cfquery datasource="#dsn#">
// sql
</cfquery>

Я должен добавить, что когда вы полностью обновитесь, вы можете удалить весь приведенный выше код, просто установив источник данных по умолчанию:

<cfset THIS.datasource = 'MyDSN'>
1 голос
/ 30 марта 2012

Если переменная находится в области приложения, вам всегда нужно будет идентифицировать ее таким образом на своих страницах .cfm. Если вы используете имя переменной без префикса области действия, область применения не просматривается.

если вы хотите объявить переменные в application.cfc, к которым можно получить доступ без области приложения на других ваших страницах, просто объявите переменные вне каких-либо функций.

<component>
   <cfset this.name = "applicationName">
   <cfset otherVar = 'something'>
   <cfset otherVar2 = 'something else'>

   <cffunction name="onApplicationStart>.....</cffunction>
</component>

otherVar и otherVar2 можно вызывать без префикса области действия на всех страницах .cfm.

0 голосов
/ 30 марта 2012

Похоже, вы изначально не использовали переменные области приложения.Если переменные изначально не были областью действия с «приложением».тогда они были просто в «области видимости переменных» (смутная формулировка, которую я знаю), которая доступна при нажатии на страницу cfm и включенных других.Это одно большое изменение при перемещении между application.cfm и application.cfc.Общая идея заключается в том, что включенные файлы CFM имеют общую область видимости переменных, а файлы CFC - нет.

Если единственное изменение, которое вам нужно сделать, это изменить # dsn # на # appplication.dsn #, тогда просто сделайте это ипокончим с.Существуют такие инструменты, как WinGrep или даже Notepad ++, которые находят и заменяют несколько файлов.

...