您可以尝试在循环外描述条件并使用@iteration属性。例如:
在您的 PHP 文件中:
$lastIteration = count($rows);
$smarty->assign('classMapping', array(
1 => 'item-first', // iteration always starts at one
$lastIteration => 'item-last',
));
在您的模板中:
{foreach $rows as $row}
<li class="item {$classMapping[$row@iteration]}">{$row.title}</li>
{/foreach}
但是我认为您的代码(带有if
语句)还不错。
更新
这是 Smarty 3foreach
函数的源代码:http: //smarty-php.googlecode.com/svn/trunk/distribution/libs/sysplugins/smarty_internal_compile_foreach.php
查看类Smarty_Internal_Compile_Foreach
和方法complile()
(这是此方法的“缩短”版本,描述了它如何使用@first
修饰符):
public function compile($args, $compiler, $parameter)
{
$ItemVarName = '$' . trim($item, '\'"') . '@';
// evaluates which Smarty variables and properties have to be computed
if ($has_name) {
$usesSmartyFirst = strpos($tpl->source->content, $SmartyVarName . 'first') !== false;
} else {
$usesSmartyFirst = false;
}
$usesPropFirst = $usesSmartyFirst || strpos($tpl->source->content, $ItemVarName . 'first') !== false;
return $output; // output - is a result of the compilation process
}
因此,只有在更改 Smarty 核心类之后,您才能创建自己的内部foreach
修饰符(@position
例如)。