通过根代理扩展Application.cfc时如何防止<cfincludes>中断?</cfincludes>

时间:2014-12-03 19:00:00

标签: coldfusion application.cfc

我正在使用Application.cfm切换到Application.cfc,我使用Ben Nadel的方法使用应用程序代理将我的应用程序扩展到子文件夹。 (link to article

我遇到的问题是,当我在子文件夹中加载一个页面时,在根Application.cfc文件中调用的所有 cfinclude 标记都会显示“找不到包含的模板... “错误消息。 (包含是故意在组件的顶部,所以我可以设置特定于应用程序的变量)

以下是一些要求:

  • 必须在不访问ColdFusion管理员的情况下运行应用程序。
  • 该应用程序可能存在也可能不存在于其他网站的子文件夹中(即www.example.com/或localhost / mysite /)

以下是文件结构:

  • /application.cfc
  • /include_me.cfm
  • /index.cfm
  • /sub/application.cfc
  • /sub/application_rootProxy.cfc
  • /sub/index.cfm

Root Application.cfm:

<cfcomponent
    output="false"
    hint="I define the application settings and event handlers.">
 
 
    <!--- Define the application settings. --->
    <cfset this.name = "TestApplication" />
    <cfset this.applicationTimeout = createTimeSpan( 0, 0, 10, 0 ) />
 
    <!---
        Store the path of the current template. We want to see if
        this shows up as the root template or the sub template.
    --->
    <cfset this.ROOT_currentTemplatePath = getCurrentTemplatePath() />
    
    <!--- Set a variable to indicate that the included file hasn't been run yet --->
    <cfset this.includedFile = "no" />
    
    <!--- include the file --->
    <cfinclude template="include_me.cfm" />
 
    
    <cffunction
        name="onApplicationStart"
        access="public"
        returntype="boolean"
        output="false"
        hint="I initialize the application.">
 
        <!--- Set some app variables for testing. --->
        <cfset application.ROOT_onApplicationStart = true />
 
        <!--- Return true so the page can process. --->
        <cfreturn true />
        
    </cffunction>
 
 
    <cffunction
        name="onRequestStart"
        access="public"
        returntype="boolean"
        output="false"
        hint="I initialize the request.">
 
        <!--- Set some request variables for testing. --->
        <cfset request.ROOT_onRequestStart = true />
 
        <!--- Return true so the page can process. --->
        <cfreturn true />
        
    </cffunction>
 
 
    <cffunction
        name="onRequest"
        access="public"
        returntype="void"
        output="true"
        hint="I process the user's request.">
 
        <!--- Define arguments. --->
        <cfargument name="script"type="string" required="true"hint="I am the request script." />
 
        <!--- Output the current THIS collection. --->
        <cfdump var="#this#" label="THIS" />
 
        <!--- Include (execute) requested script. --->
        <cfinclude template="#arguments.script#" />
 
        <!--- Return out. --->
        <cfreturn />
        
    </cffunction>
 
</cfcomponent>

Root Include_me.cfm:

<!--- update the value so we know the file was indeed included --->
<cfset this.includedFile = "yes" />

子文件夹Application.cfc

<!--- extends the application so we can make changes when needed --->
<cfcomponent extends="application_rootProxy">
	
	<cfset this.SUB_currentTemplatePath = getCurrentTemplatePath() />

</cfcomponent>

子文件夹根代理:

<cfinclude template="../application.cfc">

当您通过root代理访问应用程序时,在application.c.cc中允许cfinclude标记的正确方法是什么?

我最初的本能是看看我是否可以动态计算应用程序根目录,幸运的是getCurrentTemplatePath()能够区分sub application.cfc和root application.cfc。但是,当您尝试通过本地文件系统链接(例如d:\ mysite \ include_me.cfm)访问它们时,cfincludes不起作用。看起来我需要以某种方式根据正在执行的application.cfc的子目录找出包含文件的动态相对位置。任何和所有的帮助表示赞赏!

2 个答案:

答案 0 :(得分:2)

我可能正在做些什么......如果这是答案,希望它能帮助那些发现自己陷入类似困境的其他人。

我注意到OnRequest()方法中的cfinclude正常处理,无论是从应用程序的根目录还是从子目录调用模板。因此,如果我将cfinclude置于方法中,我可能会正确执行。

所以不要将我的cfinclude放在我的根组件的顶部:

<cfcomponent>
    
  <cfinclude="include_me.cfm">
    
  ...

</cfcomponent>

我可以将它们放在一个单独的方法中,然后在组件中调用该方法:

<cfcomponent>
  
  <!--- call the method which includes the file --->
  <cfset includeFile() />
  
  <!--- new method for including the file --->
  <cffunction name="includeFile">
  
    <cfinclude="include_me.cfm">
    
  </cffunction>

  ...
  
</cfcomponent>

除非它包含在方法中,否则它的关键似乎不包括application.cfc中的任何内容。

答案 1 :(得分:0)

我不确定是什么导致了您所看到的内容,但您确实有一种非正统的方式来代理您的Application.cfc

这并不能解决您的问题,但这里是正确执行代理的演示,而 没有您遇到的包含路径问题。

所有代码都在这里:https://gist.github.com/daccfml/3ed091c62d688595d66e

/Application.cfc

component {
    writeOutput("#getCurrentTemplatePath()# called<br>");
    include "inc.cfm";
}

/inc.cfm

<cfoutput>#getCurrentTemplatePath()# called<br></cfoutput>

/ApplicationProxy.cfc

component extends="Application" {
    writeOutput("#getCurrentTemplatePath()# called<br>");
}

/sub/Application.cfc

component extends="ApplicationProxy" {
    writeOutput("#getCurrentTemplatePath()# called<br>");
}

/sub/test.cfm

<cfoutput>#getCurrentTemplatePath()# called<br></cfoutput>

输出:

  

C:\ wwwroot \ Application.cfc名为

     

C:\ wwwroot \ inc.cfm调用

     

C:\ wwwroot \ ApplicationProxy.cfc名为

     

C:\ wwwroot \ sub \ Application.cfc名为

     

C:\ wwwroot \ sub \ test.cfm调用

这是我所期待的。

重新排列代码以正确执行代理,并希望您的问题将会消失。如果没有,请更新您的问题,我们可以重新访问。