2009-04-02 9 views
7

Ich arbeite an einer Website, die in ColdFusion codiert wurde. Ich habe eine CSS/HTML-Vorlage, die ich auf den Inhalt jeder Seite anwenden möchte, ohne mehr Code als nötig zu duplizieren. Ich bin durch die Masterseiten von ASP.NET ziemlich verwöhnt worden, was meine bevorzugte Methode zur Implementierung dieser Website wäre. Leider ist diese Option für mich nicht verfügbar. Diese Site muss auf Coldfusion MX 7 ausgeführt werden. Außerdem mag der Entwickler, der das Projekt leitet, Fusebox nicht, also ist diese Option aus.Hat ColdFusion eine Antwort auf die ASP.NET-Masterseiten?

Die Hauptnavigation, die grafische Kopfzeile und die Fußzeile sind auf jeder Seite gleich. Das Title-Tag, Meta-Tags und Level-2-Navigation werden wahrscheinlich von Seite zu Seite variieren. Abgesehen davon wird nur der "Hauptinhaltsbereich" der Seite unterschiedlich sein.

Wie kann ich diese Site für maximale Wartbarkeit codieren?

+0

Ha, lies diese Frage, bevor ich überhaupt merkte, wer es gepostet hat. Vermisst .Net wie? –

Antwort

12

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 (onRequestStart und onRequestEnd), die verwendet werden können, um Inhalte an die Haupt-Skript auf einer Seite prepend/anhängen.

Es ist auch erwähnenswert, dass es möglich ist, Ihre Application.cfc zu erweitern/zu erben, was einen komplexeren Satz von RequestStart/End-Ereignissen ermöglicht. More details here und here.


Custom Tags können Sie einen Tag erstellen, die Sie um jede Vorlage wickeln können das Layout/etc anzuwenden. Außerdem können Attribute/etc gemeinsamen, aber sich ändernden Text definieren.

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 mehrere benutzerdefinierte Tags erstellen können, oder Tag eine, die funktioniert auf verschiedene Arten abhängig von den angegebenen Attributen.


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

Fusebox kann MVC tun, aber es funktioniert nicht benötigen Sie so zu tun, und FB des ContentVariables sind ein gutes Werkzeug für die Realisierung modularer Inhalte mit Eitherway - es sei denn, Ihr Hauptentwickler für Fusebox rechtfertigen seine Abneigung (und schlagen Sie eine Alternative vor, die zu Ihrem Projekt passt!), dann gibt es absolut keinen Grund, nicht darauf einzugehen - es ist ein ausgereiftes und bekanntes Framework, einfach zu bedienen, viele Entwickler und so weiter.

Allerdings, wenn Fusebox wirklich keine Option ist, werfen Sie einen Blick auf Charlie Arehart's list of frameworks - diese Seite im Allgemeinen ist eine riesige Liste von Tools, die einen Blick wert sind.


Wie auch immer, das sollte man genug Dinge gibt jetzt zu prüfen ...

+1

Benutzerdefinierte Tags sind eine großartige Idee. Vielen Dank. –

+0

Peter, verdammt gute Post. Eine Sache, die Sie hinzufügen können, ist mit Application.cfc, Sie können Eltern onRequestStart/End für diesen netten Master/Kind/Enkel-Seiteneffekt erben, Super Methoden aufrufen. Oh, und Application.cfm/OnRequestEnd.cfm und cfinde die Elterndatei anstelle davon. –

+0

Nie daran gedacht, ein benutzerdefiniertes Tag zu verwenden ... :) cool, gut, damit es schnell funktioniert. – Henry

0

Check-out cfinclude

+0

Ich habe cfinclude verwendet, um in Kopfzeilen, Fußzeilen, andere Elemente, usw. einzuschließen, aber ich hatte auf etwas ein wenig leistungsfähigeres gehofft. –

3

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 vor den ASP.NET-Masterseiten. ;-)

Jetzt gibt es ein natives Tag, das das gleiche tut: cfsavecontent. Hier ist die Essenz der Verwendung von cfsavecontent in Templates.

<!--- 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 eine Vorlage einfügen möchten, fügen Sie einfach einen weiteren cfsavecontent hinzu.

<!--- 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 umgestalten, um die Redundanz auszuschalten.

<!--- 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, Sie vielleicht so tun könnten, um 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, ein ColdFusion-Framework auf StackOverflow erfunden. :-)

+0

Oooohhh, das gefällt mir auch! Vielleicht werde ich es so machen. +1 –