2011-01-12 6 views
11

Tengo una aplicación construida alrededor de un patrón MVC. La vista es php pero sobre todo HTML con código php mínima incrustado, cosas como esta -Separar el código del diseño en la plantilla

Welcome <?php echo $USERNAME ?> 

y

<table> 
<?php foreach ($USERS as $row) : ?> 
<tr><td><?php echo $row->name ?><td><?php echo $row->address ?></tr> 
<?php endforeach ?> 

sólo quiero lógica de diseño de pantalla en este archivo, y yo quiero que sea sencillo !

Esto en su mayoría funciona realmente bien para mí, sin embargo estoy luchando un poco ciertos aspectos. Por ejemplo, mire la tabla en el código anterior e imagine que cada columna (nombre y dirección) tiene un título NameAddress

Imagine que quiero hacer que las columnas se puedan ordenar. Así que lo hago algo así como -

<tr><th><a href="?sort=name">Name</a><td><a href="?sort=addr"> 

Pero esto no es suficiente. Mi vista necesita ver por qué columna se está ordenando y agregar una flecha hacia arriba o hacia abajo. Necesita cambiar el enlace de la columna ordenada actualmente a? Sort = name_reverse si esa columna ya está siendo ordenada de modo que al hacer clic en ella se ordene de otra manera. Es un poco demasiado complicado para escribir buen código limpio en mi plantilla ahora ...

para que pueda obtener mi controlador para crear las variables que contienen -

<tr><th><?php echo $HEADING[0] ?><th><?php $HEADING[1] ?> 

etc, pero esto significa que mi controlador es ahora generar HTML real que es realmente responsabilidad de la plantilla de página. Elimina la capacidad de la plantilla para formatear la página de diferentes maneras ... Y simplemente se siente mal.

Pero cómo puedo adecuado manejo de estas, donde me siento que necesito mi controlador de página a ser las variables que generan HTML que contienen ...

¿Alguna sugerencia?

Respuesta

4

Separe el código para crear la tabla en un ViewHelper. Configure la llamada al método desde la plantilla. Haga que ViewHelper represente la tabla real con todas las configuraciones requeridas. La plantilla principal, entonces debe contener solamente una línea como esta:

<?php echo table($data, $sortOptions, $otherConfig) ?> 

Básicamente, cualquier lógica necesaria para construir esa mesa estará contenido dentro de la ViewHelper por lo que es posible que desee para que sea una clase. La implementación completa variará según sus necesidades.

Si no quiere poner toda la lógica en un Table Helper grande, considere hacer funciones auxiliares para cualquier parte de la tabla. Por ejemplo, algo así como

<th><?php echo sortLink('Name', $current); ?></th> 

De esta manera, el ayudante sortLink decidiría si y cómo crear e insertar los enlaces de clasificación, por lo que no tiene que tener esa lógica o cualquier condicionales en la plantilla principal.

+1

Me gusta esto. Cosas como sortlink permitirían a los "diseñadores" transformar los datos sin hacer que escriban código complejo. Y la información original todavía está allí, así que no obliga a un estilo en particular a diferencia de proporcionar HTML en las variables – jcoder

0

Una solución es utilizar Javascript Sorting, hay algunos buenos para jQuery.

Si eso no es posible, puede echarle un vistazo a alguna solución de plantilla como Smarty para manejar la plantilla por usted.

+0

Estoy de acuerdo con usted acerca de javascript en este caso, pero estaba interesado en la respuesta general de diseño de código principalmente. Creo que smarty tendría el mismo problema: en algún momento te sentirás tentado a solo agregar etiquetas HTML a tu plantilla ... – jcoder

2

Excelente pregunta, que es muy poco común para este sitio.

Antes que nada, TIENE que aceptar el hecho de que cualquier plantilla de la vida real nunca será simple. Eso es todo. Se llama presentación lógica y sigue la complejidad de la presentación en sí.

Por lo tanto, solo hazlo de la misma manera que antes, utilizando el mismo bucle y operador condicional y, posiblemente, algunas funciones auxiliares caseras, lo que estropeará la pureza de la plantilla, pero ayuda mucho.

De hecho, casi lo has clavado. puede usar variables predefinidas, sin embargo, no deberían contener HTML, solo valores que se mostrarán.

<tr> 
<th> 
    <a href="<?=$links['name']['url']?>"> 
    Name 
    <?if($links['name']['dir']=='asc'):?><img src="arrow.gif"><?endif?> 
    <?if($links['name']['dir']=='desc'):?><img src="reverse_arrow.gif"><?endif?> 
    </a> 
<td> 

es tentador hacer un bucle de esto, pero yo aconsejaría contra de eso, ya que le dará lugar a la invención de algún constructor de HTML que es otra historia y no es tan fiable como HTML puro en sí.

La única culpa para usted: un programador, pidiendo la ayuda del código, debe traer el código, no wordy blab. Un ejemplo del HTML real sería mucho mejor, permitiendo que los respondedores no lo inventen de la cabeza.

1

Si puedo agregar una sugerencia, puede convertir todos los resultados PHP a DOM/XML y alimentarlo a un procesador XSLT donde la presentación, por compleja que sea, es más consistente, porque XSLT y XHTML están basados ​​en XML. Obtiene una presentación separada del contenido tanto en términos de ubicación física como de tecnología utilizada para entregarlo.

+0

Una idea interesante pero realmente no resolvería mi problema que es mantener cualquier código complejo fuera de la "vista" para que las personas no son codificadores de tiempo completo pueden crear temas. Respeto a XSLT pero ser simple no es uno de sus mejores aspectos. – jcoder

+0

esto realmente depende de su definición de simple. si alguna vez tuvieras que profundizar en la plantilla joomla de otra persona, por ejemplo, verías que la mezcla de php y html tiene tan poco sentido que puedes pasar días recorriendo laberintos de la mente inventiva del autor. xslt podría simplificarse haciendo plantillas precocinadas que resuelvan tareas comunes, a la vez que otorguen a los programadores la libertad de cocinar las suyas propias. de todos modos, estoy de acuerdo con que xslt no es para codificadores de nivel de entrada, pero de hecho es más fácil de mantener que la mezcla común de php/html. –

Cuestiones relacionadas