2009-08-21 11 views
8

Je suis en train de déconner avec des modèles et j'ai couru dans une situation où j'ai besoin d'écho au navigateur un modèle qui contient html & php. Comment puis-je évaluer le PHP et l'envoyer au navigateur?PHP Eval qui évalue HTML et PHP

est donc ici un exemple (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> 

Et puis dans le template.php:

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

EDIT: Mon modèle vous permet également d'injecter des données du contrôleur Smarty-style. Est-ce qu'un tampon de sortie me permettrait de faire cela et ensuite évaluer mon php. L'idéal est de faire un premier passage dans le code et d'évaluer toutes les balises en premier, puis de lancer le php. De cette façon, je peux créer des boucles et des trucs à partir des données envoyées par mon contrôleur.

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> 

Merci!

Répondre

10

Utilisez plutôt la mémoire tampon de sortie. eval() est notoirement lente.

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> 

Votre fichier:

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

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

echo $contents; 

La sortie de ce sera:

Lorem Ipsum

Supérieur à 10!

+0

je ce que mon modèle clarifié le fait, ce serait encore travailler? – Matt

+0

Oui, vous pouvez utiliser les variables que vous avez déjà déclarées dans le modèle. Vous ne pouvez cependant pas utiliser {$ title} comme vous l'avez fait - cela affichera simplement ce texte littéralement. Vous devez dire au template que c'est PHP. J'ai mis à jour ma réponse pour démontrer. –

+0

Cette réponse devrait être acceptée! –

2

Ne pas lire le fichier, mais l'inclure et utiliser le buffer de sortie pour capturer le résultat.

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

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

Modifier

utiliser une fonction pour générer un nouveau champ variable.

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 .. comment j'injecterais des données alors? – Matt

+0

De plusieurs façons. Est-ce que la chaîne remplace $ content, rend les globals disponibles à main.php avant de l'inclure, la liste s'allonge encore et encore. –

+1

Je ne pense pas que cela fonctionnerait .. Inclure inclurait des erreurs avant que vous ayez une chance de faire des remplacements de chaînes. – Matt

32

Si vous essayez de, vous pouvez le faire faire avec une chaîne de HTML/PHP mixte (comme à partir d'une base de données, comme je l'étais) de cette façon:

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

Plus d'info : http://blog.5ubliminal.com/posts/eval-for-inline-php-inside-html/ (noter que ceci est un lien mort au 2014-3-3)

+0

Merci !!!!!! –

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

Pour améliorer la qualité de votre réponse, veuillez indiquer comment/pourquoi votre message résoudra le problème. –

1

La meilleure solution dans votre cas est de combiner eval et 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

Selon la réponse @Josh, la façon plus simple est:

eval('?>'.$htmlandphp);