2009-08-21 14 views
8

Estoy jugando con la creación de plantillas y me he encontrado con una situación en la que necesito hacer eco en el navegador de una plantilla que contiene html & php. ¿Cómo evalúo el PHP y lo envío al navegador?PHP Eval que evalúa HTML y PHP

Así que aquí es un ejemplo (main.php):

<div id = "container"> 
     <div id="head"> 
      <?php if ($id > 10): ?> 
       <H3>Greater than 10!</H3> 
      <?php else: ?> 
       <H3>Less than 10!</H3> 
      <?php endif ?> 
     </div> 
      </div> 

Y luego en el template.php:

<?php 
      $contents; // Contains main.php in string format 
      echo eval($contents); // Doesn't work... How do I do this line?? 
    ?> 

EDIT: Mi plantilla también le permite inyectar datos desde el controlador Smarty-style. ¿Un buffer de salida me permitiría hacer esto y luego evaluar mi php? Lo ideal es que haga una primera pasada a través del código y evalúe todas las etiquetas primero, luego ejecuta el php. De esta forma puedo crear bucles y cosas utilizando los datos enviados desde mi controlador.

So maybe a more complete example: 
    <div id = "container"> 
      <div id = "title">{$title}</div> <!-- This adds data sent from a controller --> 
      <div id="head"> 
       <?php if ($id > 10): ?> 
        <H3>Greater than 10!</H3> 
       <?php else: ?> 
        <H3>Less than 10!</H3> 
       <?php endif ?> 
      </div> 
    </div> 

¡Gracias!

Respuesta

10

Use el búfer de salida en su lugar. eval() es notoriamente lento.

main.php:

<div id="container"> 
    <div id="title"><?php echo $title; ?></div><!-- you must use PHP tags so the buffer knows to parse it as such --> 
    <div id="head"> 
     <?php if ($id > 10): ?> 
      <H3>Greater than 10!</H3> 
     <?php else: ?> 
      <H3>Less than 10!</H3> 
     <?php endif ?> 
    </div> 
</div> 

Su archivo:

$title = 'Lorem Ipsum'; 
$id = 11; 

ob_start(); 
require_once('main.php'); 
$contents = ob_get_contents(); 
ob_end_clean(); 

echo $contents; 

La salida de este habrá:

Lorem Ipsum

¡Más de 10!

+0

clarifiqué lo que hace mi plantilla, sería esto todavía trabajar? – Matt

+0

Sí, puede usar las variables que ya ha declarado en la plantilla. No puede, sin embargo, usar {$ title} como lo hizo, esto simplemente mostrará ese texto literalmente. Tienes que decirle a la plantilla que eso es PHP. He actualizado mi respuesta para demostrar. –

+0

¡Esta respuesta debe ser aceptada! –

2

No lea el archivo, pero inclúyalo y use buffer de salida para capturar el resultado.

ob_start(); 
include 'main.php'; 
$content = ob_get_clean(); 

// process/modify/echo $content ... 

Editar

utilizar una función para generar un nuevo ámbito de las variables.

function render($script, array $vars = array()) 
{ 
    extract($vars); 

    ob_start(); 
    include $script; 
    return ob_get_clean(); 
} 

$test = 'one'; 
echo render('foo.php', array('test' => 'two')); 
echo $test; // is still 'one' ... render() has its own scope 
+0

Hmm ... ¿cómo podría inyectar datos? – Matt

+0

Cualquier cantidad de formas. ¿Reemplaza la cadena en $ contenido, hacer globales disponibles para main.php antes de incluirlo, la lista sigue y sigue. –

+1

No creo que esto funcione. Incluir arrojaría errores antes de que tuviera la oportunidad de reemplazar una cadena. – Matt

32

En caso de que están tratando de hacer esto con una serie de mezclado HTML/PHP (como a partir de una base de datos, como yo), puede hacerlo de esta manera:

eval(' ?>'.$htmlandphp.'<?php '); 

Más información : http://blog.5ubliminal.com/posts/eval-for-inline-php-inside-html/ (tenga en cuenta que este es un vínculo roto a partir del 2014-3-3)

+0

Gracias !!!!!! –

1
$contents = htmlentities($contents); 
echo html_entity_decode(eval($contents)); 
+2

Para mejorar la calidad de su respuesta, incluya cómo y por qué su publicación resolverá el problema. –

1

La mejor solución en su caso es combinar eval y output buffer

// read template into $contents 
// replace {title} etc. in $contents 
$contents = str_replace("{title}", $title, $contents); 
ob_start(); 
    eval(" ?>".$contents."<?php "); 
$html .= ob_get_clean(); 
echo html; 
0

Según la respuesta @ Josh, la manera más simple es:

eval('?>'.$htmlandphp);