3

背景Smarty は、Web アプリケーションのロジック層からプレゼンテーション層を分離するテンプレート エンジンです。これは、Web アプリケーションを開発するための Model-View-Control アプローチに適しています。ビューは、HTML と Smarty タグのみを含む 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、などには、テンプレート全体ではなく、関連するサブパーツのみが含まれます。

その他の情報私はSmarty の初心者ではありませんが、基本的な概念だけでなく、Smarty の高度な概念についてもかなりよく理解しています。以下は、問題を概念化し、解決策に到達するためのこれまでの私の試みです。私の最初の大まかなアイデアは、 を使用してテンプレートをセクションに区切り、{capture}次にこれらの各セクションを何らかの方法で参照することです。以下にアイデアの概要例を示します。

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

2 に答える 2

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");
于 2015-05-25T17:52:20.327 に答える
0

Smarty (Smarty 3.1 の時点) には、目的を達成するための機能が組み込まれていません。私は 2011 年に似たようなことを提案しましたが、それを実装するまでには至っていません。

たぶん、生成された HTML を DOM に解析して、xpath などで自分を助けることができますか?

于 2012-08-10T07:18:43.993 に答える