Как распечатать закрытые теги в макросах PHPTAL

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

Старые страницы используют стандартный верхний и нижний колонтитулы, типичная страница имеет свой контент, сгенерированный следующим образом:

printHeader();
//print page content
printFooter();

Новые страницы в PHPTAL будут использовать тот же стандартный верхний и нижний колонтитулы, поэтому я перемещаю их в макросы. Я хочу использовать один и тот же исходный HTML-код как для новых, так и для старых верхних и нижних колонтитулов. Для этого я хочу отредактировать функции printHeader() и printFooter(), чтобы использовать шаблон для печати макросов верхнего и нижнего колонтитула:

printHeader() {
   $source = '<metal:use-macro="macros.xhtml/header" />';
   $header = new PHPTAL()
   $header->setSource($source);
   echo $header->execute();
}

У меня проблема в том, что мой заголовок содержит открытие <html> а также <body> теги, которые закрываются в нижнем колонтитуле. PHPTAL выдает исключение, потому что мои макросы не являются допустимыми XML:

Not all elements were closed before end of the document. Missing: </tal:block></tal:block></tal:block></body></html></tal:block>

Какой самый простой способ обойти это? Я нашел обходной путь, используя структуру для включения этих тегов в виде строки, но это выглядит неаккуратно:

<tal:block metal:define-macro="header">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<tal:block tal:content="structure string:&lt;html&gt;" />
   <head>
      head content
   </head>         
   <tal:block tal:content="structure string:&lt;body&gt;" />
      header content

Есть ли более чистый способ сделать это? Может быть, какой-то атрибут tal, который позволит игнорировать отсутствующие закрывающие теги для <html> а также <body>?

1 ответ

PHPTAL разработан для того, чтобы сделать вывод некорректной разметки как можно более сложным, а незакрытые теги - неправильной разметкой.

Вы никогда не должны иметь printHeader/printFooter функции. Вы должны перевернуть это наизнанку и иметь что-то вроде printContent() и вызовите его из шаблона, который включает в себя как верхний, так и нижний колонтитулы:

<!DOCTYPE>
<title>Header is here</title>
<body>

  ${php:printContent()}

  <p>Footer is here</p>
</body>

(это не обязательно должна быть функция, вы можете назначить вывод переменной, вы можете вызвать макрос, и имя макроса тоже может быть переменной).

Другие вопросы по тегам