Я возился с шаблонами, и я столкнулся с ситуацией, когда мне нужно эха в браузере создать шаблон, содержащий html и php. Как я могу оценить PHP и отправить его в браузер?
Итак, вот пример (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>
И затем в template.php:
<?php $contents; // Contains main.php in string format echo eval($contents); // Doesn't work... How do I do this line?? ?>
EDIT: мой шаблон также позволяет вам вводить данные из контроллера Smarty. Будет ли выходной буфер позволить мне сделать это, а затем оценить мой php. Идеальным является то, что он выполняет первый проход через код и сначала оценивает все теги, а затем запускает php. Таким образом, я могу создавать циклы и прочее, используя данные, отправленные с моего контроллера.
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>
Благодаря!
Если вы пытаетесь сделать это со строкой смешанного HTML / PHP (например, из базы данных, как и я), вы можете сделать это следующим образом:
eval(' ?>'.$htmlandphp.'<?php ');
Дополнительная информация: http://blog.5ubliminal.com/posts/eval-for-inline-php-inside-html/ (обратите внимание, что это мертвая ссылка с 2014-3-3)
Вместо этого используйте буферизацию вывода. eval()
как известно, медленный.
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>
Ваш файл:
$title = 'Lorem Ipsum'; $id = 11; ob_start(); require_once('main.php'); $contents = ob_get_contents(); ob_end_clean(); echo $contents;
Результатом этого будет:
Lorem Ipsum
Больше 10!
Не читайте файл, но включайте его и используйте выходной буфер для фиксации результата.
ob_start(); include 'main.php'; $content = ob_get_clean(); // process/modify/echo $content ...
редактировать
Используйте функцию для создания новой области переменных.
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
$contents = htmlentities($contents); echo html_entity_decode(eval($contents));
Лучшим решением в вашем случае является объединение output buffer
и 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;
Согласно @Josh ответ, более простой способ:
eval('?>'.$htmlandphp);