2009-04-02 16 views
7

Tôi đang làm việc trên một trang web được mã hóa trong ColdFusion. Tôi có một mẫu CSS/HTML tôi muốn áp dụng cho nội dung của mỗi trang, mà không cần sao chép bất kỳ mã nào nhiều hơn mức cần thiết. Tôi đã nhận được loại hư hỏng bởi trang chủ của ASP.NET, đó sẽ là cách ưa thích của tôi để thực hiện trang web này. Thật không may, tùy chọn đó không có sẵn cho tôi. Trang web này phải chạy trên Coldfusion MX 7. Ngoài ra, nhà phát triển dẫn đầu dự án không thích Fusebox, vì vậy mà tùy chọn của ra ngoài.Coldfusion có câu trả lời cho trang chủ của ASP.NET không?

Điều hướng chính, tiêu đề đồ họa và chân trang sẽ giống nhau trên mọi trang. Thẻ tiêu đề, thẻ meta và điều hướng cấp 2 có thể thay đổi từ trang này sang trang khác. Bên cạnh đó, chỉ "vùng nội dung chính" của trang sẽ khác nhau.

Với các thông số này, làm cách nào để tôi có thể mã trang web để duy trì tối đa?

+0

Ha, đọc câu hỏi này trước khi tôi nhận ra ai đã đăng nó. Thiếu. Net eh? –

Trả lời

12

Có một số lượng lớn các cách để làm điều này với ColdFusion.


Application.cfc được thực hiện trên tất cả các yêu cầu và có hai phương pháp (onRequestStartonRequestEnd) có thể được sử dụng để thêm vào trước/bổ sung nội dung vào kịch bản chính trong một trang.

Cũng đáng chú ý, có thể mở rộng/kế thừa Application.cfc của bạn, cho phép tập hợp các sự kiện RequestStart/End phức tạp hơn. More details herehere.


Custom Tags cho phép bạn tạo một thẻ mà bạn có thể quấn quanh mỗi mẫu để áp dụng cách bố trí/etc. Nó cũng cho phép các thuộc tính/etc xác định văn bản phổ biến nhưng thay đổi.

Ví dụ:

<cf_page PageTitle="My Page"> 
    [main page content] 
</cf_page> 

Và bên trong thẻ tùy chỉnh (page.cfm) bạn có:

<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> 

Và tất nhiên bạn có thể tạo nhiều thẻ tùy chỉnh, hoặc một thẻ mà làm việc theo nhiều cách tùy thuộc vào Thuộc tính được chỉ định.

Henry đã đề cập MVC Frameworks, nhưng bạn không cần phải làm MVC để sử dụng chức năng templating/layout.

Fusebox thể làm MVC, nhưng nó không đòi hỏi bạn làm như vậy, và eitherway ContentVariables FB của là một công cụ tốt cho việc thực hiện nội dung mô đun với - trừ khi phát triển dẫn của bạn có thể biện minh không thích mình cho Fusebox (và đề xuất một giải pháp thay thế phù hợp với dự án của bạn tốt hơn!) thì hoàn toàn không có lý do gì để không làm điều đó - nó là một khuôn khổ hoàn thiện và nổi tiếng, dễ sử dụng, nhiều nhà phát triển, v.v.

Tuy nhiên, nếu Fusebox thực sự không phải là một tùy chọn, hãy xem Charlie Arehart's list of frameworks - trang đó nói chung là danh sách rất lớn các công cụ đáng xem.


Dù sao, đó sẽ cho bạn đủ điều cần xem xét cho bây giờ ...

+1

Thẻ tùy chỉnh là một ý tưởng tuyệt vời. Cảm ơn bạn. –

+0

Peter, bài đăng tuyệt vời của freakin. Một điều bạn có thể thêm là với Application.cfc, bạn có thể kế thừa cha mẹ onRequestStart/End cho hiệu ứng trang chủ/con/cháu tốt đẹp đó, gọi các phương thức siêu. Oh, và Application.cfm/OnRequestEnd.cfm và cfinclude các tập tin phụ huynh thay cho điều đó. –

+0

Không bao giờ nghĩ đến việc sử dụng thẻ tùy chỉnh để thực hiện việc này ... :) tuyệt vời, tốt để làm cho nó hoạt động nhanh chóng. – Henry

0

xem CFINCLUDE

+0

Tôi đã sử dụng cfinclude để đưa vào đầu trang, chân trang, các yếu tố khác, v.v., nhưng tôi đã hy vọng điều gì đó mạnh mẽ hơn một chút. –

3

nhà phát triển ColdFusion bắt đầu sử dụng một thẻ tùy chỉnh được gọi cf_bodycontent vào cuối những năm 90 để tránh việc phải bao gồm header và footer tập tin riêng biệt. Đó là sáu hoặc bảy năm trước khi trang Master của ASP.NET. ;-)

Bây giờ, có một thẻ gốc hoạt động tương tự: cfsavecontent. Đây là bản chất của cách mọi người sử dụng cfsavecontent trong các mẫu.

<!--- 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 

Nếu bạn muốn đặt mẫu trong mẫu, chỉ cần thêm một cfsavecontent khác.

<!--- 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>   

Bạn có thể cấu trúc lại để cắt bỏ sự thừa.

<!--- 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> 

Nếu bạn muốn có một mẫu "kéo dài" khác, bạn có thể có thể làm như vậy bằng cách chuyển danh sách vào một chồng, và có mỗi mẫu đẩy mẹ vào stack.

<!--- 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> 

Và do đó bạn có StackBox, khuôn khổ ColdFusion được phát minh trên StackOverflow. :-)

+0

Oooohhh, tôi cũng thích điều này! Có lẽ tôi sẽ làm theo cách này. +1 –