0

代替:

{foreach $rows as $row}
    <li class="item{if $row@first} item-first{elseif $row@last} item-last{/if}">{$row.title}</li>
{/foreach}

有没有办法做这样的事情?

{foreach $rows as $row}
    <li class="item item-{$row@position}">{$row.title}</li>
{/foreach}

这可以输出:

item-first item-last

我想如果只有 1 行那么它需要输出以上两个?

4

1 回答 1

2

您可以尝试在循环外描述条件并使用@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例如)。

于 2012-11-14T19:00:10.517 回答