2010-05-08 14 views
7
<? 
if($id == 2) { 
?> 
     html goes here 
<? 
} 
else { 
?> 
     if id is not 2 then something goes here 
<? 
} 
?> 

¿Cómo puedo escribir php + html en un archivo más bonito sin aprender smarty?¿Cómo escribir php + html en un archivo más bonito?

+0

La belleza está en ... realmente no importa. Si trabajas con diseñadores, es posible que les gusten las etiquetas cortas. – bschaeffer

Respuesta

23

Puede utilizar PHP's alternative syntax for control structures:

<? if ($id == 2): ?> 
    <h2>some html</h2> 
<? else: ?> 
    <h2>another html chunk</h2> 
<? endif ?> 

Tenga en cuenta que short_open_tags es una directiva de php.ini que necesita ser activado de forma explícita, de lo contrario tendría que escribir <?php cada vez.

+1

Siempre uso este estilo también. Se ve limpio, hace que sea muy fácil mover trozos de código, y es mucho más fácil entender lo que está sucediendo; ver un endif o endwhile te dice que eres más opuesto a un par de llaves. Por cierto, no olvides el punto y coma después de, p. terminara si; si necesita agregar más código: . – Alec

-2

By using this - PHP echo. Si eso es lo que quiere, es decir, puede ser más legible continuar lo que está haciendo si está produciendo grandes cantidades de HTML.

-2
<?php 

if($id == 2) { 
    //echo all your html stuff 
    echo "<title>Title is where id is 2</title>"; 
    echo "<h1>Hellow</h1>"; 

} 
else { 

    echo "<title>Title is where id isn't 2</title>"; 

} 

?> 
+0

Haciéndose eco de html ??? ¿A quién votó esta respuesta? No puedo preguntar qué pasará cuando los diseñadores se pongan las manos encima ... y de todos modos es una mala práctica. – Strae

+0

@DaNieL Sé que no es una buena idea repetir todo html. Pero teniendo en cuenta que Donator es un principiante (supongo), no hay necesidad de comenzar desde el principio con MVC, EOH, etc. Esta es una forma simple de repetir un enunciado HTML. – ggfan

+0

seguramente un patrón MVC completo es un poco complicado para un novato (ehm .. y para mí también;), pero creo que un buen consejo es encontrar otras soluciones, pequeñas y rápidas de implementar, para lograr su objetivo, pero sin fallar en otros puntos ... – Strae

1

Me gusta y uso método de soulmerge. Pero salir otra más:

<?php 

if ($id == 2) 
echo <<< END 
    <h2>some html</h2> 
END; 
else 
echo <<< END 
    <h2>another html chunk</h2> 
END; 

?> 
0

que podría hacerlo así ...

<? 
$html_1 = <<<EOH 
my html goes here 
EOH; 

$html_2 = <<<EOH 
my html <i>something else</i> html goes here 
EOH; 

echo ($id==2?$html_1:$html_2); 
?> 

peeero, si quieres que sea más fácil para sus diseñadores, sólo tiene que utilizar archivos externos:

<? 
$html=($id==2 ? file_get_contents("html_1.html") : file_get_contents("html_2.html")); 
$html=str_replace("%php generated content%", 1 + 1, $html); 
echo $html; 
?> 

y use sus palabras clave predefinidas para insertar el contenido calculado de PHP (como contenido% php generado% siendo reemplazado por 2 (1 + 1) en este ejemplo)

+0

La publicación original no menciona nada sobre el uso compartido de códigos con diseñadores, solo establece lo "bonito" que es. –

2

Recomiendo HEREDOC para algunos códigos HTML.

De esta manera:

<?php 
if($id==2) 
echo <<<EOT 
Blah 
EOT; 
else 
echo <<<EOT 
Your id is <b>{$id}</b> 
EOT; 
?> 

