2

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>タグが含まれており、それらがフッターで閉じられていることです。マクロが有効な xml ではないため、PHPTAL が例外をスローしています。

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

これを行うためのよりクリーンな方法はありますか?<html>andの欠落している終了タグを無視できるようにするある種の tal 属性<body>でしょうか?

4

1 に答える 1

1

PHPTAL は、不正なマークアップの出力を可能な限り困難にするように設計されており、閉じられていないタグは不正なマークアップです。

printHeader/printFooter関数を持つべきではありません。これを裏返しにして、printContent()関数のようなものを用意し、ヘッダーとフッターの両方を含むテンプレートから呼び出す必要があります。

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

  ${php:printContent()}

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

(関数である必要はありません。出力を変数に割り当てたり、マクロを呼び出したり、マクロ名を変数にすることもできます)。

于 2013-10-26T11:29:30.330 に答える