2013-04-22 74 views
1

好吧,我有我知道将需要为<cfoutput>标签之间的模板文件,但是放置<cfinclude>围绕<cfoutput>标签将无法正常工作,以及任何与<cfmodule>不会为工作不允许我操作variables范围。cfInclude没有CFOUTPUT标签

因此,任何想法 - 无论多么复杂 - 这将允许我包含这样一个模板文件,并让它的行为好像在<cfoutput>标签之间一样?


位方面的:它是一个“框架”我的工作,并要求每一个模板文件开头和<cfoutput>标签结束似乎成为名副其实的垃圾,尤其因为少了“coldfusiony”模板文件看起来,更好的海事组织。

+2

据我所知''必须在同一个.CFM而且也没有办法解决它。除非你在阅读你的.cfm文件的时候进行一些动态编程,然后编写一个新的.cfm文件,这个文件的文件名是'' – Henry 2013-04-22 21:01:39

+0

这绝对是一种选择,虽然性能会受到影响。我在评估电话(仅限于表达式)的背景下考虑了这个选项,实际上编写一个文件会更加昂贵:( – 2013-04-22 21:19:55

+0

我不知道这是这种情况,所以我考虑回答论坛上的问题教育 – 2013-04-22 21:39:47

回答

6

我打算建议render()选项,但要注意的是,在OpenBDML中(或者他们想调用他们的CFML版本)是一个血淋淋的可怕功能,我认为应该避免。我看不出它如何不会导致CFML重新编译每一个请求,这是一个很大的开销。我认为当它被保存/读取以将其打包/解包为<cfoutput>标记时,修改标记会更好,这样,只有当文件实际发生更改时,才会重新编译生成的CFML。这会比阅读的时间少得多。

由您的问题提示,我做了a bit of a write up on the CFML compile process,说明为什么在单独的文件中使用<cfoutput>标签不起作用。抱歉,花了这么长的时间写下&后续跟这里。

+0

在本质上我意识到,这是我在我自己的答案指出,我表示希望这一事实,在页面的CFML是相对简单的将最大限度地减少的情况下开销,但我想我会在这方面做一些基准测试(比较散列+写入磁盘来渲染()而不需要'版本'文件)。 – 2013-04-23 07:26:47

+0

哦,是的,我的意思是“作为一个通用的解决方案”,我认为render()是一个可怕的前景,类似于评估()。然而,只要记住这一点,如果事实证明它完全适合你的情况,那么不要让任何教条或手段阻止你使用它。我认为以此为基准是个好主意;但同样要记住,对内容进行更改的代码可能比读取内容的代码更好。听起来好像你无论如何都有好的处理方式。我希望至少我的评论是值得思考的! – 2013-04-23 10:35:46

0

找到一个OpenBD解决这个问题的具体方法。显然我不是唯一遇到这个问题的人,OpenBD包含一个有用的render(),它负责评估cfml内容。所以我结束了

<cfset cfml = fileRead(expandPath(...))> 
... 
<cfoutput>#render("<cfoutput>"&cfml&"</cfoutput>")#</cfoutput> 

这不是一个漂亮的解决方案,因为我破坏了每页编译引擎原本做,但是作为CFML是在这些网页上我认为这种相对简单的没有太多的一个问题。至少它应该比实际将文件写入磁盘的性能要低。

+0

将实际的文件写入磁盘将会编译成一个长期运行良好的类。只要写一次,直到修改。 :) – Henry 2013-04-22 23:09:37

+0

“写一次直到修改” - >这将需要我跟踪文件的以前的状态,并将其与本身也可能导致相当大的开销的状态进行比较(尤其是因为我必须跟踪这在文件系统上(没有数据库访问))。 – 2013-04-23 07:27:57

+0

这就是为什么我更喜欢手动'?INIT = TRUE; – Henry 2013-04-23 15:39:10

1

我们在车轮做的仅仅是包裹cfinclude与cfsavecontent标签

<cffunction name="renderInclude"> 
    <cfargument name="template" value="string" required="true"> 
    <cfset var myOutput = ""> 

    <cfsavecontent variable="myOutput"><cfoutput><cfinclude template="#arguments.template#"></cfoutput></cfsavecontent> 


    <cfreturn trim(myOutput)> 
</cffunction> 
+0

这是一个非常聪明的解决方案。 – TheGerm 2014-08-27 18:26:18