2009-04-02 11 views
7

Sto lavorando a un sito Web codificato in ColdFusion. Ho un modello CSS/HTML che vorrei applicare al contenuto di ogni pagina, senza duplicare altro codice del necessario. Sono stato rovinato dalle pagine master di ASP.NET, che sarebbe il mio modo preferito di implementare questo sito. Sfortunatamente, questa opzione non è disponibile per me. Questo sito deve essere eseguito su Coldfusion MX 7. Inoltre, lo sviluppatore che guida il progetto non ama Fusebox, quindi l'opzione è fuori.ColdFusion ha una risposta alle pagine master di ASP.NET?

La navigazione principale, l'intestazione grafica e il piè di pagina saranno gli stessi su ogni pagina. Il tag title, i metatag e la navigazione di livello 2 probabilmente varieranno da una pagina all'altra. A parte questo, solo l'area del contenuto principale della pagina sarà diversa.

Dati questi parametri, come posso codificare il sito per la massima manutenibilità?

+0

Ha, leggi questa domanda prima che mi rendessi conto di chi lo ha pubblicato. .Net eh? –

risposta

12

ci sono un numero enorme di modi per farlo con ColdFusion.


Application.cfc viene eseguito su ogni richiesta e ha due metodi (onRequestStart e onRequestEnd) che possono essere utilizzati per anteporre/accodare il contenuto allo script principale in una pagina.

Inoltre, è possibile estendere/ereditare Application.cfc, consentendo un insieme più complesso di eventi RequestStart/End. More details here e here.


Custom Tags permettono di creare un tag che si può avvolgere intorno ad ogni modello da applicare il layout/etc. Permette anche agli attributi/etc di definire testo comune ma cambiante.

Ad esempio:

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

E dentro il tag personalizzato (page.cfm) si ha:

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

E naturalmente è possibile creare più tag personalizzati, o di un tag che funziona in più modi a seconda degli attributi specificati.


Henry ha già menzionato MVC quadri, ma non c'è bisogno di fare MVC di avvalersi di funzionalità di template/layout.

Fusebox può fare MVC, ma non richiedono di farlo, e Eitherway ContentVariables di FB sono un ottimo strumento per l'attuazione dei contenuti modulare - a meno che il capo sviluppatore può giustificare sua avversione per Fusebox (e suggerire un'alternativa che si adatta meglio al tuo progetto!) quindi non c'è assolutamente alcun motivo per non farlo: è un framework maturo e ben noto, facile da usare, molti sviluppatori e così via.

Tuttavia, se Fusebox non è davvero un'opzione, dai un'occhiata a Charlie Arehart's list of frameworks - quella pagina in generale è un elenco enorme di strumenti che vale la pena guardare.


In ogni caso, che dovrebbe darvi abbastanza cose da prendere in considerazione per ora ...

+1

I tag personalizzati sono una grande idea. Grazie. –

+0

Peter, strano post. Una cosa che potresti aggiungere è con Application.cfc, puoi ereditare genitore onRequestStart/End per quell'effetto di pagina master/child/grandchild, chiamando metodi super. Oh, e Application.cfm/OnRequestEnd.cfm e cfincludono il file genitore al posto di quello. –

+0

Non ho mai pensato di usare tag personalizzati per fare questo ... :) fantastico, ottimo per farlo funzionare velocemente. – Henry

0

check out cfinclude

+0

Ho usato cfinclude per includere intestazioni, piè di pagina, altri elementi, ecc., Ma speravo in qualcosa di un po 'più potente. –

3

sviluppatori ColdFusion iniziato a utilizzare un tag personalizzato chiamato cf_bodycontent negli ultimi anni '90 per evitare di dover includere i file di intestazione e piè separati. Erano sei o sette anni prima delle pagine master di ASP.NET. ;-)

Ora c'è un tag nativo che fa la stessa cosa: cfsavecontent. Ecco l'essenza di come le persone usano cfsavecontent nei template.

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

Se si desidera inserire un modello in un modello, è sufficiente aggiungere un altro cfsavecontent.

È possibile refactoring per tagliare la ridondanza.

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

Se si desidera avere un modello "estendere" un altro, si poteva forse fare così girando la lista in una pila, e se ogni modello di spingere suo genitore nello stack.

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

E così avete StackBox, un framework ColdFusion inventato su StackOverflow. :-)

+0

Oooohhh, mi piace anche questo! Forse lo farò in questo modo. +1 –

Problemi correlati