背景Smarty 是一个模板引擎,它将表示层与 Web 应用程序的逻辑层分开。它非常适合用于开发 Web 应用程序的模型-视图-控制方法。视图可以用 Smarty 模板表示,这些模板只包含 HTML 和 Smarty 标签。控件可以由 PHP 文件实现,这些文件通过 PHP 代码根据其中包含的逻辑提供适当的视图。通过display()
命令显示模板来实例化视图。或者,可以将模板作为变量读入,而无需通过fetch()
命令显示。模板的文件名是这两个命令的参数。
问题该fetch()
命令可以读取整个模板。为了读取模板的部分/子部分,这些部分中的每一个通常需要存储在一个单独的文件中,其名称可以作为命令的参数。这会创建不必要的文件。
问题是否可以通过以某种方式标记模板的部分来仅获取 Smarty 模板的一部分?
案例示例下面我展示了一个带有 Smarty 和 HTML 标签的示例模板文件,以及带有 PHP 代码的相应控制器文件。
模板文件 (index.tpl)
<html>
<body>
<div id="sec1">
First section
</div>
<div id="sec2">
Second section
</div>
</body>
</html>
控制器文件 (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
, etc 将仅包含相关的子部分,而不是整个模板。
其他信息我不是Smarty 的初学者,并且对基本概念以及 Smarty 的一些高级概念有相当好的掌握。以下是我迄今为止在概念化问题和寻求解决方案方面的尝试。我最初的粗略想法是使用 将模板划分为多个部分{capture}
,然后以某种方式引用这些部分中的每一个。我在下面给出了这个想法的一个概要示例。
{capture name=sec1}
<div id="sec1">
First section
</div>
{/capture}
. . .