2009-08-21 15 views
8

Zajmuję się szablonowaniem i natknąłem się na sytuację, w której muszę wyświetlać w przeglądarce szablon zawierający html & php. Jak mogę ocenić PHP i wysłać go do przeglądarki?PHP Eval, który ocenia HTML i PHP

Tak oto przykład (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> 

A potem w template.php:

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

EDIT: Mój szablon pozwala również wprowadzić dane z kontrolera Smarty w stylu. Czy bufor wyjściowy pozwoli mi to zrobić, a następnie ocenić mój php. Ideałem jest to, że robi pierwsze przejście przez kod i ocenia wszystkie znaczniki w pierwszej, a następnie uruchamia php. W ten sposób mogę tworzyć pętle i inne dane z danych wysyłanych z kontrolera.

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> 

Dzięki!

Odpowiedz

10

Zamiast tego użyj buforowania wyjściowego. eval() jest notorycznie powolny.

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> 

Plik:

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

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

echo $contents; 

Wyjście to będzie:

Lorem Ipsum

Większa niż 10!

+0

mi wyjaśnić, co robi mój szablon, byłoby to jeszcze działa? – Matt

+0

Tak, możesz użyć zmiennych, które już zadeklarowałeś w szablonie. Nie możesz jednak użyć {$ title}, tak jak zrobiłeś - pokaże to tekst dosłownie. Musisz powiedzieć szablonowi, że to PHP. Zaktualizowałem swoją odpowiedź, aby zademonstrować. –

+0

Ta odpowiedź powinna zostać przyjęta! –

2

Nie odczytuj pliku, ale dołącz go i użyj bufora wyjściowego, aby uchwycić wynik.

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

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

Edit

użyć funkcji, aby wygenerować nowy zakres zmienny.

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 .. jak mam wtedy wprowadzić dane? – Matt

+0

Dowolna liczba sposobów. Czy string zastępuje zawartość $, udostępnia globale main.php przed jej włączeniem, lista jest długa. –

+1

Nie sądzę, by tak działało ... Uwzględnienie spowoduje błędy, zanim masz szanse na zastąpienie ciągu. – Matt

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

Aby poprawić jakość odpowiedzi, proszę podać, w jaki sposób/dlaczego Twój post rozwiąże problem. –

1

najlepszym rozwiązaniem w Twoim przypadku jest łączenie eval i 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

Według @Josh odpowiedzi, prostszym sposobem jest:

eval('?>'.$htmlandphp);