如何获取()Smarty模板的子部分

时间:2012-08-09 20:18:39

标签: smarty smarty3

背景 Smarty是一个模板引擎,它将表示层与Web应用程序的逻辑层分开。它非常适合用于开发Web应用程序的模型 - 视图 - 控制方法。 View可以由Smarty模板表示,它只包含HTML和Smarty标签。 Control可以通过PHP文件实现,这些文件通过PHP代码根据其中包含的逻辑提供适当的视图。通过display()命令显示模板来实例化View。或者,可以将模板作为变量读入,而不通过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等只包含相关的子部分,而不是整个模板。

其他信息是Smarty的初学者,对基本概念以及Smarty的一些高级概念有相当好的处理能力。以下是我到目前为止在概念化问题和寻求解决方案方面的尝试。我最初的粗略想法是使用{capture}将模板划分为多个部分,然后以某种方式引用这些部分。我在下面提出了这个想法的大纲示例。

    {capture name=sec1}
    <div id="sec1">
        First section
    </div>
    {/capture}
    . . .

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

你可以试试这个:

<强> sec1.tpl

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

<强> sec2.tpl

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

<强>在index.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");