7

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

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

これらのパラメーターが与えられた場合、保守性を最大限に高めるためにサイトをコーディングするにはどうすればよいでしょうか?

4

4 に答える 4

12

ColdFusion でこれを行う方法は多数あります。


Application.cfcはリクエストごとに実行され、ページ内のメイン スクリプトにコンテンツを追加/追加するために使用できるonRequestStartおよびonRequestEnd

また、Application.cfc を拡張/継承して、より複雑な RequestStart/End イベントのセットを可能にすることもできます。詳細はこちらこちら


カスタムタグを使用すると、各テンプレートをラップしてレイアウトなどを適用できるタグを作成できます。また、attributes/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 つのタグを作成することもできます。


Henry はすでに MVC Frameworksについて言及していますが、テンプレート化/レイアウト機能を利用するために MVC を実行する必要はありません。

Fuseboxは MVC を実行できますが、MVCを実行する必要はありません。いずれにせよ、FB の ContentVariables はモジュラー コンテンツを実装するための優れたツールです。主任開発者が Fusebox に対する嫌悪感を正当化できない限り(そして、プロジェクトにより適した代替案を提案する!) そうすれば、それを使わない理由はまったくありません。成熟したよく知られたフレームワークであり、使いやすく、多くの開発者がいるなどです。

ただし、Fusebox が実際に選択肢にない場合は、Charlie Arehart のフレームワークのリストを参照してください。このページは、一般的に見る価値のあるツールの巨大なリストです。


とにかく、今のところ考慮すべきことは十分にあるはずです...

于 2009-04-02T20:43:02.687 に答える
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 ができました。:-)

于 2009-04-03T14:05:40.963 に答える
0

CFINCLUDEをチェックしてください

于 2009-04-02T19:40:56.347 に答える