ColdFusion에는 ASP.NET의 마스터 페이지에 대한 답이 있습니까?
-
22-08-2019 - |
문제
저는 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를 확인하십시오