ColdFusion 有 ASP.NET 母版页的答案吗?

发布于 2024-07-16 10:45:41 字数 329 浏览 7 评论 0 原文

我正在开发一个用 ColdFusion 编码的网站。 我有一个 CSS/HTML 模板,我想将其应用于每个页面的内容,而不重复任何不必要的代码。 我已经被 ASP.NET 的母版页宠坏了,这将是我实现该网站的首选方式。 不幸的是,这个选项对我来说不可用。 该站点必须在 Coldfusion MX 7 上运行。此外,领导该项目的开发人员不喜欢 Fusebox,因此该选项已被排除。

每个页面上的主导航、图形页眉和页脚都是相同的。 标题标签、元标签和二级导航可能因页面而异。 除此之外,只有页面的“主要内容区域”会有所不同。

给定这些参数,我如何对站点进行编码以获得最大的可维护性?

I'm working on a website that was coded in ColdFusion. I have a CSS/HTML template I would like to apply to the content of every page, without duplicating any more code than necessary. I've gotten kind of spoiled by ASP.NET's master pages, which would be my preferred way to implement this site. Unfortunately, that option is unavailable to me. This site has to run on Coldfusion MX 7. Also, the developer leading the project doesn't like Fusebox, so that option's out.

The main navigation, graphical header, and footer will be the same on every page. The title tag, meta tags, and level-2 navigation will likely vary from page to page. Aside from that, only the page's "main content area" will be different.

Given these parameters, how can I code the site for maximum maintainability?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

余生一个溪 2024-07-23 10:45:41

使用 ColdFusion 有多种方法可以实现此目的。

Application.cfc< /a> 在每个请求上执行,并有两个方法(onRequestStartonRequestEnd),可用于在主脚本中预先添加/追加内容页。

另外值得注意的是,可以扩展/继承您的 Application.cfc,从而允许一组更复杂的 RequestStart/End 事件。 更多详细信息请参见此处此处

自定义标签允许您创建标签您可以围绕每个模板来应用布局/等。 它还允许属性/等定义常见但变化的文本。

例如:

<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 框架,但您不需要使用 MVC 来使用模板/布局功能。

Fusebox 可以实现 MVC,但它不需要要求 你这样做,无论如何 FB 的 ContentVariables 都是实现模块化内容的好工具 - 除非你的首席开发人员可以证明他对 Fusebox 的不喜欢(并建议一个更适合你的项目的替代方案!)然后绝对没有理由不选择它——它是一个成熟且众所周知的框架,易于使用,有大量的开发人员,等等。

但是,如果 Fusebox 确实不是一个选择,请查看 Charlie Arehart 的框架列表 -该页面总体上是一个值得一看的工具的巨大列表。

不管怎样,这应该给你足够的东西来考虑了......

There are a huge number of ways to do this with ColdFusion.

Application.cfc is executed on every request and has two methods (onRequestStartand onRequestEnd) that can be used to prepend/append content to the main script in a page.

Also worth noting, it is possible to extend/inherit your Application.cfc, allowing for a more complex set of RequestStart/End events. More details here and here.

Custom Tags allow you to create a tag that you can wrap around each template to apply the layout/etc. It also allows attributes/etc to define common but changing text.

For example:

<cf_page PageTitle="My Page">
    [main page content]
</cf_page>

And inside the custom tag (page.cfm) you have:

<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>

And of course you can either create multiple custom tags, or one tag which works in multiple ways depending on the Attributes specified.

Henry has already mentioned MVC Frameworks, but you don't need to do MVC to make use of templating/layout functionality.

Fusebox can do MVC, but it doesn't require you to do so, and eitherway FB's ContentVariables are a good tool for implementing modular content with - unless your lead developer can justify his dislike for Fusebox (and suggest an alternative that fits your project better!) then there is absolutely no reason not to go for it - it is a mature and well-known framework, easy to use, plenty of developers, and so on.

However, if Fusebox really is not an option, take a look at Charlie Arehart's list of frameworks - that page in general is a huge list of tools worth looking at.

Anyway, that should give you enough things to consider for now...

习惯那些不曾习惯的习惯 2024-07-23 10:45:41

ColdFusion 开发人员在 90 年代末开始使用名为 cf_bodycontent 的自定义标记,以避免必须包含单独的页眉和页脚文件。 那是 ASP.NET 母版页出现的六七年。 ;-)

现在有一个本机标记可以执行相同的操作: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 框架。 :-)

ColdFusion developers started using a custom tag called cf_bodycontent in the late 90s to avoid having to include separate header and footer files. That was six or seven years before ASP.NET's Master Pages. ;-)

Now there's a native tag that does the same thing: cfsavecontent. Here's the essence of how people use cfsavecontent in templates.

   <!--- 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

If you want put a template within a template, just add another 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>         

You could refactor to cut out the redundancy.

   <!--- 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>  

If you want to have one template "extend" another, you could maybe do so by turning the list into a stack, and having each template push its parent onto the stack.

  <!--- 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> 

And thus you have StackBox, a ColdFusion framework invented on StackOverflow. :-)

谁的新欢旧爱 2024-07-23 10:45:41

您可以尝试一种支持模板的 MVC 框架(几乎每个人都有它)。

ColdBox模型胶Mach-IIFusebox...

这个Galleon 论坛端口比较 页面重点介绍了每个框架如何处理模板...

You may try one of the MVC frameworks with template support (almost everyone has it).

ColdBox, Model-Glue, Mach-II, Fusebox...

This Galleon Forum Ports Comparisons page highlights how each framework handles Templates...

遥远的绿洲 2024-07-23 10:45:41

查看CFINCLUDE

check out CFINCLUDE

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文