我对ColdFusion有些新意,我正在尝试了解使用cfinclude'd文件的最佳方法。我发现限制的是文件包含在内,就好像它们是包含模板的一部分一样。这很简单,但这意味着包含文件中的任何相对路径都是相对于包含器解析的,而不是包含的文件。这在以下文件布局中成为问题:
a.cfm <--- cfincludes b.cfm
b.cfm <--- cfincludes c.cfm
c.cfm
somedir/d.cfm <--- cfincludes ../b.cfm
当a.cfm包含b.cfm时,一切运行良好。当d.cfm包含../b.cfm时,c.cfm的b.cfm中的include将失败,因为它是相对于d.cfm解析的。所以,我的启发有两个问题:
CF的最佳做法是“您希望从其他文件中包含的文件不应包含相关链接”吗?
我正在努力理解设计决策。我理解cfinclude的效果就好像所包含的文件是包含器的一部分 - 这是一种优雅的简单性。但是,是否存在非病理性案例,其中人们更喜欢以这种方式解决相关联系?我可以想到我希望它们“传统上”解决的情况,即相对于它们所在的文件。也许我错过了一些东西。
答案 0 :(得分:3)
解释此问题的最佳方法是将包含(以任何语言)处理为服务器端复制/粘贴。这就是ColdFusion,ASP,PHP,.NET的情况,你可以命名它......包含的文件被认为是在它的父页面的上下文中运行。服务器基本上获取包含的文件的内容并将其粘贴到父文件中。
您最好的选择是使用根相对路径,以确保路径始终指向正确的位置,如果您要包含具有自己的包含的文件。
丹
答案 1 :(得分:2)
基本上这个主题涉及by manual。但只是为了表明使用的想法。假设我们的申请位于http://localhost/myapp/
这只是特殊的ColdFusion路径功能:这里的“绝对”路径是web-root的“/ myapp /".
然后在Application.cfc(Application.cfm)中,您可以定义基本URL:
<!--- hardcoded --->
<cfset application.basePath = "/myapp/" />
<!--- more intelligent --->
<cfset application.basePath = GetDirectoryFromPath(CGI.SCRIPT_NAME) />
并且每次都包含模板
<cfinclude template="#application.basePath#b.cfm" />
它只是给出了如何使包括独立于当前模板位置的基本思想。
其他方式是使用映射server或dynamic(CF8 +),但这是另一个故事。
其他方式是使用单调度程序(index.cfm,page.cfm等) - 在大多数现代应用程序中使用,但它也是另一个故事。