2012-08-09 48 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");