2011-01-19 14 views
6

utilizo PHP un poco, y cada vez que veo un "PHP-odio" hilo en algún foro o debate incluso populares relacionados con PHP aquí, yo suelo ver algo en la línea de:¿Cómo no mezclar presentación con lógica?

PHP es demasiado desordenado/descuidado/horrible, porque tiene una red enredada de presentación y lógica.

Luego veo que los PHP-Defenders responden a alguna versión de lo anterior diciendo que no es necesariamente cierto. Llegué a pensar "¿Cómo es esto posible ...?" y "¿Qué cuenta como mezcla de presentación con lógica?" No pude resolverlo, así que ahora estoy aquí.

¿Cuál de estas es la mejor práctica? ¿O hay una forma aún mejor de la que no soy consciente?

<?php 
    if(!function()) { 
     echo '<div id="results">The result is a lie.</div>'; 
     } 
?> 

O

<div id="results"> 
    <?php 
     if(!function()) { 
      echo 'The result is a lie.'; 
      } 
    ?> 
</div> 

Sé que los ejemplos anteriores no parecen realmente un gran problema, pero después de navegar a través de las aplicaciones web de la mía, me di cuenta que era todo tipo de desordenado (porque estaba mezclando HTML y PHP), así que esperaba que hubiera una buena manera de desarrollar manteniendo las cosas lindas y ordenadas.

+0

Personalmente me apego a la primera opción y envío todo por código. Encuentro que es mucho más limpio. – Brad

+0

No es una varita mágica, es un mago. Uno siempre puede separar las cosas. Si ellos quieren. –

+0

* (relacionado) * [MVC: ¿cuánto código debería haber en una vista?] (Http://stackoverflow.com/questions/4698880/mvc-how-much-code-should-be-in-a-view/ 4699689) – Gordon

Respuesta

11

Quizás desee ver un motor de plantillas, como smarty. Eso puede separarlo por ti.

Vinculación: http://www.smarty.net/

Algunos (con suerte) equilibradas adiciones al ver el comentario bastante grande sección a continuación:

Parece que hay una gran cantidad de discusión sobre Smarty. Hay dos campos adicionales en esto por lo que puedo decir,

uno dice: motor de plantillas, vale, pero smarty no es el mejor; uso (inserte su elección aquí). por ejemplo, ramita o dwoo.

y otro dice: ¡No use un motor de plantillas separado! Como PHP es perfectamente capaz de hacerlo por sí mismo. Ejemplos de los comentarios incluyen:

Uso Zend_View y Savant

+0

+1: Esta es la respuesta correcta. Escriba su HTML como plantilla y use PHP para completar los espacios en blanco y publicarlo. –

+0

No estoy muy seguro de por qué esto acaba de obtener un -1? No es una "solución de buscar otro lugar", esta es realmente una manera de detener todos esos problemas de PHP al mezclar ... – Nanne

+1

¡también eche un vistazo a Twig! http://www.twig-project.org/ – Paul

1

El segundo ejemplo es mejor.

La manera más fácil de evitar mezclar presentación con lógica sería usar un framework MVC como Symfony o CakePHP. Estos le permiten separar los datos (modelos) de la lógica (controlador) y la presentación (vistas).

La otra respuesta es buena: use la creación de plantillas. La creación de plantillas casi siempre es parte de un marco MVC.

+0

La plantilla es * siempre * parte de MVC. Para eso es la V. ;) – netcoder

+0

@netcoder no todos los frameworks MVC vienen con un motor de plantillas, sin embargo :) Algunos te hacen escoger tu propio –

+0

Tienes razón, pero estaba hablando del patrón de diseño, no de los frameworks. ;) – netcoder

0

Se pueden definir los métodos de ayuda en un archivo adjunto o en la parte superior de la página:

<?php 
function result_if_good() 
{ 
    if (!function()) { 
     return 'The result is a lie.'; 
    } 
} 
?> 

Y luego otra parte, en el código HTML:

<div id="results"><?php echo result_if_good();?></div> 

Mantener toda la lógica de tu presentación.

+0

Hay un problema. Esa función auxiliar se convierte en el mismo desastre –

+0

