ColdFusion には ASP.NET のマスター ページに対する答えがありますか?
-
22-08-2019 - |
質問
ColdFusion でコーディングされた Web サイトで作業しています。必要以上にコードを複製せずに、すべてのページのコンテンツに適用したい CSS/HTML テンプレートがあります。私は ASP.NET のマスター ページに少し甘やかされてしまいました。このサイトを実装するには、これが私にとって望ましい方法です。残念ながら、そのオプションは私には利用できません。このサイトは Coldfusion MX 7 で実行する必要があります。また、プロジェクトを主導する開発者は Fusebox を好まないため、そのオプションはありません。
メイン ナビゲーション、グラフィカル ヘッダー、フッターはどのページでも同じになります。タイトル タグ、メタ タグ、およびレベル 2 ナビゲーションは、ページごとに異なる可能性があります。それ以外では、ページの「メインコンテンツエリア」のみが異なります。
これらのパラメータを考慮すると、メンテナンス性を最大限に高めるためにサイトをコーディングするにはどうすればよいでしょうか?
解決
ColdFusion でこれを行う方法は数多くあります。
アプリケーション.cfc リクエストごとに実行され、2 つのメソッド (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>
そしてもちろん、複数のカスタム タグを作成することも、指定された属性に応じて複数の方法で機能する 1 つのタグを作成することもできます。
ヘンリーはすでに MVC について言及しました フレームワーク, ただし、テンプレート/レイアウト機能を利用するために MVC を実行する必要はありません。
ヒューズボックス MVCはできるが、できない 必要とする いずれにせよ、FB の ContentVariables はモジュール式コンテンツを実装するための優れたツールです。リード開発者がそれを実行できる場合を除きます。 正当化する 彼が 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>
こうしてあなたはStackBox、StackOverflowの上に発明のColdFusionフレームワークを持っています。 : - )
テンプレートをサポートしている MVC フレームワークの 1 つを試してみてください (ほとんどの人がそれを持っています)。
コールドボックス, モデルの接着剤, マッハII, ヒューズボックス...
これ Galleon フォーラムのポートの比較 ページでは、各フレームワークがテンプレートをどのように処理するかを強調しています...
CFINCLUDEをチェックしてください。