循环属性 Loop Properties
在循环内,除了元素本身,常需要「当前是第几个」「是不是第一个 / 最后一个」「一共多少个」这类元数据。DouView 提供两套访问方式:推荐的 @property 语法,与命名循环的 $douview.foreach.NAME.*。
一、@property 语法(推荐)
无需声明 name,直接在 item 变量后用 @ 前缀访问,由运行期 RenderContext::loopProp() 取值:
| 属性 | 说明 | 示例输出 |
|---|---|---|
@iteration |
当前迭代序号(从 1 开始) | 1, 2, 3... |
@index |
当前索引(从 0 开始,= iteration - 1) | 0, 1, 2... |
@total |
循环总数 | 5 |
@first |
是否为第一个元素(iteration <= 1) | true / false |
@last |
是否为最后一个元素(iteration == total) | true / false |
@show |
循环是否有数据(total > 0) | true / false |
{foreach from=$articles item=article}
{if $article@first}<strong>【最新】</strong>{/if}
{$article@iteration}. {$article.title}
{if $article@last}<em>(共 {$article@total} 篇)</em>{/if}
{/foreach}
@property 在 {foreach} / {list} / {category} 三种循环里通用。
二、命名循环 $douview.foreach.NAME.*
声明 name 后,可用 $douview.foreach.NAME.* 访问该命名循环的属性,支持 index / first / last / show:
{foreach from=$users item=user name=user_list}
{$douview.foreach.user_list.index}: {$user.name}
{/foreach}
$smarty.foreach.NAME.* 作为兼容别名同等可用。
三、两套语法的取值口径差异(重要)
两者底层都读 $ctx->loops[NAME] 的 iteration / total,但暴露的属性集不同,使用时须留意:
| 需求 | @property | $douview.foreach.NAME.* |
|---|---|---|
| 从 1 开始的序号 | @iteration 可靠 |
无 iteration,用 index + 1 换算 |
| 从 0 开始的索引 | @index |
index |
| 循环总数 | @total 可靠 |
无直接 total 属性 |
| 首 / 末 / 是否有数据 | @first @last @show |
first last show |
其中 index 在两套语法下都等于 iteration - 1。因为 iteration / total 仅在 @property 语法下直接可靠取值,推荐优先使用 @property({$item@iteration}、{$item@total} 等),更简洁也更不易出错。
四、注意事项
@property依附于item变量名:引擎用loopVarmap把item名映射到循环名,所以同一item名在嵌套循环里应保证唯一,避免映射串位。name若省略,引擎会自动生成一个内部循环名(形如_auto_序号_item名),此时无法用$douview.foreach.NAME.*访问,但@property照常可用。