2013-04-22 40 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