2009-04-02 1 views
7

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

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

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

+0

Ха, прочитайте этот вопрос, прежде чем я даже понял, кто его разместил. Отсутствует .Net а? –

ответ

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> 

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


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

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

Однако, если Fusebox действительно не является вариантом, взгляните на Charlie Arehart's list of frameworks - эта страница в целом представляет собой огромный список инструментов, на которые стоит обратить внимание.


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

+1

Пользовательские теги - отличная идея. Спасибо. –

+0

Питер, отличный пост. Одна вещь, которую вы можете добавить, - это Application.cfc, вы можете наследовать родительский onRequestStart/End для этого хорошего эффекта страницы мастера/ребенка/внука, вызывая супер методы. Oh, и Application.cfm/OnRequestEnd.cfm и cfinclude родительский файл вместо этого. –

+0

Никогда не думал о том, чтобы использовать пользовательский тег для этого ... :) круто, полезно для быстрого его работы. – Henry

0

выписка CFINCLUDE

+0

Я использовал cfinclude для включения в верхние и нижние колонтитулы, другие элементы и т. Д., Но я надеялся на что-то более мощное. –

1

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

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

This Galleon Forum Ports Comparisons страницы основных моментов, как каждая структура обрабатывает шаблоны ...

3

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

+0

Ооооооооооооооооооооооо это тоже! Возможно, я сделаю это так. +1 –