2012-08-09 51 views
2

背景 Smarty是一个模板引擎,将表示层与Web应用程序的逻辑层分开。它非常适合开发Web应用程序的模型 - 视图 - 控制方法。该视图可以由Smarty模板表示,其中只包含HTML和Smarty标签。该控件可以通过PHP文件实现,该文件基于PHP代码中包含的逻辑提供相应的视图。视图通过display()命令显示模板来实例化。或者,可以将模板作为变量读入,而不通过fetch()命令进行显示。模板的文件名是这两个命令的参数。如何获取()Smarty模板的子部分

问题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} 
    . . . 

回答

0

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

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

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");