Есть ли у ColdFusion ответ на главные страницы ASP.NET?

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

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

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


person Joshua Carmody    schedule 02.04.2009    source источник
comment
Ха, прочитал этот вопрос, прежде чем я даже понял, кто его опубликовал. Отсутствует .Net, а?   -  person Neil N    schedule 03.04.2009


Ответы (4)


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


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

Также стоит отметить, что можно расширить/наследовать ваш 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>

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


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

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

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


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

person Peter Boughton    schedule 02.04.2009
comment
Пользовательские теги — отличная идея. Спасибо. - person Joshua Carmody; 03.04.2009
comment
Питер, офигенный пост. Одна вещь, которую вы могли бы добавить, это с помощью Application.cfc, вы можете наследовать родителя onRequestStart/End для этого прекрасного эффекта главной/дочерней/внучатой ​​страницы, вызывая суперметоды. О, и Application.cfm/OnRequestEnd.cfm и cfinclude родительский файл вместо этого. - person Nathan Strutz; 03.04.2009
comment
Никогда не думал об использовании пользовательского тега для этого ... :) круто, хорошо, что он работает быстро. - person Henry; 03.04.2009
comment
Натан: Да, наследование Application.cfc немного неудобно? Я добавлю примечание и ссылку для полноты. - person Peter Boughton; 03.04.2009
comment
Генри: Многие люди забывают о пользовательских тегах, но они могут быть очень удобными! В Railo 3.1 можно писать пользовательские теги с компонентами - у меня еще не было возможности изучить, как это работает, но это может сделать их еще более гибкими... - person Peter Boughton; 03.04.2009
comment
если не использовать структуру MVC, это проверенный и верный метод. использовал его много раз в своей карьере, а также для небольших сайтов. - person rip747; 03.04.2009
comment
Вот еще одно полезное руководство по использованию пользовательских тегов: petefreitag.com/item/64.cfm< /а> - person Keven; 04.12.2015

Разработчики 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. :-)

person Patrick McElhaney    schedule 03.04.2009
comment
Ооооооо, мне тоже нравится! Может быть, я сделаю это таким образом. +1 - person Joshua Carmody; 03.04.2009

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

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

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

person Henry    schedule 02.04.2009

проверить CFINCLUDE

person Sam Axe    schedule 02.04.2009
comment
Я использовал cfinclude для включения в заголовки, нижние колонтитулы, другие элементы и т. д., но я надеялся на что-то более мощное. - person Joshua Carmody; 02.04.2009