3

背景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}
    . . .
4

2 回答 2

0

Smarty(从 Smarty 3.1 开始)没有内置功能可以让您实现目标。我在 2011 年提出了类似的建议,但我们还没有开始实施。

也许您可以将生成的 HTML 解析为 DOM 并使用 xpath 或类似的东西帮助自己?

于 2012-08-10T07:18:43.993 回答
0

你可以试试这个:

sec1.tpl

<div id="sec1">First section</div>

sec2.tpl

<div id="sec2">Second section</div>

索引.tpl

<html><body>
{include file="sec1.tpl"}
{include file="sec2.tpl"}
</body></html>

然后你可以通过调用来获取部分:

 $smarty = new Smarty;
$div1 = $smarty->fetch("sec1.tpl");
$div2 = $smarty->fetch("sec2.tpl");
于 2015-05-25T17:52:20.327 回答