Frage

Ich arbeite auf einer Website, die in Coldfusion codiert wurde. Ich habe eine CSS / HTML-Vorlage Ich mag würde auf den Inhalt jeder Seite bewerben, ohne mehr Code als nötig zu duplizieren. Ich habe Art verdorben von Masterseite des ASP.NET bekommen, die meine bevorzugte Art und Weise wäre, diese Website zu implementieren. Leider ist diese Option für mich nicht verfügbar. Diese Seite hat auf Coldfusion MX 7 Auch der Entwickler führt das Projekt auszuführen ist Fusebox nicht gefällt, so dass Option ist out.

Die Hauptnavigation, grafische Kopf- und Fußzeile werden das gleiche auf jeder Seite sein. Der Titel-Tag, Meta-Tags und Level-2-Navigation variieren wahrscheinlich von Seite zu Seite. Abgesehen davon, dass nur die Seite „Hauptinhalt“ wird anders sein.

Diese Parameter gegeben, wie kann ich die Website für maximale Wartbarkeit Code?

War es hilfreich?

Lösung

Es gibt eine große Anzahl von Möglichkeiten, dies mit Coldfusion zu tun.


Application.cfc wird bei jeder Anfrage ausgeführt und verfügt über zwei Methoden (onRequestStartand onRequestEnd), die verwendet werden können, um Inhalte an die Haupt-Skript auf einer Seite prepend / anhängen.

Auch erwähnenswert ist es möglich, Ihre Application.cfc zu verlängern / erben, so dass für eine komplexe Reihe von RequestStart / Ende Veranstaltungen. Weitere Details hier und hier .


Benutzerdefinierte Schlagwörter können Sie einen Tag erstellen dass Sie um jede Vorlage wickeln Sie das Layout / etc anzuwenden. Es ermöglicht auch Attribute / etc zu definieren gemeinsamen, aber ändernden Text.

Zum Beispiel:

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

Und innerhalb des benutzerdefinierten Tags (page.cfm) Sie haben:

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

Und natürlich können Sie entweder mehr benutzerdefinierten Tags erstellen, oder ein Etikett, das auf den Attributen in vielfältiger Weise arbeitet abhängig angegeben.


Henry hat bereits MVC erwähnt Frameworks , aber Sie brauchen nicht MVC zu tun Verwendung von Templat / Layout-Funktionalität zu machen.

Fusebox kann MVC tun, aber es funktioniert nicht erfordern Sie, dies zu tun, und eitherway FBs ContentVariables ein gutes Werkzeug für die Realisierung modularer Inhalte mit - es sei denn, Ihr Hauptentwickler können rechtfertigen seine Abneigung gegen Fusebox (und eine Alternative vorschlagen, dass Ihr Projekt passt besser !), dann gibt absolut keinen Grund gibt nicht für ihn zu gehen -. es ein ausgereiften und bekannte Rahmen, einfach zu bedienen, viele Entwickler ist, und so weiter

Wenn jedoch Fusebox wirklich keine Option ist, werfen Sie einen Blick auf Charlie Arehart Liste von Frameworks - die Seite im allgemeinen ist eine riesige Liste von Tools, lohnt ein Blick auf

.


Wie auch immer, das sollte man genug Dinge gibt jetzt zu betrachten ...

Andere Tipps

Coldfusion-Entwickler begonnen, einen benutzerdefinierten Tag genannt cf_bodycontent in den späten 90er Jahren mit zu vermeiden, getrennten Kopf- und Fußzeile-Dateien enthalten. Das war sechs oder sieben Jahre, bevor ASP.NET Masterseiten. ; -)

Jetzt gibt es eine native-Tag, das die gleiche Sache tut: cfsavecontent . Hier ist die Essenz, wie Menschen benutzen cfsavecontent in Vorlagen.

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

Wenn Sie eine Vorlage in einer Vorlage setzen wollen, fügen Sie einfach einen weiteren 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>         

Sie könnten Refactoring die Redundanz auszuschneiden.

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

Wenn Sie eine Vorlage haben wollen „verlängern“ eine andere, könnte man vielleicht so tun, indem Sie die Liste in einen Stapel drehen, und mit jeder Schablone schiebt ihre Mutter auf den Stapel.

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

Und so haben Sie Stackbox, einen Coldfusion-Framework erfunden auf Stackoverflow. : -)

Sie können versuchen, eine des MVC-Frameworks mit Template-Unterstützung (fast jeder hat es).

ColdBox , Modell-Kleber , Mach-II , < a href = "http://www.fusebox.org/" rel = "nofollow noreferrer"> Fusebox ...

Die Galleon Forum Ports Vergleiche Seite zeigt, wie jeder Rahmen Griffe Vorlagen. ..

Besuche cfinclude

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top