Además, puede intentar un enfoque en el que tiene dos archivos: un archivo PHP y un archivo phtml. El archivo php es la lógica principal, luego el archivo phtml es el resultado html.

Al igual que en su ejemplo,

// logic.php file 
if($id==2) 
$sOutput = 'Yes'; 
else 
$sOutput = 'No'; 
// somewhere at the end of the file 
include 'logic.phtml'; 

// logic.phtml 
<html> 
<title><?=$sOutput?></title> 
<body> 
Blah blah blah <?=$sOutput?> you can login 
</body> 
</html> 
+0

Nota agregada: si está trabajando con diseñadores, es posible que prefieran un archivo phtml más limpio porque no hay una gran cantidad de php allí para ponerse en el camino. – Daniel

+1

cuidado, las etiquetas cortas quedarán obsoletas en php6 – Strae

+1

Personalmente, creo que HTML en heredocs es espantoso –

0

Yo personalmente no me gusta usar las etiquetas cortas como las encuentro inconsistentes entre los archivos y prefieren apegarse a un método. En cualquier momento puede hacer que se vea un poco más legible con algunos cambios simples, así:

<? if($id == 2) { ?> 

     <p>html goes here</p> 

<? } else  { ?> 

     <span>if id is not 2 then something goes here</span> 

<? }     ?> 

Un poco más simple que algunas de las otras respuestas, sino también la forma en que iba a encontrar más legible. Realmente se trata de su preferencia, aunque se han sugerido muchos otros buenos métodos (así es como lo haría).

+0

Posiblemente haya demasiado espacio innecesario allí, pero me parece que es mejor alinear las etiquetas. Soy exigente así. – Jack

+1

solo como una nota al margen: ' Strae

+0

Lo sabía pero no lo noté en mi respuesta, ¡jaja! Gracias por mencionarlo. – Jack

5

Puede implementar la MVC (Modelo, Vista, Controlador) patrón de diseño, su código puede ser utilizado como un modele cargar la vista:

<?php 
if($id == 2) 
{ 
//somes variable and array controls 
} 
else 
{ 
//somes variable and array controls 
} 
//include the view 
include('view.php'); 
?> 

En el view.php, que muestran la página HTML con solo los ecos de las variables php y array.

+2

Usar el modelo MVC no significa que no puede haber lógica simple en la Vista. Si envía una matriz a la Vista desde el Controlador, aún necesita, p. foreach() para mostrar las variables de la matriz. En ese punto vuelves a la pregunta original. – Alec

+0

No hay ningún problema para eso, los invito a ver este hilo sobre la implementación de MVC donde publico un comentario http://stackoverflow.com/questions/2333093/how-to-implement-mvc-from-scratch-in-php/2799399 # 2799399 –

2

Como muchos otros sugirieron, podría usar el MVC, o si no desea implementar una estructura MVC estricta, debería utilizar un sistema de plantillas.

Esto no significa que tenga que aprender inteligentemente, puede escribir su propio sistema de plantillas, con solo la función que realmente necesita.

Si está trabajando con diseñadores y el rendimiento no es su primer punto, puede construir un archivo html con marcadores de posición simples donde el contenido dinámico tiene que ir, y luego reemplazarlo con php (str_replace, preg_replace) .. pero esto más lenta su aplicación.

Ejemplo:

//html template 
// the @[var] syntax is just as an example 
<title>@[title]</title> 
<body> 
    @[content] 
</body> 

y el archivo de plantillas:

$title = 'Hello world'; 
if($id == 2){ 
    $content = get_content(); 
}else{ 
    $content = get_another_content(); 
} 
//really, this is just as example ;) 
ob_start(); 
include('template.html'); 
$output = ob_get_clean(); 
echo str_replace(
    array('@[title]', '@[content]'), 
    array($title, $content), 
    $output 
); 

Este es realmente un ejemplo básico, y tiene 2 problemas:

  1. rendimiento;
  2. Los diseñadores deben tener instrucciones de NO tocar los marcadores de posición.

