2008-09-22 16 views
10

Estoy creando un sitio en el que diferentes páginas pueden verse muy diferentes dependiendo de ciertas condiciones (es decir, haber iniciado sesión o no, completar o no el formulario, etc.). Esto hace que sea necesario generar diferentes bloques de html en diferentes momentos.Manteniendo mi PHP bonito

Hacer eso, sin embargo, hace que mi código php se vea horrible ... realmente se mete con el formato y la "forma" del código. ¿Cómo debería evitar esto? ¿Incluyendo funciones personalizadas de "descarga html" en la parte inferior de mis scripts? Lo mismo, pero con incluye? Heredocs (no se ven muy bien)?

Gracias!

Respuesta

25

No entre en pánico cada nuevo programador web enfrenta este problema.

Hay que separar la lógica del programa de la pantalla. En primer lugar, tratar de hacer su propia solución utilizando dos archivos para cada página Web:

  • uno con sólo el código PHP (no HTML) que llena las variables
  • otra con HTML y muy pocos PHP: esta es su diseño de página

A continuación se incluyen donde/cuando lo necesite. EG:

myPageLogic.php

<?php 

// pure PHP code, no HTML 

$name = htmlspecialchars($_GET['name']); 
$age = date('Y') - htmlspecialchars($_GET['age']); 

?> 

myPageView.php

// very few php code 
// just enought to print variables 
// and some if/else, or foreach to manage the data stream 

<h1>Hello, <?php $name ?> !</h1> 

<p>So your are <?php $age?>, hu ?</p> 

(Es posible que desee utilizar el alternative PHP syntax para éste, pero no tratar de hacer que sea difícil de perfeccionar el. primera vez, de verdad.)

myPage.php

<?php 

require('myPageLogic.php'); 
require('myPageView.php'); 
?> 

No se preocupe por los problemas de rendimiento por ahora. Esta no es tu prioridad como novato. Esta solución es imperfecta, pero ayudará a resolver el problema con el nivel de programación y te enseñará los conceptos básicos.

Entonces, una vez que su se sienten cómodos con este concepto, comprar un libro sobre el patrón MVC (o buscar entradas de desbordamiento de pila al respecto). Eso es lo que quieren hacer la LA PRÓXIMA. Luego, probará algunos sistemas y marcos de plantillas, pero MÁS TARDE. Por ahora, solo codifica y aprende desde el principio. Puedes codificar perfectamente un proyecto como ese, como novato, está bien.

+0

Eso es lo que hago hoy en día. Procese los datos en un script, incluya el script apropiado 'view'. En el script de vista, solo echo las variables dentro de HTML y uso if-else, loops cuando sea necesario. – Imran

+3

Muy, muy buen consejo. Mucho mejor que solo "usar MVC". – da5id

+3

Sí, a veces me arrepiento de que nadie me lo haya dicho durante mis primeros años. La gente debería dejar que los nooles hagan algo, en lugar de pedirles que tengan un comienzo perfecto para cada tecnología nueva que encuentren. –

0

En casos como este, escribo todo de forma incremental en una variable o, a veces, en una matriz y luego hago eco de la variable/matriz. Tiene la ventaja adicional de que la página siempre se procesa de una vez, en lugar de progresivamente.

0

Lo que termino haciendo en esta situación es crear archivos 'plantilla' de datos HTML que yo incluyo, y luego analizarlos con expresiones regulares. Mantiene el código limpio y facilita la entrega de piezas a un diseñador u otra persona HTML.

Salida los ideales detrás de las prácticas de programación MVC en Wikipedia

7

utilizar un enfoque MVC.

http://www.phpmvc.net/

Esto no es algo que va a recoger en un par de horas. Realmente necesitas practicarlo. Lo principal es que el controlador acceda a su modelo (la capa db), haga cosas con sus datos y luego envíelas a la vista para su renderizado. Esto se simplifica demasiado, pero solo necesita leerlo y practicarlo para comprenderlo.

Esto es algo que utilicé para ayudarme a aprenderlo. http://www.onlamp.com/pub/a/php/2005/09/15/mvc_intro.html

1

Por el sonido de su problema, parece que no tiene mucha separación entre la lógica y la presentación en su código. Al diseñar una aplicación, esta es una consideración muy importante, por razones exactamente demostradas por la situación que enfrenta actualmente.

Si no lo has hecho, echaré un vistazo a algunos motores de plantillas PHP como Smarty.

4

