TP5.1全系列循环标签语法无变化,{volist}与{foreach}兼容所有5.1.x版本,日期显示异常源于模板渲染阶段未格式化时间戳,而非循环逻辑问题。

TP5.1 中 {volist} 和 {foreach} 的循环语法始终兼容
无论你用的是 5.1.0 还是 5.1.41,以下写法都有效:
-
{volist name="list" id="vo"}和{foreach $list as $key=>$vo}行为一致,仅模板引擎层面差异,不涉及版本迭代变更 - 支持
offset、length、mod、empty、key等属性,且含义和用法未调整 - 允许直接在标签内调用方法,如
{volist name=":model('user')->all()" id="vo"},该特性自 5.1.0 起就已稳定
你以为的“日期循环变化”,其实是时间字段渲染问题
常见错觉来源:
- 数据库存的是 int 时间戳(如
create_time),但模板里直接写{$vo.create_time}→ 输出一串数字,误以为“循环没生效” - TP5.1 默认对模板变量启用
htmlentities过滤,所以{$vo.time|date="Y-m-d"}必须加|raw才能正确渲染 HTML 标签(但日期字符串本身不需要) - 模型中若定义了
getCreateTimeAttr,它只在单条模型实例化时触发;volist循环的是原始数组(非完整模型对象),获取器不自动执行
TP5.1.41 特别注意:时间戳转日期的可靠写法
不要依赖获取器在 volist 中生效,改用显式格式化:
- 控制器中预处理:
$list = User::all()->toArray(); array_walk($list, function(&$item) { $item['create_time'] = date('Y-m-d H:i:s', (int)$item['create_time']); }); $this->assign('list', $list); - 模板中直接使用:
{volist name="list" id="vo"}{$vo.create_time}{/volist} - 或模板内格式化(需确保无 XSS 风险):
{volist name="list" id="vo"}{$vo.create_time|date="Y-m-d"}{/volist},注意此时不加|raw——date是安全函数,不会被二次过滤



















