2009-09-14 9 views
9

Voy a escribir un CMS, pero ahora estoy escribiendo todas mis ideas y tratando de aclarar todos mis conceptos antes de comenzar. Una de las cosas de las que me estoy peleando es usar un lenguaje de plantillas y analizar las páginas del sitio web, y reemplazar etiquetas de plantilla con elementos de contenido, o simplemente desarrollar el sitio con PHP directo y hacer que el CMS genere estructuras de datos que ayuden. Por ejemplo:Lenguaje de plantillas frente a PHP directo

{navigation: products} 

vs

foreach($cms_label['products'] as $product) { 

    echo '<li class="product_nav">'. 
     '<a href="products/{$product.id}">{$product.name}</a>'. 
     "</li>\n"; 

} 

El primero es limpio, sino que implicaría la invención de una lengua, además de analizar cada página antes de la visualización. Este último es menos limpio, pero creo que podría funcionar muy bien si el CMS acaba de proporcionar datos para todo el código. Pero, ¿se consideraría esto mezclar la lógica con la presentación? Otra alternativa He considerado es el uso de las funciones de PHP que son similares a las etiquetas de plantilla:

<?php navigation('products'); ?> 

¿Cuáles son sus pensamientos?

Tenga en cuenta que no tengo que hacer nada más complicado que incluir una página en un lugar determinado o escribir una lista desordenada; el resto será manejado por CSS.

+1

Bastante seguro de que esto se ha preguntado muchas veces antes. – MitMaro

+0

Dup: http://stackoverflow.com/questions/731743/php-vs-template-engine http://stackoverflow.com/questions/436014/why-should-i-use-templating-system-in-php http://stackoverflow.com/questions/62605/php-as-a-template-language-or-some-other-php-templating-script – MitMaro

Respuesta

13

Los lenguajes de plantilla para PHP son un ejemplo de un patrón anti llamado "Inner-Platform Effect". Smarty es un ejemplo de un marco de plantilla para PHP, pero incluso Hasin Hayder, autor de un libro sobre Smarty dice que Smarty is dead y ya no hay necesidad de usarlo.

Puede haber buenas razones para desarrollar un lenguaje de plantilla, por ejemplo, si tiene diseñadores no codificadores o editores de contenido que usan su CMS y no desea abrumarlos con la complejidad de PHP (o permitirles escriba el código que podría romper su sitio web).

Pero no ha descrito eso como un objetivo, así que supongo que usar PHP como el lenguaje de plantilla de página es el mejor en este caso. Va a ser menos trabajo porque no tiene que desarrollar su propio idioma nuevo, y proporcionará una mayor flexibilidad para casos poco frecuentes en los que necesite un tipo específico de contenido dinámico.

No escriba funciones PHP para encapsular bloques de salida HTML. En su lugar, use include() para extraer fragmentos de HTML. Esta técnica a veces se llama "parciales".

También puede utilizar un marco MVC como Symfony, Kohana, Solar, CodeIgniter o Zend Framework para ayudarlo a mantener la disciplina a la hora de separar su código de plantilla PHP del resto de su código de aplicación.

+0

Lo estoy construyendo en codeigniter. Además, ¿qué pasa si partes del HTML deben especificarse en el PHP? Para generar una lista (como en mi ejemplo) pensé que usar includes sería innecesario. No es necesario escribir un "some-specific-navigation.html" e incluirlo, ¿verdad? En cuanto a las páginas, esas no se generarán sobre la marcha. –

+1

Mi punto es que guardo todo el HTML en los archivos de plantilla, mientras que escribo funciones de PHP (como el ejemplo 'navigation()' que mencionas) solo para proporcionar datos a la plantilla. Además, nunca haga eco de las etiquetas HTML, incluso en la plantilla. Salga del bloque '' cuando desee etiquetas HTML literales. –

+0

Simplemente pensé que era más limpio escribir '{$product.name}' que escribir '' –

2

Es posible que desee ver en Smarty-http://smarty.php.net Smarty es un motor de plantilla muy potente que le ofrece lo mejor de ambos mundos. Tiene un amplio soporte para módulos y complementos personalizados.

Creé un CMS personalizado con Smarty y PHP y no tengo más que cosas buenas que decir al respecto.

El código php para usar Smarty tiene este aspecto

<?php 
// my cms 

$smarty = new Smarty(); 
. 
. 
$smarty->display('home.tpl'); 

?> 

El código de la plantilla

es algo como esto

<h1>{$pagetitle}</h1> 

{insert tag="navigation"} 
+0

Recomendaría Dwoo [dwoo.org] a Smarty. Tiene la mayoría de las características de Smarty sin la hinchazón. – MitMaro

+0

