在cfinclude'd文件中使用相对路径

时间:2009-09-20 15:50:20

标签: coldfusion

我对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的效果就好像所包含的文件是包含器的一部分 - 这是一种优雅的简单性。但是,是否存在非病理性案例,其中人们更喜欢以这种方式解决相关联系?我可以想到我希望它们“传统上”解决的情况,即相对于它们所在的文件。也许我错过了一些东西。

2 个答案:

答案 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" />

它只是给出了如何使包括独立于当前模板位置的基本思想。

其他方式是使用映射serverdynamic(CF8 +),但这是另一个故事。

其他方式是使用单调度程序(index.cfm,page.cfm等) - 在大多数现代应用程序中使用,但它也是另一个故事。