2008-11-21 36 views
13

Tengo el siguiente dos archivos y me gustaría el segundo para extender el primero:Application.cfc en un subdirectorio

  1. wwwroot \ sitio \ Application.cfc
  2. wwwroot \ sitio \ dir \ aplicación. cfc

Sin embargo, cuando voy a declarar el componente para el segundo archivo, no estoy seguro de qué poner en el atributo extends. Mi problema es que varios sitios dev (con un repositorio SVN compartida) se ejecutan fuera de la misma instancia de ColdFusion, por lo que no sólo se puede crear una asignación en el admin CF modo:

<cfcomponent extends="site.application"> 

Sin embargo, ColdFusion no le gusta:

<cfcomponent extends="..application"> 

o cualquier entrada dinámica como:

<cfcomponent extends="#expandpath('..').#application"> 

Creación de una correlación de tiempo de ejecución (like here) tampoco parece posible. Crearlo en la aplicación base.cfc es inútil porque ese código aún no se ha ejecutado cuando se declara el cfc heredado; y no puedo crear la asignación antes de que se defina el componente heredado porque aún no hay una aplicación para adjuntarlo.

¿Hay alguna manera de que pueda hacer referencia al directorio principal para lograr mi extensión?

Modifíquelo para aclarar: La solución ApplicationProxy no funciona debido al texto en negrita de arriba. En este momento, como solución alternativa, simplemente no verificamos el \ dir \ application.cfc en SVN para que cada desarrollador pueda mantener una versión que extienda su propia raíz application.cfc. Obviamente, esto no es ideal.

Respuesta

4

El siguiente código está trabajando para mí. Sin embargo, una cosa que noté es que parece que la aplicación.cfc se almacena en caché, por lo que los cambios a la aplicación padre cfc podrían no reflejarse. Lo solucioné haciendo un cambio trivial en la aplicación infantil cfc.

<cfcomponent output="false"> 
     <cfset variables.higherPath = ReReplace(GetMetaData(this).name,"\.[^\.]+\.[^\.]+$","") /> 
     <cfset variables.extendApp = CreateObject("component", "#variables.higherPath#.Application") /> 

     <cfloop item="variables.key" collection="#variables.extendApp#"> 
      <cfif IsCustomFunction(variables.extendApp[variables.key])> 
       <cfset super[variables.key] = variables.extendApp[variables.key]> 
      <cfelse> 
       <cfset this[variables.key] = variables.extendApp[variables.key] > 
      </cfif> 
     </cfloop> 
     <cffunction name="onApplicationStart" output="false"> 
      <cfset super.onApplicationStart() /> 
     </cffunction> 
16

Sean Corfield tiene a blog entry explaining how to extend a root Application.cfc.

A continuación, se muestra la información relevante copiada de esa entrada.


Aquí está la raíz de CFC /Application.cfc:

<cfcomponent> 

    <cfset this.name = "cf7app" /> 
    <cfset this.sessionmanagement = true /> 

</cfcomponent> 

Aquí es su proxy CFC /ApplicationProxy.cfc:

<cfcomponent extends="Application"> 
</cfcomponent> 

Es completamente vacía y sólo sirve para crear un alias para su raíz /Application.cfc. Aquí está el subdirectorio de CFC /app/Application.cfc:

<cfcomponent extends="ApplicationProxy"> 

    <cffunction name="onSessionStart"> 
     <cfoutput><p>app.Application.onSessionStart()</p></cfoutput> 
     <cfset session.counter = 0 /> 
    </cffunction> 

    <cffunction name="onRequestStart"> 
     <cfoutput><p>app.Application.onRequestStart()</p></cfoutput> 
     <cfdump label="application" var="#application#"/> 
    </cffunction> 

</cfcomponent> 

La raíz de cada sitio individual debe tener su propia aplicación Maestro:

/site1/Application.cfc 
/site2/Application.cfc 
/site3/Application.cfc 

Todas estas aplicaciones son aplicaciones individuales separadas sin nada compartido entre ellos.

Si alguno de estos sitios individuales necesita tener sub-aplicaciones, entonces debe haber ApplicationProxy.CFC alonside el Maestro,

e.g. 
/site1/ApplicationProxy.cfc 
/site2/ApplicationProxy.cfc 

Entonces, para cada sub-aplicación que tiene el que se extiende el proxy:

e.g. 
/site1/subA/Application.cfc 
/site1/subB/Application.cfc 
/site2/subA/Application.cfc 
+0

¿No supone esto que la raíz del sitio es la raíz web? No parece funcionar para mí. – Soldarnal

+0

Soldernal, si la raíz del sitio no es la raíz web, necesitará una asignación a la raíz del sitio. Si su nombre de mapeo es foo, extiende "foo.application". –

+0

Parece que me encontré con mi problema original otra vez. Si creo una asignación para foo a \ devsite1 \, entonces \ devsite2 \ dir \ application.cfc extenderá \ devsite1 \ application.cfc – Soldarnal

3

Sé que esto es un viejo tema, pero he encontrado una manera de hacerlo (que parece funcionar en mi prueba) sin necesidad de utilizar las asignaciones de administrador de FQ.

Usted puede hacer esto mediante la adición de un mapeo de cada aplicación en su hijo Application.cfc utilizando una ruta relativa expandida:

<cfcomponent extends="cms.Application" output="false"> 
<cfset this.mappings["/cms"] = expandPath(getDirectoryFromPath(getCurrentTemplatePath()) & "../../../../")> 
<cflog text="#getMetadata(this).extends.path#"> 
</cfcomponent> 

Sí, se siente poco hacky, pero parece que funciona.

+0

Esto no parece funcionar para mí. ¿Podría explicarlo más y quizás enumerar qué versión de ColdFusion está usando? Parece que el mapeo no se definirá hasta después de que Application.cfc comience a procesarse, lo que no puede suceder porque la asignación es necesaria para que pase la primera línea. – Nicholas

Cuestiones relacionadas