2013-10-02 34 views
2

我正在将站点转换为使用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> 

(它没有必须的功能,您可以将输出到一个变量,你可以调用一个宏,宏名也可以是变量)。