2010-06-09 11 views
6

Estoy migrando una aplicación anterior que usa application.cfm para usar una aplicación.cfc. El CFM establece unas pocas variables globales tales como¿Es posible crear un global sin ámbito en application.cfc?

<cfset dsn = "myDSN"> 

he intentado poner esa línea de código en onApplicationStart, onRequestStart, etc., pero tratando de imprimir ese valor en una página de prueba no se realiza correctamente. Establecer un valor en el ámbito de la aplicación (por ejemplo, application.dsn) funciona bien, por supuesto, pero tengo una fecha límite ajustada y no puedo mover el barco haciendo una búsqueda en todo el sitio y sustituirlo por cada uno global.

Sé que poner estos en ámbitos es lo correcto, pero, por el momento, ¿hay alguna forma de cambiar a usar Application.CFC pero aún así crear variables globales no codificadas?

Respuesta

9

Intenta ponerlo dentro de onRequest() en lugar de onRequestStart().

+0

Eso fue todo un truco aunque también dicté un voto a la respuesta a continuación, ya que también es bueno saberlo en el futuro. – DaveBurns

4

Necesitará tanto Application.cfc como Application.cfm. Mueva todo el código principal de Application.cfm a las partes adecuadas de Applicaiton.cfc.

Entonces, y esto puede ser la única línea, en Applicaiton.cfm:

<cfset variables.dsn = "myDSN" />

Ahora vuelve a Application.cfc y añadir esta fuera de todas las funciones:

<cfinclude template="Application.cfm" />

en su test.cfm, ahora debería ser capaz de salida de la variable DSN sin el prefijo alcance:

<cfoutput>#dsn#</cfoutput>

Si define variables.dsn en cualquier lugar dentro del CFC, está colocando la variable en el ámbito de variables del CFC, que es privado para el CFC. Al definirlo en el CFM, y luego incluir el CFM, se mantiene en el ámbito de variables de la solicitud de la página.

+2

Si toma este enfoque, nombraría el archivo incluido algo como globals.cfm, para evitar cualquier confusión sobre si se trata como Application.cfm en versiones anteriores de CF (que no lo es). –

+0

¿Alguien ha probado este interesante enfoque? Tal vez estoy haciendo algo mal con mis 3 plantillas de una línea, pero no funciona para mí (CF9). Intentó application.cfm y globals.cfm. Y para ser sincero, no esperaba que funcionara, porque no veo, por qué establecer una variable en un archivo incluido debería "dejar" el alcance de incluir cfc y hacer que var esté disponible globalmente. Y por qué configurar directamente la var dentro de la aplicación.cfc fuera de las funciones no debería funcionar de la misma manera. El enfoque onRequest() "Mixin" funciona como se esperaba. –

+0

También intenté esto en CF9, actualización 1 con resultados negativos. –

1

Habiendo luchado con esto yo mismo, le daré mi solución. Tenga en cuenta que esto funciona en CF9, no sé sobre otras versiones (hay un problema con las llamadas onRequest y AJAX en versiones anteriores). Básicamente, es necesario tener la función onRequest en su Application.cfc. Aquí hay una plantilla básica:

<cffunction name="onRequest" access="public" returntype="void" output="true"> 
    <cfargument name="targetPage" type="string" required="true"> 

    <!--- include the requested page. ---> 
    <cfinclude template="#arguments.TargetPage#"> 
</cffunction> 

As far as I understand it: it's actually the cfinclude that enables you to access the functions. So, with this onRequest in your Application.cfc you can access the 'this' scope of the Application.cfc which would include your public functions & variables. 
If you want a more in depth example of this then check out Framework-1 by Sean Corfield. It does this exact thing, all API methods are contained in the Application.cfc. 
Cuestiones relacionadas