循环属性 Loop Properties

循环属性 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 照常可用。
添加日期: