2009-04-02 5 views
7

Je travaille sur un site Web qui a été codé dans ColdFusion. J'ai un modèle CSS/HTML que je voudrais appliquer au contenu de chaque page, sans dupliquer plus de code que nécessaire. J'ai été un peu gâté par les pages maîtres d'ASP.NET, ce qui serait ma façon préférée d'implémenter ce site. Malheureusement, cette option n'est pas disponible pour moi. Ce site doit fonctionner sur Coldfusion MX 7. De plus, le développeur qui dirige le projet n'aime pas Fusebox, donc cette option est désactivée.Est-ce que ColdFusion a une réponse aux pages maîtres d'ASP.NET?

La navigation principale, l'en-tête graphique et le pied de page seront les mêmes sur chaque page. La balise de titre, les métabalises et la navigation de niveau 2 varieront probablement d'une page à l'autre. En dehors de cela, seule la "zone de contenu principal" de la page sera différente.

Compte tenu de ces paramètres, comment puis-je coder le site pour une maintenabilité maximale?

+0

Ha, lisez cette question avant même de savoir qui l'a posté. Manquant .Net hein? –

Répondre

12

Il y a un grand nombre de façons de le faire avec ColdFusion.


Application.cfc est exécuté sur chaque demande et a deux méthodes (onRequestStart et onRequestEnd) qui peuvent être utilisés pour préfixer/ajouter du contenu au script principal dans une page.

À noter également, il est possible d'étendre/hériter votre application.cfc, permettant un ensemble plus complexe d'événements RequestStart/End. More details here et here.


Custom Tags vous permettent de créer une étiquette que vous pouvez enrouler autour de chaque modèle pour appliquer la mise en page/etc. Il permet également aux attributs/etc de définir un texte commun mais changeant.

Par exemple:

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

Et dans la balise personnalisée (page.cfm) vous avez:

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

Et bien sûr, vous pouvez créer plusieurs balises personnalisées ou une étiquette qui fonctionne de plusieurs façons en fonction des attributs spécifiés.


Henry a déjà mentionné MVC Cadres, mais vous n'avez pas besoin de faire MVC pour utiliser la fonctionnalité templating/mise en page.

Fusebox peut faire MVC, mais il n'a pas besoin que vous de le faire, et Eitherway les ContentVariables de FB sont un bon outil pour la mise en œuvre du contenu modulaire - à moins que votre développeur principal peut justifier son aversion pour Fusebox (et suggérez une alternative qui correspond mieux à votre projet!) alors il n'y a absolument aucune raison de ne pas y aller - c'est un framework mature et bien connu, facile à utiliser, plein de développeurs, et ainsi de suite.

Cependant, si Fusebox n'est vraiment pas une option, jetez un oeil à Charlie Arehart's list of frameworks - cette page en général est une énorme liste d'outils à examiner.


Quoi qu'il en soit, cela devrait vous donner assez de choses à prendre en compte pour l'instant ...

+1

Les étiquettes personnalisées sont une excellente idée. Je vous remercie. –

+0

Peter, super poteau. Une chose que vous pourriez ajouter est avec Application.cfc, vous pouvez hériter du parent onRequestStart/End pour ce joli effet de page maître/enfant/petit-enfant, en appelant super méthodes. Oh, et Application.cfm/OnRequestEnd.cfm et cfinclude le fichier parent à la place de cela. –

+0

Jamais pensé à utiliser un tag personnalisé pour le faire ... :) cool, bon pour le faire fonctionner rapidement. – Henry

0

départ CFINCLUDE

+0

J'ai utilisé cfinclude pour inclure des en-têtes, des pieds de page, d'autres éléments, etc., mais j'espérais quelque chose d'un peu plus puissant. –

3

développeurs ColdFusion commencé à utiliser une balise appelée cf_bodycontent personnalisé à la fin des années 90 pour éviter d'avoir à inclure en-tête séparés et les fichiers de pied de page. C'était six ou sept ans avant les pages maîtres d'ASP.NET. ;-)

Maintenant, il y a une balise native qui fait la même chose: cfsavecontent. Voici l'essence de la façon dont les gens utilisent cfsavecontent dans les modèles.

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

Si vous souhaitez mettre un modèle dans un modèle, ajoutez simplement un autre contenu de type cfsav.

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

Vous pouvez refactoriser pour éliminer la redondance.

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

Si vous voulez avoir un modèle « étendre » une autre, vous pourriez peut-être faire en tournant la liste dans une pile, et chaque modèle ayant pousser son parent sur la pile.

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

Et ainsi vous avez StackBox, un framework ColdFusion inventé sur StackOverflow. :-)

+0

Oooohhh, j'aime ça aussi! Peut-être que je le ferai de cette façon. +1 –

Questions connexes