2009-04-02 23 views
7

私はColdFusionでコーディングされたWebサイトで作業しています。必要以上にコードを複製することなく、すべてのページのコンテンツに適用したいCSS/HTMLテンプレートがあります。私はこのサイトを実装するための私の好きな方法であるASP.NETのマスターページに甘んじています。残念ながら、そのオプションは私には利用できません。このサイトはColdfusion MX 7で動作する必要があります。また、プロジェクトをリードしている開発者はFuseboxが好きではないので、オプションはありません。ColdFusionにはASP.NETのマスターページへの回答がありますか?

メインナビゲーション、グラフィカルヘッダー、フッターはすべてのページで同じになります。タイトルタグ、メタタグ、およびレベル2ナビゲーションは、ページごとに異なる可能性があります。それとは別に、ページの「メインコンテンツ領域」だけが異なるでしょう。

これらのパラメータを指定すると、メンテナンス性を最大限に高めるためにサイトをどのようにコードすることができますか?

+0

ハ、私はそれを投稿したことに気づく前に、この質問を読んでください。ネットがありませんか? –

答えて

12

のColdFusionでこれを行う方法の膨大な数があります。


Application.cfc要求ごとに実行および/ページ内のメインスクリプトにコンテンツを追加する前に付加するために使用することができる2つの方法(onRequestStartonRequestEnd)を有しています。

また注目すべきことに、あなたのApplication.cfcを拡張/継承することができ、より複雑なRequestStart/Endイベントのセットを可能にします。 More details hereおよびhere


Custom Tagsあなたは、/ etcレイアウトを適用するには、各テンプレートの周りにラップすることができ、タグを作成することができます。また、属性/ 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> 

そしてもちろん、あなたが複数のカスタムタグを作成するか、または1つのタグ作品指定された属性に応じて複数の方法で


ヘンリーはすでにMVCフレームワークを言及しているが、あなたは、テンプレート/レイアウト機能を利用するためにMVCを行う必要はありません。

FuseboxはMVCを行うことができますが、それははそうするあなたを必要としない、とFBのContentVariablesが持つモジュラーコンテンツ実装するための優れたツールですeitherway - あなたのリード開発者はヒューズボックス用彼の嫌悪感を正当化できない限り、 (そしてあなたのプロジェクトに合った代替案を提案してください!)そうでない理由は絶対にありません。成熟したよく知られたフレームワークで、使いやすく、開発者がたくさんいるなどです。

しかし、実際にはFuseboxがオプションでない場合は、Charlie Arehart's list of frameworksを参照してください。このページは一般的に見て分かるツールの巨大なリストです。あなたは今のところ考慮するのに十分なものを与える必要があります。とにかく


、...

+1

カスタムタグは素晴らしいアイデアです。ありがとうございました。 –

+0

ピーター、フリーキンの素晴らしい投稿。あなたが追加することができるのはApplication.cfcです。あなたはsuperメソッドを呼び出して、親/子/孫ページエフェクトの親onRequestStart/Endを継承できます。ああ、Application.cfm/OnRequestEnd.cfmとそれの代わりに親ファイルをcfincludeします。 –

+0

これを行うためにカスタムタグを使用することは決して考えられませんでした。 – Henry

0

CFINCLUDE

+0

私はcfincludeを使ってヘッダー、フッター、その他の要素にインクルードしましたが、もう少し強力なものを望んでいました。 –

1

をチェックアウトあなたは(ほとんどの人がそれを持っている)テンプレートをサポートしてMVCフレームワークのいずれかを試してください。

ColdBoxModel-GlueMach-IIFusebox ...

各フレームワークは、テンプレートを処理する方法をこのGalleon Forum Ports Comparisonsページのハイライト...

3

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> 

使用すると、1つのテンプレート別の「拡張」を持っているしたい場合は、多分スタックにリストを回して、各テンプレートは、スタックにその親を押すことによってそれを行うことができます。

<!--- 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で考案されたColdFusionフレームワークであるStackBoxがあります。 :-)

+0

Oooohhh、私もこれが好きです!多分私はこのようにします。 +1 –

関連する問題