我正在开发一个用ColdFusion编码的网站。我有一个CSS / HTML模板我想应用于每个页面的内容,而不需要复制任何超过必要的代码。我已经被ASP.NET的母版所破坏了,这将是我实现这个网站的首选方式。不幸的是,我无法使用该选项。这个网站必须在Coldfusion MX 7上运行。此外,领导该项目的开发人员不喜欢Fusebox,因此该选项已经完成。
每个页面上的主导航,图形页眉和页脚都是相同的。标题标签,元标记和二级导航可能因页面而异。除此之外,只有页面的“主要内容区域”才会有所不同。
鉴于这些参数,我如何对网站进行编码以获得最大的可维护性?
答案 0 :(得分:12)
使用ColdFusion有很多方法可以做到这一点。
Application.cfc 在每个请求上执行,并有两个方法(onRequestStart
和onRequestEnd
),可用于在页面中为主脚本添加/附加内容
另外值得注意的是,可以扩展/继承Application.cfc,从而允许更复杂的RequestStart / End事件集。 More details here和here。
Custom Tags 允许您创建一个标记,您可以围绕每个模板来应用布局/等。它还允许属性/ etc定义常见但不断变化的文本。
例如:
<cf_page PageTitle="My Page">
[main page content]
</cf_page>
在自定义标记(page.cfm)中,您有:
<cfif ThisTag.ExecutionMode EQ 'start'>
<cfparam name="Attributes.PageTitle" default=""/>
<cfcontent reset/><cfoutput><!DOCTYPE html>
<html>
<head>
<title>My Website - #Attributes.PageTitle</title>
[styles and scripts and stuff]
</head>
<body>
<div id="heading">
<img src="my_website_logo.png" alt="My Website"/>
</div>
<ul id="mainmenu" class="nav">
[menu]
</ul>
<h1>#Attribute.PageTitle#</h1>
</cfoutput>
<cfelse>
<cfoutput>
<div id="footer">
[footer]
</div>
</body></html></cfoutput>
</cfif>
当然,您可以创建多个自定义标记,也可以根据指定的属性以多种方式工作。
Henry已经提到过MVC Frameworks ,但是您不需要使用MVC来使用模板/布局功能。
Fusebox 可以做MVC,但它不会要求你这样做,并且无论如何FB的ContentVariables是用于实现模块化内容的好工具 - 除非您的首席开发人员能够证明他不喜欢Fusebox(并建议一个更适合您项目的替代方案!)然后绝对没有理由不这样做 - 它是一个成熟且众所周知的框架,易于使用,大量开发人员等等。
但是,如果Fusebox真的不是一个选项,请看一下Charlie Arehart's list of frameworks - 该页面通常是一个值得查看的大量工具列表。
无论如何,这应该给你足够的东西来考虑...
答案 1 :(得分:3)
ColdFusion开发人员在90年代后期开始使用名为cf_bodycontent的自定义标记,以避免必须包含单独的页眉和页脚文件。那是在ASP.NET的Master Pages之前的六七年。 ; - )
现在有一个本机标签可以做同样的事情: cfsavecontent 。以下是人们如何在模板中使用cfsavecontent的本质。
<!--- index.cfm --->
<cfsavecontent variable="content">
<cfinclude template="#url.action#.cfm">
</cfsavecontent>
<cfinclude template="template.cfm">
<!--- template.cfm --->
<cfparam name="title" default="Welcome">
<html>
<head><cfoutput>#title#</cfoutput></head>
<body>
... header, menu, sidebar, whatever ...
<cfoutput>#content#</cfoutput>
... right column, footer ...
</body>
</html>
<!--- foo.cfm --->
<cfset title="Welcome to Foo">
Hello World! I'm the page at index.cfm?action=foo
<!--- bar.cfm --->
<cfset title="Welcome to Bar">
Hello World! I'm the page at index.cfm?action=bar
如果要在模板中放置模板,只需添加另一个cfsavecontent。
<!--- index.cfm --->
<cfsavecontent variable="content">
<cfinclude template="#url.action#.cfm">
</cfsavecontent>
<cfsavecontent variable="content">
<cfinclude template="internal_template.cfm">
</cfsavecontent>
<cfsavecontent variable="content">
<cfinclude template="master_template.cfm">
</cfsavecontent>
<cfoutput>#content#</cfoutput>
你可以重构以减少冗余。
<!--- index.cfm --->
<cfsavecontent variable="content">
<cfinclude template="#url.action#.cfm">
</cfsavecontent>
<cfparam name="templates" default="internal,master">
<cfloop list="#templates#" index="t">
<cfsavecontent variable="content">
<cfinclude template="#t#_template.cfm">
</cfsavecontent>
</cfloop>
<cfoutput>#content#</cfoutput>
如果你想让一个模板“扩展”另一个模板,你可以通过将列表转换为堆栈,并让每个模板将其父项推送到堆栈中来实现。
<!--- internal_template.cfm --->
<cfset templates = listAppend("master", templates)>
...
<cfoutput>#content#</cfoutput>
...
<!--- index.cfm --->
<cfsavecontent variable="content">
<cfinclude template="#url.action#.cfm">
</cfsavecontent>
<cfparam name="templates" default="internal">
<cfloop condition="listlen(templates) gt 0">
<cfset t = listFirst(templates)>
<cfset templates = listRest(templates)>
<cfsavecontent variable="content">
<cfinclude template="#t#_template.cfm">
</cfsavecontent>
</cfloop>
<cfoutput>#content#</cfoutput>
因此你有StackBox,一个在StackOverflow上发明的ColdFusion框架。 : - )
答案 2 :(得分:1)
您可以尝试使用模板支持的MVC框架之一(几乎每个人都拥有它)。
ColdBox,Model-Glue,Mach-II,Fusebox ......
此Galleon Forum Ports Comparisons页面突出显示了每个框架如何处理模板...
答案 3 :(得分:0)
查看CFINCLUDE