Есть ли у ColdFusion ответ на главные страницы ASP.NET? - PullRequest
7 голосов
/ 02 апреля 2009

Я работаю над сайтом, который был закодирован в ColdFusion. У меня есть шаблон CSS / HTML, который я хотел бы применить к содержимому каждой страницы, не дублируя больше кода, чем необходимо. Я был испорчен мастер-страницами ASP.NET, которые были бы моим предпочтительным способом реализации этого сайта. К сожалению, этот вариант для меня недоступен. Этот сайт должен работать на Coldfusion MX 7. Кроме того, разработчик, возглавляющий проект, не любит Fusebox, поэтому эта опция отсутствует.

Основная навигация, графический заголовок и нижний колонтитул будут одинаковыми на каждой странице. Тег заголовка, метатеги и навигация уровня 2, вероятно, будут отличаться от страницы к странице. Кроме того, будет отличаться только «область основного контента» страницы.

С учетом этих параметров, как я могу кодировать сайт для максимальной удобства обслуживания?

Ответы [ 4 ]

12 голосов
/ 03 апреля 2009

Существует огромное количество способов сделать это с ColdFusion.


Application.cfc выполняется для каждого запроса и имеет два метода (onRequestStart и onRequestEnd), которые можно использовать для добавления / добавления содержимого в основной сценарий на странице.

Также стоит отметить, что можно расширять / наследовать ваш Application.cfc, допуская более сложный набор событий RequestStart / End. Подробнее здесь и здесь .


Пользовательские теги позволяют вам создать тег, который можно обернуть вокруг каждого шаблона, чтобы применить макет и т. Д. Он также позволяет атрибутам / 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>

И, конечно, вы можете создать несколько пользовательских тегов или один тег, который работает несколькими способами в зависимости от указанных атрибутов.


Генри уже упоминал MVC Frameworks , но вам не нужно использовать MVC, чтобы использовать функциональность шаблонов / макетов.

Fusebox может выполнять MVC, но это не требует от вас, и в любом случае ContentVariables FB являются хорошим инструментом для реализации модульного контента - если ваш ведущий разработчик не может оправдать его неприязнь к Fusebox (и предложить альтернативу, которая лучше подходит вашему проекту!), то нет абсолютно никаких причин не идти на это - это зрелая и хорошо известная структура , простой в использовании, множество разработчиков и т. д.

Однако, если Fusebox действительно не подходит, взгляните на список фреймворков Чарли Арехарта - эта страница в целом представляет собой огромный список инструментов, на которые стоит обратить внимание.


Во всяком случае, это должно дать вам достаточно вещей, чтобы рассмотреть на данный момент ...

3 голосов
/ 03 апреля 2009

Разработчики ColdFusion начали использовать пользовательский тег cf_bodycontent в конце 90-х годов, чтобы избежать необходимости включать отдельные файлы верхнего и нижнего колонтитула. Это было за шесть или семь лет до главных страниц 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, среда ColdFusion, изобретенная в StackOverflow. : -)

1 голос
/ 03 апреля 2009

Вы можете попробовать одну из платформ MVC с поддержкой шаблонов (она есть почти у всех).

ColdBox , Модель-клей , Mach-II , Блок предохранителей ...

На этой странице сравнения портов форума Galleon на странице показано, как каждая структура обрабатывает шаблоны ...

0 голосов
/ 02 апреля 2009

проверить CFINCLUDE

...