我正在使用 Smarty 2,想知道是否有更好/更整洁的方法来assign
设置evenRow
一行的值,而不是下面的 5 行。
{if $evenRow == 'on'}
{assign var='evenRow' value='off'}
{else}
{assign var='evenRow' value='on'}
{/if}
考虑到 Smarty 在某些地方可以与 PHP 紧密结合,我很惊讶这在网上不容易找到,因为在 PHP 中做这样的事情会很简单。
我正在使用 Smarty 2,想知道是否有更好/更整洁的方法来assign
设置evenRow
一行的值,而不是下面的 5 行。
{if $evenRow == 'on'}
{assign var='evenRow' value='off'}
{else}
{assign var='evenRow' value='on'}
{/if}
考虑到 Smarty 在某些地方可以与 PHP 紧密结合,我很惊讶这在网上不容易找到,因为在 PHP 中做这样的事情会很简单。
我为此创建了一个插件:
修饰符.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”,它将返回“一”,如果它是“6”,将返回“另一个数字”
在你的情况下,它会像:
{assign var='evenRow' value=$evenRow|choice:'on':'off':'on'}
来自Smarty 文档(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}
方法。