Extending application.cfc in a subdirectory

前端 未结 3 1411
心在旅途
心在旅途 2020-12-05 15:50

I have the following two files and would like the second to extend the first:

  1. wwwroot\\site\\application.cfc
  2. wwwroot\\site\\dir\\application.cfc
相关标签:
3条回答
  • 2020-12-05 16:13

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

    Below is the relevant information copied from that entry.


    Here's your root CFC /Application.cfc:

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

    Here's your proxy CFC /ApplicationProxy.cfc:

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

    It's completely empty and serves merely to create an alias for your root /Application.cfc. Here's your subdirectory 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>
    

    The root of each individual site should have its own Master App:

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

    All these applications are separate individual apps with nothing shared between them.

    If any of these individual sites need to have sub-applications, then there should be ApplicationProxy.cfc alonside the Master,

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

    Then, for each sub-application you have the one that extends the proxy:

    e.g.
    /site1/subA/Application.cfc
    /site1/subB/Application.cfc
    /site2/subA/Application.cfc
    
    0 讨论(0)
  • 2020-12-05 16:22

    The following code is working for me. One thing I noticed though is that the application.cfc seems to get cached, so changes to the parent application cfc might not be reflected. I got around this by doing a trivial change to the child application 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>
    
    0 讨论(0)
  • 2020-12-05 16:23

    I know this is an old topic, but I found a way to do it (that seems to work in my testing) without using the CF Administrator mappings.

    You can do this by adding a per-application mapping in your child Application.cfc using an expanded relative path:

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

    Yeah, it feels little hacky, but it seems to work.

    0 讨论(0)
提交回复
热议问题