如何在PHPTAL宏中打印未关闭的标签

时间:2013-10-02 23:02:36

标签: php html phptal template-metal

我正在将网站转换为使用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 个答案:

答案 0 :(得分:1)

PHPTAL旨在尽可能地输出格式错误的标记,并且未关闭的标记是格式错误的标记。

您永远不应该拥有printHeader / printFooter个功能。您需要从内到外翻转并使用printContent()函数,并从包含页眉和页脚的模板中调用它:

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

  ${php:printContent()}

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

(它不一定是函数,你可以将输出分配给变量,你可以调用一个宏,宏名也可以变量)。