Intente separar el contenido y el diseño de su código tanto como sea posible. Cada vez que escriba cualquier código HTML en un archivo .php, deténgase y piense "¿Esto realmente pertenece a ?"

Una solución es usar plantillas. Mire el sistema de plantillas Smarty para una opción bastante fácil de usar.

+0

Cualquier motor de plantillas sería una solución a esto sin los gastos generales de un marco MVC. Smarty es una elección excelente. – Ian

+1

Un sistema de plantillas (Smarty) en la parte superior de otro sistema de plantillas (PHP) es, en principio, una sobrecarga. Estoy a favor de utilizar técnicas como XSL Transformations (http://www.w3schools.com/xsl/) Twan – Twan

+1

hombre, en serio ... XSLT es demasiado complicado y definitivamente innecesario por lo que el OP estaba hablando. Para empezar, necesitas algo de XML para transformarte en primer lugar. – nickf

0

Necesita un marco. Esto no solo hará que su código sea bonito (debido al ya mencionado patrón modelo-vista-controlador, MVC), sino que le ahorrará tiempo debido a los componentes que ya están escritos para él.

Recomiendo QCodo, es increíble; hay otros: CakePHP, Symfony.

0

Si se trata de un gran proyecto, un marco podría estar en orden. De lo contrario, cree algunos archivos de plantilla y en la parte superior de la página decida qué archivo de plantilla incluir.

por ejemplo

if ($_SESSION['logged_in']) 
    include(TPL_DIR . 'main_logged_in.tpl'); 
else 
    include(tPL_DIR . 'main.tpl'); 

sólo un ejemplo sencillo

0

como se mencionó anteriormente .. que está reparando el síntoma, no el problema ..

Lo que necesita es la separación de la lógica y presentación. Que se puede hacer con algún tipo de marco mvc. Incluso si no quiere llegar hasta el final con un framework mvc .. Un motor de plantillas es imprescindible al menos si su lógica es lo suficientemente complicada como para que tenga problemas con lo que está explicando

0

sugiero fuertemente savant en lugar de sabelotodo,

  • usted no tiene que aprender un nuevo "lenguaje" de plantillas con el fin de crear plantillas, plantillas savant están escritos en PHP
  • si no' t desea usar PHP puede definir su propia plantilla "lenguaje" con un compilador
  • se pueden ampliar fácilmente su propio php objetos

lógica de separación Presenta Esto no significa que toda la lógica de negocios tiene que ser en php y su lógica de presentación en otra cosa, la separación es algo conceptual, debe separar la lógica que prepara los datos de la que lo muestra. Obviamente, la lógica de negocios no tiene que contener elementos de presentación.

0

En lugar de implementar sistemas de plantillas sobre un sistema de plantillas (PHP mismo), creando gastos generales por defecto, puede optar por una solución más robusta como XSL Transformations, que también cumple con MVC princples (siempre que separe sus datos- recuperación; además, yo personalmente dividí la lógica de mostrar el XML con diferentes archivos).

Imagine tener la siguiente información en una matriz, que desea mostrar en una tabla.

Array 
{ 
    [car] => green 
    [bike] => red 
} 

permite crear fácilmente una secuencia de comandos que da salida a esta información en XML:

echo "<VEHICLES>\n"; 
foreach(array_keys($aVehicles) as $sVehicle) 
    echo "\t<VEHICLE>".$sVehicle."</NAME><COLOR>".$aVehicles[$sVehicle]."</COLOR></VEHICLE>\n"; 
echo "</VEHICLES>\n"; 

Dando como resultado el siguiente código XML:

<VEHICLES> 
    <VEHICLE> 
    <NAME>car</NAME> 
    <COLOR>green</COLOR> 
    </VEHICLE> 
    <VEHICLE> 
    <NAME>bike</NAME> 
    <COLOR>red</COLOR> 
    </VEHICLE> 
</VEHICLES> 

Ahora bien, esto es todo excelente, pero que no lo hará mostrar en un buen formato. Aquí es donde entra XSLT Con un poco de código simple, se puede transformar esto en una tabla:.

<xsl:template match="VEHICLES"> 
    <TABLE> 
    <xsl:apply-templates select="VEHICLE"> 
    </TABLE> 
</xsl:template> 

<xsl:template match="VEHICLE"> 
    <TR> 
    <TD><xsl:value-of select="NAME"></TD> 
    <TD><xsl:value-of select="COLOR"></TD> 
    </TR> 
</xsl:template> 

Et voila, usted tiene:

<TABLE> 
    <TR> 
    <TD>car</TD> 
    <TD>green</TD> 
    </TR> 
    <TR> 
    <TD>bike</TD> 
    <TD>red</TD> 
    </TR> 
</TABLE> 

Ahora, para este ejemplo simple, esto es un poco de overkill; pero para estructuras complejas en proyectos grandes, esta es una manera absoluta de mantener su lógica de scripting lejos de su marcado.

+0

Use htmlspecialchars al crear xml/html con concatenación de cadenas. – troelskn

+0

Tienes toda la razón. Y una etiqueta CDATA siempre es buena también. Pero los dejé, ya que solo ofuscan el objetivo de esta publicación :) – Twan