Excepto que es PHP directo y condicionales sin HTML. Incluso con un motor de plantillas, aún puede poner demasiada lógica condicional en sus plantillas, y es bueno comenzar a ponerlas en ayuda de visualización. – scragz

0

Si desea una separación real entre su lógica y su interfaz, debe consultar MVC pattern.

utilizo las vistas en el patrón MVC con el motor de una plantilla para lograr archivos HTML limpio de mis puntos de vista

0

Prefiero una situación donde una secuencia de comandos saca el HTML y javascript si es necesario. En otras palabras, algo más parecido (en seudo pitón):

#Primitives 
def htmlheader(title): 
    return "<html><head><title>%title</title></head>" % title 

def body: 
    return "<body>" 

def para(content): 
    return "<p>%content</p>" % content 

def htmlend: 
    return "</body></html>" 

#New file: View 

print htmlheader() 
print body() 
print para("This is my paragraph") 
print para("Hello, %salatation %lastname" % dbresult.salutation, dbresult.lastname) 
print htmlend() 

PHP sufre de estar rodeado de <>, que ya son bastante difíciles de leer.

YMMV

Con primitivas en lugar de apagar HTML real que, a continuación, puede hacer una capa de controlador que simplemente las manos puras de datos a la vista. Más pseudoPython:

#ViewController 

db = dbconnect("host", "user", "password"); 

view.mainbody.show(getCurrentNews(db)) 
view.header.show(getTopHeadLines(db)) 
if (user.isLoggedIn): 
    view.footer.userNavigation() 
else: 
    view.footer.showDefault() 
view.render 
+0

Ejemplo muy poco claro que en realidad no genera una sola etiqueta HTML –

+0

Agregué primitivas para ayudar con el ejemplo. –

+0

Bueno, su HTML no se parece a HTML. todo está en cadenas delimitadas por comillas. Sin resaltado de sintaxis, escapando desastre y toda esa porquería. ¿Realmente lo usas? Para las plantillas del mundo real? –

2

Piense en la lógica y la presentación donde la lógica es un tipo de toma de corriente y la presentación es una bombilla. Ahora puede tener varios enchufes en su casa, algunos con hilos de diferentes tamaños. También puede tener un montón de bombillas, de diferentes colores, algunas baratas, algunas caras. El punto es que una bombilla puede entrar en uno o más calcetines, y una toma puede aceptar más de una bombilla, pero solo puede hacer coincidir una bombilla con una toma a la vez.

Así que si tienes una bombilla realmente bonita (o una plantilla html realmente bonita), quieres poder mover la bombilla hacia donde la necesites (o aplicar la misma lógica). Y si un día decide que quiere usar una bombilla azul, simplemente puede cambiar la bombilla, no tiene que instalar una toma de corriente completamente nueva solo para cambiar el color.

Volviendo a la lógica y la presentación, si tiene el caso común donde tiene un formulario en una página web, a veces lo muestra la primera vez que un usuario carga la página y, a veces, desea mostrarlo después del el usuario ha completado algunas de las entradas, pero tal vez haya errores o información faltante. En este caso, la lógica no haría nada, solo mostrar el formulario, o tratar de procesar el formulario, encontrar el error y luego mostrar el formulario que revela los errores.

Puede hacer esto con lógica mixta y presentación en el mismo archivo, claro, pero ¿qué sucede cuando más de una persona comienza a editar su script? Tal vez el guión se rompe y no saben qué hacer, por lo que comentan alguna sección importante para que funcione de nuevo. Eso es como si alguien cambiara una bombilla y luego decidiera volver a conectar los interruptores de luz. Pero a veces, cuando te enfrentas a un cableado defectuoso, no hay otra manera de solucionar el problema, el problema va de un simple "Por favor cambia la bombilla" a "Haz que las luces funcionen". En un sistema diseñado adecuadamente, donde los componentes se aíslan de una manera sensata, las cosas generalmente son más fáciles de arreglar.

En otras palabras, mezclar la lógica y la presentación es como cablear las bombillas utilizando cables pelados, y luego conectar los cables a la red eléctrica sin siquiera un interruptor de circuito para mayor seguridad.