背景 Smarty 是一个模板引擎,将 Web 应用程序的表示层与逻辑层分开。它非常适合用于开发 Web 应用程序的模型- View -控制方法。 View 可以用 Smarty 模板表示,它只包含 HTML 和 Smarty 标签。控件可以由 PHP 文件实现,这些文件通过 PHP 代码根据包含在其中的逻辑为适当的 View 提供服务。通过 display()
命令显示模板来实例化 View 。或者,可以将模板作为变量读入,而不通过 fetch()
命令显示它。模板的文件名是这两个命令的参数。
问题 fetch()
命令可以读取整个模板。为了读取模板的部分/子部分,这些部分中的每一个通常都需要存储在一个单独的文件中,该文件具有自己的名称,可以作为命令的参数。这会创建不必要的文件。
问题是否可以通过某种方式标记模板的部分来仅获取 Smarty 模板的部分内容?
案例 下面我展示了一个带有 Smarty 和 HTML 标签的示例模板文件,以及带有 PHP 代码的相应 Controller 文件。
模板文件 (index.tpl)
<html>
<body>
<div id="sec1">
First section
</div>
<div id="sec2">
Second section
</div>
</body>
</html>
Controller 文件 (index.php)
<?php
$smarty = new Smarty;
$template = $smarty->fetch("index.tpl");
?>
在上面的示例中,$template
变量将包含模板页面的完整输出。下面是示例中的内容转储。
$template => string(255)
"<html><body>
<div id="sec1">First section</div>
<div id="sec2">Second section</div>
</body></html>"
但是,假设我希望分别从每个 DIV 容器中读取代码,并将它们存储到单独的变量中,我该如何实现呢?例如,假设我有一个名为 fetch_sub()
的神奇函数。这是我对使用它的期望。
<?php
$smarty = new Smarty;
$div1 = $smarty->fetch_sub("index.tpl", "sec1");
$div2 = $smarty->fetch_sub("index.tpl", "sec2");
?>
那么 $div1
等将只包含相关的子部分,而不是整个模板。
其他信息 我不是 Smarty 的初学者,并且对基本概念和 Smarty 的一些高级概念有相当好的处理。以下是我迄今为止对问题概念化和解决方案的尝试。我最初的粗略想法是使用 {capture}
将模板划分为多个部分,然后以某种方式引用每个部分。我在下面展示了这个想法的一个大纲示例。
{capture name=sec1}
<div id="sec1">
First section
</div>
{/capture}
. . .
最佳答案
Smarty(自 Smarty 3.1 起)没有内置功能来帮助您实现目标。我在 2011 年提出了类似的建议,但我们还没有开始实现它。
也许您可以将生成的 HTML 解析为 DOM 并使用 xpath 或类似的东西帮助自己?
关于smarty - 如何获取()Smarty模板的子部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11891286/