0

Marque esta question sobre la separación de PHP y HTML, hay varias maneras de hacerlo, incluyendo sistemas de plantillas auto por escrito, sistemas de plantillas como Smarty, PHP como un sistema de plantillas por sí mismo, etc, etc, etc ...

0

Creo que tiene dos opciones aquí, use un MVC Framework o use la forma de plantillas perezosa que supondría una sobrecarga significativa en su código. Obviamente estoy con el primero, creo que aprender MVC es uno de los mejores trucos de desarrollo web del libro.

2

Hacer eso, sin embargo, hace que mi código php se vea horrible ... realmente se mete con el formato y la "forma" del código. ¿Cómo debería evitar esto?

Trate su PHP y HTML como una sola jerarquía, con una única estructura de sangría uniforme.Entonces, una estructura adjunta de PHP, como 'si' o 'para', introduce un nuevo nivel de sangría, y sus contenidos son siempre un conjunto equilibrado de etiquetas de inicio y final. Básicamente está haciendo que su PHP esté "bien formado" en el sentido XML del término, ya sea que esté usando XHTML o no.

Ejemplo:

<div class="prettybox"> 
    Hello <?php echo(htmlspecialchars($name)) ?>! 
    Your food: 
    <?php foreach($foods as $food) { ?> 
     <a href="/food.php?food=<?php echo(urlencode($food)) ?>"> 
      <?php echo(htmlspecialchars($food)) ?> 
     </a> 
    <?php } ?> 
    <?php if (count($foods)==0) { ?> 
     (no food today) 
    <?php } ?> 
</div> 

Tenga cuidado con el dogma religioso en torno a la separación de la lógica y de marcado alza su cabeza en las respuestas aquí de nuevo. Si bien es cierto que desea mantener su lógica comercial fuera del código de salida de su página, esto no necesariamente significa que una carga de sobrecarga por el uso de archivos, clases, plantillas y marcos separados es realmente necesaria para lo que está haciendo. Para una aplicación simple, es probable que baste con poner las cosas de acción/lógica en la parte superior del archivo y la salida de la página a continuación.

(por ejemplo, de uno de los comentarios anteriores, haciendo htmlspecialchars() es la funcionalidad de la página-salida que definitivamente no quiere poner en el bit de acción de su PHP, mezclado en toda la lógica de negocio. Siempre Mantenga el texto como cadenas simples y sin guardar hasta el punto donde deja la lógica de la aplicación. Si escribe 'echo (htmlspecialchars (...))' todo el tiempo es demasiado prolijo, siempre puede hacer una función con un nombre corto como 'h 'que hace lo mismo.)

+0

Esta es una forma interesante de usar 'urlencode' y' htmlspecialchars' dentro de la plantilla/vista. ¿Es este realmente un mejor método que confiar en el objeto de vista del controlador/marco para escapar de los caracteres y simplemente pasar los datos a la vista para hacer eco? Yo personalmente uso el último. El controlador es responsable de obtener y manipular los datos. Esta no es la responsabilidad de las vistas. Simplemente echos datos, no manipularlos. –

+0

¿Cómo sabe el marco (y mucho menos el controlador) lo que va a necesitar escaparse de la etapa de visualización de salida? Puede incluir no solo escapes de HTML, sino también valores de plantillas en URL ('urlencode' /' rawurlencode' dependiendo de qué bit), o literales de cadena de JavaScript ('json_encode'), o un literal de cadena de CSS, o un fragmento de HTML que se puede pegar (doble codificación HTML), o tal vez escupiendo el contenido en un correo electrónico de texto plano (sin codificación). Si el controlador precodificó todo a HTML, esto no puede funcionar. Escaparse por el contexto es absolutamente una preocupación central de la vista. – bobince

Cuestiones relacionadas