Можно ли использовать теги php внутри буфера ob_start? - PullRequest
1 голос
/ 29 марта 2012

Я пытаюсь создать сложную библиотеку шаблонов.Дело в том, что я держу свой собственный синтаксис и php в одном и том же файле, как смешанный.

  1. Сначала мой синтаксис анализируется и переформатируется.Вывод обычного html + php в виде строки.Я не хочу создавать кеш-файл, но вместо этого использую строку, содержащую «средний» шаблон.

  2. В этом шаблоне (строка, содержащая теги php и html) должны выполняться операции php.

MyComplexTemplate (мой синтаксис + php) = parse => Шаблон (HTML + PHP) = exec php => Результат (HTML)

для 2. Я пытаюсьиспользовать ob_start () с echo, но все внутри тегов php исчезает.

Например:

<?php
  $asd = "123";
  ob_start();
  echo "<div><?php echo $asd; ?></div>"; // Middle template
  $result = ob_get_contents();
  ob_end_clean();

  echo $result;
?>

Результат должен быть "

123
".На данный момент я получаю только теги div.

Это простой пример.Мой шаблон будет содержать все виды php-операций внутри php-тегов.

Возможна ли такая операция каким-либо образом?

UPDATE

Шаблон т.е.: (template.php)

.mySyntax (...) and so on
  <?php foreach($asd as $data): ?>
  <div><?php echo $data ?></div>
  <?php endforeach; ?>
  .mySyntax
    some text

Синтаксический анализ шаблона с MySyntaxParser и выполнение php после этого, который остается нетронутым:

<?php
  $t = new MySyntaxParser("template.php"); // My parser. Converts mySyntax to html.
  $asd = array("test1", "test2");

  ob_start();
  echo $t->parse(); // Should execute php code inside the string;
  $result = ob_get_contents();
  ob_end_clean();

  echo $result;
?>

ОБНОВЛЕНИЕ

Я хочу добиться абсолютно точной вещи, такой как здесь, но require_once должен как-то происходить из строки:

SOLUTION

На самом деле решение находится в этой теме PHP: эквивалент включения с использованием eval ,eval должен использоваться с pre и postpadded с php тегами.

Также вы должны проверить THIS blogpost.

Как здесь:

<?php
  $asd = "123";
  ob_start();
  eval ('?>
    <?php foreach(array("asd", "asx123") as $data): ?>
    <div><?php echo $data ?></div>
    <?php endforeach; ?>
  <?php;');
  ob_flush();
?>

Ответы [ 3 ]

2 голосов
/ 29 марта 2012

Хорошо, что я вижу в своем источнике <div><?php echo 123; ?></div>, что именно то, что вы ожидаете.Браузер обрабатывает <?php echo 123; ?> как один тег (который он не знает) и игнорирует его.

Более простое решение - использовать

echo "<div>$asd</div>";

Если вы хотите что-тоя предлагаю вам взглянуть на уже созданные и посмотреть, как они работают.Обратите особое внимание на фреймворки MVC и MVC.

0 голосов
/ 29 марта 2012
<?php
  $asd = "123";
  ob_start();
?>

  <div><?php echo $asd; ?></div>
  <div><?php include('mytemplate.php'); ?></div>

[...] // some stuff here

<?php
  $result = ob_get_contents();
  ob_end_clean();

  echo $result;
?>
0 голосов
/ 29 марта 2012

Вам не нужны теги PHP.Всего:

echo "<div>$asd</div>"; // Middle template
...