sintaxis remove inicio fin etiquetas ent_quotes comentarios php html template-engine

inicio - remove html tags php



¿Cuál es la mejor manera de insertar HTML a través de PHP? (11)

-1 para el típico uso histérico [mi sistema de plantillas favorito] en cambio! publicaciones. Cada publicación de PHP, incluso si la respuesta PHP nativa es de una sola línea, siempre degenera en esto, así como todas las preguntas de JavaScript de una sola línea terminan llenas de "uso [mi marco de trabajo favorito] en su lugar". Es vergonzoso.

En serio, sabemos cómo separar la lógica empresarial y las preocupaciones de presentación. Puede hacer eso, o no hacer eso, en cualquier sistema de plantillas, ya sea PHP, Smarty o algo completamente diferente. Ningún sistema de plantillas separa mágicamente tus preocupaciones sin pensarlo dos veces.

(De hecho, un sistema de plantillas que es demasiado restrictivo puede terminar teniendo que escribir código auxiliar puramente de presentación, complicando la lógica de su negocio con preocupaciones de presentación. ¡Esto no es una victoria!)

Para responder a la pregunta que se hizo, el primer ejemplo está bien, pero es muy difícil de leer debido a la mala sangría. Vea el ejemplo de Monzee para una forma más legible; puede usar: notación o {} s, lo que prefiera, pero lo importante para la legibilidad es mantener su HTML y PHP como una única jerarquía con sangría "bien formada".

Y un alegato final: recuerda htmlspecialchars (). Cada vez que el texto plano necesita ir a una página web, debe usarse, o es XSS en todo el piso. Sé que esta pregunta no está directamente relacionada con eso, pero cada vez que publicamos código de ejemplo, incluido <? Php echo ($ title)?> O un marco equivalente sin el escape, estamos alentando la continuación del área de desastre de seguridad que la mayoría de las aplicaciones PHP se han convertido.

Hablando desde el punto de vista de la "mejor práctica", ¿cuál cree que es la mejor manera de insertar HTML utilizando PHP? Por el momento, utilizo uno de los siguientes métodos (principalmente este último), pero tengo curiosidad por saber cuál crees que es el mejor.

<?php if($a){ ?> [SOME MARKUP] <?php } else{ ?> [SOME OTHER MARKUP] <?php } ?>

Oposición a:

<?php unset($out); if($a) $out = ''[SOME MARKUP]''; else $out = ''[OTHER MARKUP]''; print $out; ?>


NO use smarty: PHP es un sistema de plantillas en sí mismo. Considera usar esta sintaxis:

<?php if($a):?> [SOME MARKUP] <?php else: ?> [SOME OTHER MARKUP] <? endif; ?>


Ninguno. Usa Smarty Al separar su lógica interna de la lógica de visualización, construirá un código que es mucho más simple de mantener. (No tome el camino del viejo sistema de plantillas de PHPLib que trató de separar por completo PHP y HTML - requiere que la lógica de visualización se entremezcle con su lógica empresarial central y es muy desordenado). Si absolutamente debe generar fragmentos de HTML en su código PHP , use su segundo método, pero pase la variable a Smarty.


Para un caso muy simple como este, está bien usar PHP como plantilla. Sin embargo, si va más allá de la lógica simple (y lo más probable es que lo haga), es una buena idea usar motores de plantillas.

En Zend Framework, que usa scripts de PHP view por defecto, la forma recomendada de hacer esto sería así:

<?php if ($a) : ?> [MARKUP HERE] <?php else : ?> [SOME MORE MARKUP] <?php endif ?>

La sintaxis más detallada hace que sea mucho más fácil hacer coincidir bloques condicionales de un vistazo que utilizando llaves.


Si un motor de plantillas parece una molestia, puede crear el motor de plantillas de su propio pobre. Este ejemplo definitivamente debe mejorarse y no es adecuado para todas las tareas, pero para sitios más pequeños podría ser adecuado. Solo para hacerte una idea:

template.inc:

<html><head><title>%title%</title></head><body> %mainbody% Bla bla bla <a href="%linkurl%">%linkname%</a>. </body></html>

index.php:

<?php $title = getTitle(); $mainbody = getMainBody(); $linkurl = getLinkUrl(); $linkname = getLinkName(); $search = array("/%title%/", "/%mainbody%/", "/%linkurl%/", "/%linkname%/"); $replace = array($title, $mainbody, $linkurl, $linkname); $template = file_get_contents("template.inc"); print preg_replace($search, $replace, $template); ?>


Smarty está bien, si no está utilizando un marco o si está usando un marco que no tiene su propio sistema de plantillas.

De lo contrario, la mayoría de los frameworks PHP y los CMS de generaciones más jóvenes tienen su propio sistema de plantillas.

En general, la idea de un sistema de plantillas es tener archivos que contienen casi solo HTML (Ver / Archivo de Plantilla) y archivos que contienen solo datos o lógicas de negocios (Archivos de Modelo o Controlador).