+1 He usado Smarty para una serie de proyectos, aunque eso fue hace un tiempo, por lo que puede haber otros motores para verificar también (Dwoo, como mencionó MitMaro, por ejemplo). La principal preocupación con los lenguajes de plantilla, en mi experiencia, es evitar que la lógica empresarial se cuele en ellos. Por lo general, esto significa un poco de trabajo adicional para asegurarse de que solo se proporciona a la plantilla la información que desea mostrar, dejando solo el formato y la estructura de visualización en el código de la plantilla. – yukondude

7

yo era un usuario muy feliz Smarty durante mucho tiempo, no lo creo cree en lenguajes de plantilla especializados más.

Un lenguaje de plantilla no evitará que ponga una lógica inapropiada en su código de presentación, sino que lo forzará a escribir código incorrecto en el lenguaje de plantilla.

Es bastante trivial rodar su propio pequeño sistema de plantillas que usa php en las plantillas. Luego crea varios ayudantes para mantener limpio el código de tu plantilla (como tu función de "navegación()").

Creo que el enfoque adoptado por Zend_View es bastante bueno. La capa de visión de Symfony es bastante clara también, pero puede ser un poco intimidante. No tiene que usar un marco para obtener algo de él. Simplemente mire algo del código de la plantilla en los ejemplos y vea qué lo inspira.

En pocas palabras: olvídese de un lenguaje especial para plantillas: simplemente aplique un buen sentido de diseño a su código de vista, factorizando la complejidad de los scripts de vista y en ayudantes reutilizables.

7

Reinventar la rueda es la mayoría de las veces una mala idea.

PHP ya es un lenguaje de plantillas. No necesita implementar el suyo.

En cuanto a Smarty, es el sistema de plantillas más completo para php y sigue siendo una mala idea.

Un par de artículos sobre el tema:

Si desea buscar en las plantillas hecho mejor vistazo a:

  • phpSavant se utiliza código php y aún promueve la separación de las preocupaciones.

El objetivo final es, por supuesto, tener el código más fácil de mantener, promoviendo separación de la lógica de negocios y presentación

1

Me pregunto por qué nadie ha mencionado lo que es uno de los usos más importantes de un lenguaje de plantillas: Salida automática escapada.

Es fácil olvidar una htmlspecialchars() aquí o allí, por lo que un lenguaje de plantillas que proporciona directivas como {$ name} tiene que asegurarse de $ nombre es automáticamente pasaron por htmlspecialchars, con el juego de caracteres y todo apropiado.

Por supuesto, eso también implica que puede especificar un "contexto" diferente para salida variable, como p. Ej. alerta ('Hola {$ name | context = singlequotes}!'); donde el intérprete de la plantilla escaparía del contenido de $ name, de modo que es imposible salir de las comillas simples, en lugar de escaparse de XML (que debería ser el valor predeterminado).

Tales contextos también pueden incluir cosas como int (para forzar un número), y también se puede extender a aceptar parámetros adicionales para formatear la salida, et etc.

Mis 2 centavos. No estoy seguro de si hay una solución de código abierto que permita esto (¡estaría interesado en saberlo!), Elaboré mi propio intérprete para estas cosas en el trabajo. Como el "código intermedio" resultante es puro PHP, también se puede "guardar en caché" (como hacen Smarty y otros sistemas tpl).

+0

este es un buen punto que no había considerado antes. Pero, ¿no podría hacerse esto tan fácilmente con las funciones de PHP en lugar de las etiquetas de plantilla? –

+0

Sí, pero el punto es que es fácil olvidarse de llamar a htmlspecialchars() o escapar de comillas en un bloque

  • 11. Lenguaje de script PHP o lenguaje de programación?
  • 12. Proteger archivo PHP de acceso directo
  • 13. Impedir el acceso directo a una página PHP
  • 14. NUnit frente a MbUnit frente a MSTest frente a xUnit.net
  • 15. UrlRewriteFilter Directo a https
  • 16. enlace directo a GSP
  • 17. C# MVC: rendimiento y ventajas de MVC Html Helpers frente a HTML directo en las vistas
  • 18. ¿Existe un lenguaje de plantillas similar a Razor para aplicaciones web de Java Spring?
  • 19. Clase DateTime frente a funciones de fecha PHP nativas
  • 20. iterador frente a referencia frente a puntero
  • 21. Detección del lenguaje de programación en PHP
  • 22. Terminología de persistencia de objetos: 'repositorio' frente a 'almacenar' frente a 'contexto' frente a 'retriever' vs. (...)
  • 23. Obtener videos de enlace directo de Vimeo en PHP
  • 24. ¿Cómo se usan las plantillas de Editor/Display frente a Html Helpers?
  • 25. objeto frente a la primitiva
  • 26. Página frente a extensión frente a segmento frente a espacio de tabla
  • 27. Seguridad de Tomcat frente a WebSphere frente a WebLogic
  • 28. Desarrollo de iPhone - XMLParser frente a libxml2 frente a TouchXML
  • 29. Imagen frente a foto frente a imagen - Modelos de nomenclatura
  • 30. pila frente a la cola?