2009-04-02 16 views
7

Estoy trabajando en un sitio web codificado en ColdFusion. Tengo una plantilla CSS/HTML que me gustaría aplicar al contenido de cada página, sin duplicar más código de lo necesario. Las páginas maestras de ASP.NET me han echado a perder, que sería mi forma preferida de implementar este sitio. Lamentablemente, esa opción no está disponible para mí. Este sitio debe ejecutarse en Coldfusion MX 7. Además, al desarrollador que lidera el proyecto no le gusta Fusebox, por lo que esa opción está desactivada.¿ColdFusion tiene una respuesta para las páginas maestras de ASP.NET?

La navegación principal, el encabezado gráfico y el pie de página serán los mismos en todas las páginas. La etiqueta del título, las etiquetas meta y la navegación de nivel 2 probablemente variarán de una página a otra. Aparte de eso, solo el "área de contenido principal" de la página será diferente.

Teniendo en cuenta estos parámetros, ¿cómo puedo codificar el sitio para un mantenimiento máximo?

+0

Ha, lea esta pregunta incluso antes de darme cuenta de quién la publicó. Falta .Net eh? –

Respuesta

12

Hay un gran número de maneras de hacer esto con ColdFusion.


Application.cfc se ejecuta en cada petición y tiene dos métodos (onRequestStart y onRequestEnd) que se pueden utilizar para anteponer/añadir contenido a la secuencia de comandos principal en una página.

También vale la pena señalar que es posible extender/heredar su Application.cfc, lo que permite un conjunto más complejo de eventos RequestStart/End. More details here y here.


Custom Tags le permiten crear una etiqueta que se puede envolver alrededor de cada plantilla que se aplicará la disposición/etc. También permite que los atributos/etc definan texto común pero cambiante.

Por ejemplo:

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

Y dentro de la etiqueta personalizada (page.cfm) tiene:

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

Y, por supuesto, puede crear múltiples etiquetas personalizadas, o una etiqueta que funciona de múltiples maneras dependiendo de los Atributos especificados.


Henry ya se ha mencionado MVC Marcos, pero usted no necesita hacer MVC para hacer uso de la funcionalidad de plantillas/diseño.

Fusebox puede hacer MVC, pero no requieren que lo haga, y eitherway ContentVariables de FB es una buena herramienta para la implementación de contenido modular con - a menos que su principal desarrollador puede justificar su desagrado por Fusebox (¡y sugiera una alternativa que se adapte mejor a su proyecto!), entonces no hay absolutamente ninguna razón para no hacerlo: es un marco maduro y bien conocido, fácil de usar, muchos desarrolladores, etc.

Sin embargo, si Fusebox realmente no es una opción, eche un vistazo a Charlie Arehart's list of frameworks - esa página en general es una enorme lista de herramientas que vale la pena mirar.


De todos modos, eso debería darle bastantes cosas a tener en cuenta, por ahora ...

+1

Las etiquetas personalizadas son una gran idea. Gracias. –

+0

Peter, una gran publicación. Una cosa que podría agregar es con Application.cfc, puede heredar parent onRequestStart/End para ese efecto de página agradable master/child/grandchild, llamando a supermétodos. Ah, y Application.cfm/OnRequestEnd.cfm y cfinclude el archivo principal en lugar de eso. –

+0

Nunca pensé en usar etiquetas personalizadas para hacer esto ... :) genial, es bueno para hacerlo funcionar rápidamente. – Henry

0

la salida CFINCLUDE

+0

He usado cfinclude para incluir en encabezados, pies de página, otros elementos, etc., pero esperaba algo un poco más poderoso. –

3

desarrolladores de ColdFusion empezado a utilizar una etiqueta personalizada llamada cf_bodycontent a finales de los años 90 para evitar tener que incluir archivos de cabecera y pie de página separados. Eso fue seis o siete años antes de las páginas maestras de ASP.NET. ;-)

Ahora hay una etiqueta nativa que hace lo mismo: cfsavecontent. Aquí está la esencia de cómo las personas usan cfsavecontent en las plantillas.

<!--- 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 desea poner una plantilla dentro de una plantilla, solo agregue otra 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>   

Podría refactorizar para reducir la redundancia.

<!--- 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 usted quiere tener una plantilla de "extender" otra, tal vez podría hacerlo girando la lista en una pila, y teniendo cada plantilla empujar su matriz en la pila.

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

Y así tiene StackBox, un marco ColdFusion inventado en StackOverflow. :-)

+0

Oooohhh, ¡me gusta esto también! Quizás lo haga de esta manera. +1 –

Cuestiones relacionadas