在没有php的情况下将变量添加到Smarty Capture块

时间:2015-10-06 13:05:22

标签: templates smarty

我试图了解聪明的捕捉系统。 在我的情况下,我无法访问php,而smarty处于某种安全模式。 我也无法使用包含因为我无法创建新文件。

所以我想宣布我可以用作"模板"的Html部件。在模板中。

我想要的是什么:

// Here i define the smarty Block which i want to use multiple times
{capture name="test"}
  <h1>{$item_type}</h1>
{/capture}

// foreach ...
{foreach [...]}
  {if $someVariable eq 0}
    {assign var="var_item_type" value="test"}
  {elseif $someVariable eq 1}
    {assign var="var_item_type" value="another test"}
  {/if}

  // here i want to Output the Block with the Variable
  {$smarty.capture.test}

{/foreach}

但是现在它不起作用。根本没有输出。

2 个答案:

答案 0 :(得分:1)

它不会起作用,因为变量$ item_type在捕获块中输出时被处理为子 - 所以是空的,你得到的只是<h1></h1>

好消息是,如果你使用smarty 3,你可以使用{function} 并这样做:

{function titlefy}
<h1>{$text}</h1>
{/function}

稍后在任何你想要的地方调用它:

{titlefy text=$var_item_type}

编辑:所以事实证明你正在使用Smarty 2 ......好吧,并非所有希望都失去了。您可以尝试使用您想要变量的标识符来创建子模板引擎,并在以后替换它们:

{capture name="test"}
   <h1>%title</h1>
   <h2>%subtitle</h2>
{/capture}

并将其命名为:

{$test|replace:'%title':$var_item_type|replace:'%subtitle':'something else'}

不是理想的解决方案,但考虑到约束条件,如果代码块长达数行并且您需要在多个位置使用它,这可能很有用

答案 1 :(得分:1)

将Smarty 捕获用于模板变量( assign = popText 非常重要):

{capture name=some_content assign=popText}
{capture some_content assign=popText} {* short-hand *}
The server is {$my_server_name|upper} at {$my_server_addr}<br>
Your ip is {$my_ip}.
{/capture}
<a href="#">{$popText}</a>

http://www.smarty.net/docs/en/language.function.capture.tpl