Вопрос

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

Основная навигация, графический верхний и нижний колонтитулы будут одинаковыми на каждой странице.Тег заголовка, мета-теги и навигация второго уровня, скорее всего, будут отличаться от страницы к странице.Помимо этого, будет отличаться только "основная область содержимого" страницы.

Учитывая эти параметры, как я могу закодировать сайт для максимальной ремонтопригодности?

Это было полезно?

Решение

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


Применение.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 Фреймворки, но вам не нужно использовать MVC, чтобы использовать функциональность шаблонов / макета.

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

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


В любом случае, это должно дать вам достаточно поводов для размышления на данный момент...

Другие советы

Разработчики ColdFusion начали использовать пользовательский тег под названием cf_bodycontent в конце 90-х, чтобы избежать необходимости включать отдельные файлы верхнего и нижнего колонтитулов.Это было шесть или семь лет назад ASP.NET Основные страницы.;-)

Теперь есть собственный тег, который делает то же самое: cfsavecontent ( содержимое 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.:-)

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

Холодильный бокс, Модель-Клей, Мах-II, Предохранительный ящик...

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

проверьте CFINCLUDE

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top