我正在使用Application.cfm切换到Application.cfc,我使用Ben Nadel的方法使用应用程序代理将我的应用程序扩展到子文件夹。 (link to article)
我遇到的问题是,当我在子文件夹中加载一个页面时,在根Application.cfc文件中调用的所有 cfinclude 标记都会显示“找不到包含的模板... “错误消息。 (包含是故意在组件的顶部,所以我可以设置特定于应用程序的变量)
以下是一些要求:
以下是文件结构:
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的子目录找出包含文件的动态相对位置。任何和所有的帮助表示赞赏!
答案 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调用
这是我所期待的。
重新排列代码以正确执行代理,并希望您的问题将会消失。如果没有,请更新您的问题,我们可以重新访问。