2013-10-02 36 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> 

(它沒有必須的功能,您可以將輸出到一個變量,你可以調用一個宏,宏名也可以是變量)。