Un archivo de plantilla puede tener un aspecto similar a este (ejemplo de SilverStripe):

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <% base_tag %> $MetaTags <link rel="stylesheet" type="text/css" href="tutorial/css/layout.css" /> </head> <body> <div id="Main"> <ul id="Menu1"> <% control Menu(1) %> <li class="$LinkingMode"> <a href="$Link" title="Go to the &quot;{$Title}&quot; page">$MenuTitle</a> </li> <% end_control %> </ul> <div id="Header"> <h1>$Title</h1> </div> <div id="ContentContainer"> $Layout </div> <div id="Footer"> <span>Some Text</span> </div> </div> </body> </html>

Puede ver que solo hay unas pocas piezas de código que no son HTML insertadas en los lugares donde se insertarán los datos antes de que la página se envíe al cliente.

Su código puede entonces (simplificado) más bien verse algo así como:

<?php unset($out); if($a) $out = ''[SOME CONTENT TO INSERT INTO THE TEMPLATE]''; else $out = ''[SOME ALTERNATIVE CONTENT]''; templateInsert($out); ?>

Lo bueno de esto: su HTML se puede ver como tal y, como tal, se lo puede cambiar, su diseñador puede darle sentido y no tiene que mirar a través de su código tratando de juntar los pedazos de diferentes lugares sin ninguna posibilidad de ver lo que ella está haciendo. Por otro lado, puede hacer cambios en la lógica sin preocuparse por cómo se verá en la página. Probablemente también cometerá menos errores porque su código será compacto y, por lo tanto, legible.


Algo que desearía haber sabido la primera vez que comencé a hacer PHP: mantenga su código de programa para trabajos pesados ​​tan lejos de su salida de HTML como sea posible. De esa forma, ambos se quedan en pedazos grandes, bastante contiguos y legibles.

La mejor forma que he encontrado de hacer esto es hacer primero un archivo HTML estático, tal vez con algunos datos falsos para que pueda hojear y obtener el diseño correcto, luego escribir el código PHP para obtener la parte dinámica de la salida y pegarlos los dos juntos (cómo le va a esa parte depende de usted; podría hacerlo con Smarty como sugieren otros).


Si debe hacerlo de cualquier manera, use las llaves. No haga eco de HTML con PHP.


Si vas a hacer las cosas de esa manera, quieres separar tu lógica y diseño, cierto.

Pero no necesita usar Smarty para hacer esto.

La prioridad es acerca de la mentalidad. He visto gente haciendo cosas impactantes en Smarty, y eventualmente se convierte en personas que desarrollan sitios en Smarty, y luego una brillante chispa decidirá que necesitan escribir un motor de plantilla en Smarty (Nunca subestimes el potencial de una idea tonta).

Si divide su código en dos partes y se obliga a cumplir un estándar, obtendrá un rendimiento mucho mejor.

PageLogic.php

<?php $pageData = (object)(array()); // Handy trick I learnt. /* Logic Goes here */ $pageData->foo = SomeValue; ob_start(); require("layout.php"); ob_end_flush();

Layout.php

<html> <!-- etc --> <?php for ( $i = 1; $i < 10; $i++ ){ ?> <?php echo $pageData->foo[$i]; ?> <?php } ?> <!-- etc --> </html>

PHP se escribió como un motor de plantillas, por lo que al menos debería intentar usarlo para su tarea diseñada antes de evaluar si necesita profundizar en Smarty.

Además, si decide utilizar un motor de plantillas, intente obtener uno que escapa de HTML de forma predeterminada y opte por "no participar" en lugar de "aceptar". Te ahorrarás muchos dolores de cabeza XSS. Smarty es débil a este respecto, y debido a esto, hay muchas plantillas ingenuas de contenido escritas en él.

{if $cond} {$dangerous_value} {else} {$equally_dangerous_value} {/if}

Es en general cómo van las plantillas Smarty. El problema es que $ dangerous_value puede ser HTML arbitrario y esto solo lleva a prácticas de codificación aún más malas con códigos de espagueti imposibles de rastrear en todas partes.

Cualquier lenguaje de plantilla que considere debe atender esta preocupación. p.ej:

{$code_gets_escaped} {{$code_gets_escaped_as_a_uri}} {{{$dangerous_bare_code}}}

De esta manera, sus puertas potenciales para la explotación son fácilmente discernibles en la plantilla, en lugar de que la puerta de entrada a la explotación sea el comportamiento POR DEFECTO .


La consideración más importante es mantener la lógica separada de la presentación; menos acoplamiento hará que los cambios futuros sean mucho más sencillos.

Incluso podría considerar el uso de algún tipo de sistema de plantillas como Smarty .


Es mejor separar completamente su lógica (código PHP) de la presentación (HTML), utilizando un motor de plantillas.

Es rápido y fácil insertar PHP en HTML, pero se vuelve muy rápido y muy difícil de mantener. Es un enfoque muy rápido y muy sucio ...

En cuanto a cuál de todos los motores de plantillas disponibles en PHP es mejor, consulte estas preguntas, por ejemplo: