使用Smarty 2在一行上分配变量值

时间:2013-10-29 09:54:20

标签: php variables smarty template-engine smarty2

我正在使用Smarty 2,并想知道是否有更好/更整洁的方式使用assign在一行上设置evenRow的值,而不是下面的5行。

{if $evenRow == 'on'}
   {assign var='evenRow' value='off'}
{else}
   {assign var='evenRow' value='on'}
{/if}

考虑到Smarty可以与PHP非常接近,我很惊讶这在网上很容易找到,因为在PHP中做这样的事情会很简单。

3 个答案:

答案 0 :(得分:1)

您不能将分配指定为分配以外的其他内容。

不要使用assign。使用cycle

{cycle  assign='evenRow' values="off,on"}

答案 1 :(得分:0)

来自Smarty documentation(Smarty 3):

  
    

尽管Smarty可以处理一些非常复杂的表达式和语法,但将模板语法保持在最小化并专注于表示是一个很好的经验法则。如果您发现模板语法过于复杂,最好通过插件或修饰符将未明确处理的位移动到PHP。

  

他们基本上建议你应该保留模板中的逻辑数量,而不是使用函数或修饰符。对于简单的情况,您可以使用简单表达式作为属性值:

{assign var=test_var value=!empty($some_input)}

对于更复杂的示例,您可以编写自己的修饰符:

function smarty_modifier_do_something_complex($input) {
  // Process input and return value
}

并像这样使用它:

{assign var=test_var value=$some_input|do_something_complex}

或者你可以坚持使用更详细的{if} … {else} … {/if}方法。

答案 2 :(得分:0)

我为此创建了一个插件:

<强> modifier.choice.php

function smarty_modifier_choice()
{
    $no_choice="";
    $args=func_get_args();
    $patro=$args[0];
    $numconds=sizeof($args)-1;


    if ($numconds%2) {$no_choice=$args[$numconds];}

    for ($i=1;$i<$numconds; $i+=2)
    {
        if ($patro==$args[$i]) {return $args[$i+1];}
    }
    return $no_choice;
}

将它保存到你的smarty / plugins文件夹中并像这样使用它:

{$variable|choice:'1':'one':'2':'two':'3':'three':'another number'}

如果最后一个字符串未配对,则认为它是默认值,但您也可以使用默认修饰符:

{$variable|choice:'1':'one':'2':'two':'3':'three'|default:'another number'}

所以如果$ variable为“1”,它将返回“one”,如果它是“6”将返回“另一个数字”

在你的情况下,它会像:

{assign var='evenRow' value=$evenRow|choice:'on':'off':'on'}