문제

저는 ColdFusion으로 코딩된 웹사이트에서 작업하고 있습니다.필요한 것보다 더 많은 코드를 복제하지 않고 모든 페이지의 콘텐츠에 적용하고 싶은 CSS/HTML 템플릿이 있습니다.나는 이 사이트를 구현하는 데 내가 선호하는 방법인 ASP.NET의 마스터 페이지 때문에 버릇이 없어졌습니다.안타깝게도 해당 옵션을 사용할 수 없습니다.이 사이트는 Coldfusion MX 7에서 실행되어야 합니다.그리고 프로젝트를 주도하는 개발자가 Fusebox를 좋아하지 않아서 해당 옵션은 제외되었습니다.

기본 탐색, 그래픽 머리글 및 바닥글은 모든 페이지에서 동일합니다.제목 태그, 메타 태그 및 레벨 2 탐색은 페이지마다 다를 수 있습니다.그 외에도 페이지의 "주 콘텐츠 영역"만 달라집니다.

이러한 매개변수가 주어지면 유지 관리 가능성을 최대화하기 위해 사이트를 어떻게 코딩할 수 있습니까?

도움이 되었습니까?

해결책

ColdFusion을 사용하면 이를 수행하는 방법이 엄청나게 많습니다.


애플리케이션.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>

물론 여러 개의 사용자 정의 태그를 생성하거나 지정된 속성에 따라 여러 방식으로 작동하는 하나의 태그를 생성할 수도 있습니다.


Henry는 이미 MVC에 대해 언급했습니다. 프레임워크, 하지만 템플릿/레이아웃 기능을 사용하기 위해 MVC를 수행할 필요는 없습니다.

퓨즈 박스 MVC를 할 수 있지만 그렇지 않습니다 필요하다 그렇게 해야 하며, 어느 쪽이든 FB의 ContentVariables는 리드 개발자가 할 수 없는 한 모듈식 콘텐츠를 구현하기 위한 좋은 도구입니다. 신이 옳다고 하다 Fusebox에 대한 그의 혐오감(그리고 귀하의 프로젝트에 더 잘 맞는 대안을 제안하십시오!)이라면 Fusebox를 선택하지 않을 이유가 전혀 없습니다. Fusebox는 성숙하고 잘 알려진 프레임워크이며 사용하기 쉽고 많은 개발자가 있습니다.

그러나 Fusebox가 실제로 옵션이 아닌 경우 다음을 살펴보십시오. Charlie Arehart의 프레임워크 목록 - 일반적으로 해당 페이지는 살펴볼 가치가 있는 도구의 거대한 목록입니다.


어쨌든, 지금으로서는 고려해야 할 사항이 충분할 것입니다...

다른 팁

ColdFusion 개발자는 90 년대 후반에 CF_BodyContent라는 사용자 정의 태그를 사용하여 별도의 헤더 및 바닥 글 파일을 포함하지 않아도됩니다. ASP.NET의 마스터 페이지가 6 년에서 7 년 전이었습니다. ;-)

이제 같은 일을하는 기본 태그가 있습니다. 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> 

따라서 stackoverflow에 발명 된 콜드 퓨전 프레임 워크 인 Stackbox가 있습니다. :-)

템플릿 지원이 포함 된 MVC 프레임 워크 중 하나를 시도 할 수 있습니다 (거의 모든 사람이 있습니다).

콜드 박스, 모델 글루, Mach-II, 퓨즈 박스...

이것 Galleon Forum Ports 비교 페이지는 각 프레임 워크가 템플릿을 처리하는 방법을 강조합니다 ...

cfinclude를 확인하십시오

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top