Как распечатать закрытые теги в макросах 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:<html>" />
<head>
head content
</head>
<tal:block tal:content="structure string:<body>" />
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>
(это не обязательно должна быть функция, вы можете назначить вывод переменной, вы можете вызвать макрос, и имя макроса тоже может быть переменной).