我正在使用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>缺少的结束标记?

最佳答案

PHPTAL的设计目的是使格式错误的标记的输出尽可能困难,而未关闭的标记是格式错误的标记。
你不应该有printHeader/printFooter函数。您需要将其从内到外翻转,并使用类似于printContent()的函数,然后从包含页眉和页脚的模板调用它:

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

  ${php:printContent()}

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

(它不必是函数,可以将输出赋给变量,可以调用宏,宏名也可以是变量)。

09-18 00:51