【问题标题】:How to print unclosed tags in PHPTAL Macros如何在 PHPTAL 宏中打印未关闭的标签
【发布时间】:2013-10-02 23:02:36
【问题描述】:

我正在将网站转换为使用 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();
}

我遇到的问题是我的页眉包含开头的&lt;html&gt;&lt;body&gt; 标签,它们在页脚中关闭。 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 属性可以让它忽略 &lt;html&gt;&lt;body&gt; 缺少的结束标签?

【问题讨论】:

    标签: php html phptal template-metal


    【解决方案1】:

    PHPTAL 旨在使格式错误的标记尽可能难以输出,未闭合的标签是格式错误的标记。

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

    <!DOCTYPE>
    <title>Header is here</title>
    <body>
    
      ${php:printContent()}
    
      <p>Footer is here</p>
    </body>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      相关资源
      最近更新 更多