0

静的文字列をキャプチャする場合の Smarty バージョン 2:

{capture name=test}
 a huge page or string can go here
 {/capture}

{$smarty.capture.test} を使用して、キャプチャした文字列を現在のテンプレートまたは子テンプレートの両方に問題なくダンプできます。

次のような「{foreach}」ループをキャプチャしようとすると:

 {capture name=test}
  {foreach item=Row from=$DataGrid.Rows name=RowsGrid}
    ,['{$Row.DataCells.project_name.Data}', {$Row.DataCells.approved_budget.Data}]
{/foreach}
 {/capture}

次のように、現在のテンプレートで簡単に使用できます。

   {$smarty.capture.test}

正しいデータを文字列として表示します。ただし、子テンプレートで使用しようとすると:

 {include file='/full/path/child.tpl'}
 {$smarty.capture.test}

次のような空のキャプチャされたデータになります。

  ,['', ] ,['', ] ,['', ] 

{$smarty.capture.test|var_dump} を使用すると、「string(86)」と表示されます。何が欠けていますか?

4

2 に答える 2

0

私はあなたの最後のサンプルでchild.tplテスト変数を埋めると仮定しています。その後、それをインクルードテンプレートで使用しようとします。Smarty がスコープを処理する方法を考えると、空の出力は完全に正しいです。スコープは下方向にのみ継承します。親は、子によって設定された変数にアクセスできません。

フィルターで変数を直接使用すると、スコープ チェックがバイパスされるようです。これは、実装のバグになることは間違いありません。繰り返しになりますが、Smarty 2 は何年も前のもので、v3 は何年も使用されておりTwigは HTML5 時代でははるかに実用的です。

于 2014-09-08T22:16:23.730 に答える
0

問題なく動作します:

PHP ファイル:

$smarty->assign('data', array(
        array('name' => 'a1'),
        array('name' => 'a2'),
        array('name' => 'a3'),
        array('name' => 'a4'),
        array('name' => 'a5')
    ));
$smarty->display('normal.tpl');

normal.tplファイル:

{include file='child.tpl'}
{$smarty.capture.test}

child.tplファイル:

{capture name=test}
    {foreach item=Row from=$data}
        ,['{$Row.name}']
    {/foreach}
{/capture}

この出力は期待どおりです。

,['a1'] ,['a2'] ,['a3'] ,['a4'] ,['a5'] 

変数が正しく割り当てられていることを確認する必要があります。そうでない場合は、詳細を提供する必要があります。

于 2014-09-16T16:46:47.873 に答える