2009-08-21 18 views
8

Sto scherzando con i modelli e mi sono imbattuto in una situazione in cui ho bisogno di echo al browser un modello che contiene html & php. Come valuto il PHP e lo invio al browser?Eval PHP che valuta HTML e PHP

Quindi, ecco un esempio (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> 

E poi in template.php:

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

EDIT: Il mio modello permette anche di inserire dei dati dal controller Smarty-style. Un buffer di output mi permetterebbe di fare questo e quindi valutare il mio php. L'ideale è che faccia un primo passaggio nel codice e valuti prima tutti i tag, quindi esegua il php. In questo modo posso creare loop e cose dall'utilizzo dei dati inviati dal mio controller.

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> 

Grazie!

risposta

10

Utilizzare invece il buffer di output. eval() è 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> 

Il file:

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

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

echo $contents; 

L'output di questo sarà:

Lorem Ipsum

Superiore a 10!

+0

ho chiarito quello che il mio modello fa, sarebbe questo ancora lavorare? – Matt

+0

Sì, puoi usare le variabili che hai già dichiarato nel modello. Tuttavia, non puoi usare {$ title} come hai fatto tu - questo mostrerà letteralmente quel testo. Devi dire al modello che quello è PHP. Ho aggiornato la mia risposta per dimostrare. –

+0

Questa risposta dovrebbe essere accettata! –

2

Non leggere il file, ma includerlo e utilizzare il buffer di output per acquisire il risultato.

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

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

Modifica

Utilizzare una funzione per generare un nuovo ambito variabile.

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 .. come potrei iniettare i dati allora? – Matt

+0

Qualsiasi numero di modi. Sostituisci le stringhe in $ content, rendi le globali disponibili su main.php prima di includerle, l'elenco potrebbe continuare all'infinito. –

+1

Non penso che funzionerebbe così .. Includi getterebbe errori prima che tu abbia la possibilità di fare sostituzioni di stringhe. – Matt

32

Nel caso in cui si sta tentando di fare questo con una serie di misto HTML/PHP (come da un database, come mi è stato), si può fare in questo modo:

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

Maggiori informazioni : http://blog.5ubliminal.com/posts/eval-for-inline-php-inside-html/ (notare che questo è un link morto come di 2014-3-3)

+0

Grazie !!!!!! –

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

Per migliorare la qualità della risposta, includi come/perché il tuo post risolverà il problema. –

1

La soluzione migliore nel tuo caso è quella di combinare eval e 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

Secondo @Josh risposta, il modo più semplice è:

eval('?>'.$htmlandphp);