Pregunta

Estoy trabajando en un sitio web que fue codificado en ColdFusion. Tengo una plantilla CSS / HTML Me gustaría aplicar al contenido de cada página, sin duplicar ningún código más de lo necesario. He conseguido clase de mal estado de las páginas maestras de ASP.NET, lo que sería mi forma preferida para poner en práctica este sitio. Por desgracia, esta opción no está disponible para mí. Este sitio tiene que ejecutarse en ColdFusion MX 7. Asimismo, el líder en el desarrollo del proyecto no le gusta Fusebox, tan fuera de esa opción.

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

Teniendo en cuenta estos parámetros, ¿cómo puedo código que el sitio para la máxima facilidad de mantenimiento?

¿Fue útil?

Solución

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 onRequestEndand) que se puede utilizar para anteponer / añadir contenido a la secuencia de comandos principal en una página.

También digno de mención, es posible extender / heredar su Application.cfc, lo que permite un conjunto más complejo de eventos RequestStart / End. Más detalles aquí y aquí .


etiquetas personalizadas le permiten crear una etiqueta que se puede envolver alrededor de cada plantilla que se aplicará la disposición / etc. También permite a los atributos / etc para definir texto común pero cambiando.

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 varias etiquetas personalizadas, o una etiqueta que funciona en múltiples formas 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 MVC puede hacer, pero no lo hace requieren que lo haga, y eitherway ContentVariables de FB son una buena herramienta para la aplicación de contenido modular con - a menos que su principal desarrollador puede justificar su desagrado por Fusebox (y sugerir una alternativa que se adapte a su proyecto mejor !), entonces no hay absolutamente ninguna razón para no ir a por ello -. es un marco maduro y bien conocido, fácil de usar, un montón de desarrolladores, y así sucesivamente

Sin embargo, si Fusebox realmente no es una opción, echar un vistazo a la lista de Charlie Arehart de marcos - esa página, en general, es una enorme lista de herramientas pena mirar

.


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

Otros consejos

Los desarrolladores de ColdFusion comenzaron 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 páginas maestras de ASP.NET. ; -)

Ahora hay una etiqueta nativa que hace lo mismo: cfsavecontent . Aquí está la esencia de cómo la gente usa 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 colocar una plantilla dentro de una plantilla, sólo tiene que añadir 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>         

Se puede refactorizar para cortar 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 por lo tanto usted tiene StackBox, un marco de ColdFusion inventado en StackOverflow. : -)

Usted puede probar uno de los marcos MVC con ayuda de la plantilla (casi todo el mundo lo tiene).

caja fría , Model-Glue , Mach-II , < a href = "http://www.fusebox.org/" rel = "nofollow noreferrer"> Fusebox ...

Galleon Foro Puertos Comparaciones pone de relieve cómo cada marco maneja plantillas. ..

echa un vistazo a CFINCLUDE

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top