Una solución más simple puede ser:

//html template 
<title><?php echo $title; ?></title> 
<body> 
    <?php echo $content; ?> 
</body> 

y php:

$title = 'Hello world'; 
if($id == 2){ 
    $content = get_content(); 
}else{ 
    $content = get_another_content(); 
} 
include('template.php'); 

Pero html eco debe ser reducida como sea posible, no es una buena práctica y mezclar la lógica con contenido Logic is logic, data is data, and life is good

0

Agregando a la respuesta de DaNieL, podría hacer algo como:

function htmlVars($html, $vars){ 
    $html = preg_replace_callback('/@\[([0-9a-zA-Z_\$]*)\]/',function ($matches) use ($vars){ 
    return isset($vars[$matches[1]])?$vars[$matches[1]]:""; 
},$html); 
return $html; 
} 

Ejemplo:

echo htmlVars('foo is @[foo] and bar is not @[bar]', 
    Array('foo'=>'foo','bar'=>'barz')); 

Resultado:

foo is foo and bar is not barz 
funciones

anónimos sólo funcionan para PHP 5.3 o superior

4

Para un mejor mantenimiento posible futuro (diseño), que había sugiera algo como esto:

<?php 
if ($id == 2){ 
$someText = 'I like your id!'; 
}else{ 
$someText = 'I love your id!'; 
} 
?> 
<html> 
...complex html... 
<p><?php echo $someText ?></p> <!-- or <?= $someText ?> --> 
...complex html... 
</html> 
0

Hay dos casos realmente:

1) Código de la plantilla. Yo recomendaría el enfoque de soulmerge de la sintaxis alternativa para las estructuras de control.

2) Corto código PHP de vista auxiliar que genera resultados (por lo general, para sustituciones posteriores) que no necesariamente merecen su propia sub-plantilla.

Para 2 prefiero algo como:

public function draw(){ 
    $html = array(); 
    foreach($this->item as $item){ 
     $html[] = <<<EOD 
<li class="{$item->class()}">{$item->label()}</li> 
EOD; 
    } 
    return implode($html); 
} 

prefiero esto a través de cualquier tipo de alternativa poco firme que podría implicar ob_start() y ?> <?php bloques. Siempre desea que sus funciones devuelvan cadenas de caracteres, no emitan señales de salida directamente, de modo que las calles tengan la opción de concatenar y manipular los resultados sin pasar la carga de la salida de almacenamiento en búfer en el destinatario.

El heredoc hace que sea fácil identificar la salida de cadenas y aunque creo que la ruptura de la sangría es algo fea, termina siendo bastante efectiva ya que su salida html se destaca como pequeñas notas adhesivas. Eso, y el hecho de que en mi IDE (PDT), se resalta muy bien en verde. (No se ve aquí en el rotulador SO ...) así que siempre es explícito exactamente en qué tipo de "modo" estoy.

En contraste, la técnica ?> <?php hace que sea difícil distinguir html del código php. Una vez que lo haces un par de veces, es molesto rastrear si necesitas un ?> o un <?php. Finalmente, a menudo es más detallado hacer sustituciones con <?php echo $obj->func() ?> vs {$obj->func()}

Si su código se vuelve más complejo, entonces podría ser hora de refactorizar. Me gusta heredoc porque si estoy haciendo algo ad-hoc, se destacará y se volverá realmente obvio dentro de un par de meses (ad-hoc tiende a degenerar en bola de barro a medida que agrega requisitos) cuando tengo tengo 40 líneas de heredoc que podrían haber comenzado como 5. Cuando vuelvo y miro mi código y desarrollo la versión no totalmente ad-hoc, es mucho más fácil identificar las partes del archivo donde estaba siendo malo. Esto se remonta a las notas adhesivas, resaltando en verde el comentario que hice sobre la sangría también.

Cuestiones relacionadas