我正在将网站过渡到使用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>解决这个问题最简单的方法是什么?我已经找到了一个变通方法,使用structure将这些标记作为字符串包含在内,但它似乎很草率:
<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>缺少的结束标记
发布于 2013-10-26 19:29:30
PHPTAL的设计目的是使输出格式错误的标记变得尽可能困难,而未闭合的标记就是格式错误的标记。
你永远不应该有printHeader/printFooter函数。你需要把这个从里到外翻转,像printContent()函数一样,从包含页眉和页脚的模板中调用它:
<!DOCTYPE>
<title>Header is here</title>
<body>
${php:printContent()}
<p>Footer is here</p>
</body>(它不一定是函数,你可以将输出赋给一个变量,你可以调用一个宏,宏名也可以是变量)。
https://stackoverflow.com/questions/19148199
复制相似问题