迅睿CMS 模板里集成自定义字段:从建字段到前台输出
迅睿CMS的自定义字段是它相对好用的地方之一,但链路上有几处容易断。这篇按顺序走一遍:建字段 → 配置 → 模板输出。 一、在哪里建 后台「内容 → 内容模块 → 选模块 → 字段管理 → 添加字段」。 字段类型有文本框、多行文本、下拉、
迅睿CMS的自定义字段是它相对好用的地方之一,但链路上有几处容易断。这篇按顺序走一遍:建字段 → 配置 → 模板输出。
一、在哪里建
后台「内容 → 内容模块 → 选模块 → 字段管理 → 添加字段」。
字段类型有文本框、多行文本、下拉、单选、多选、图片、附件、日期、编辑器等。类型一旦选定,发布后不能改。改类型等于删了重建,已录入的数据全部丢。
我踩过一次:给一个「标签」字段选了单选,上线一周后运营说要能多选,只能新建一个字段,然后写脚本把旧数据搬过去。半小时的活变成了两小时。
二、字段名和字段别名的区别
建字段时有两栏:
- 字段名(fieldname):英文,写进数据库列名,模板里也用它
- 字段别名(name):中文,只在后台显示
模板里用的是字段名。别名写了「副标题」,字段名是 subtitle,模板里就写 {$t.subtitle}。
这一点跟栏目名一样,写中文名是最常见的空输出原因。
三、前台输出的三种场景
1. 内容页(show)
{$subtitle}
{$seo_keywords}
在内容页模板里,自定义字段跟内置字段同级,直接写字段名。
2. 列表页(list)
{module module="news" num="10"}
<h2>{$t.title}</h2>
<p>{$t.subtitle}</p>
{/module}
循环体里加 $t. 前缀。
3. 跨模块调用
{module module="product" num="6"}
<img src="{$t.thumb}" alt="{$t.title}">
<span>{$t.price}
自定义字段跨模块时同样能用,只是那个模块里得真有这个字段。
四、最常见的三个坑
坑一:字段没勾「前台显示」
字段配置页有个「前台调用」或者类似的开关(不同版本位置不同)。不勾的话,数据库里有值,模板里输出空。
这个坑最气人,因为后台编辑页能看到填了值,模板里什么都没有,一看数据是存在的。
坑二:图片字段返回的是数组
图片字段(type=image)存的不是字符串,是一个数组,通常含 url、width、height 等键。
直接 {$t.thumb} 输出会打出「Array」。正确写法:
{$t.thumb.url}
或者多图字段用循环:
{loop $t.pics $pic}
<img src="{$pic.url}">
{/loop}
坑三:多选字段是逗号分隔串
多选下拉、多选复选框,存的是 "1,3,5" 这样的字符串,不是数组。
想在前台拆开遍历,得先用标签处理:
{loop explode(",", $t.tags) $tag}
<span>{$tag}</span>
{/loop}
另外,多选字段存的往往是选项值,不是选项文字。选项配的是「值=1,文字=科技」,前台拿着 1 想显示「科技」,得自己去查一遍选项配置。
这是迅睿一个不太顺手的地方。我的做法是:如果选项少,直接在模板里写死一张映射表;如果选项多,就写个小函数挂在钩子里。
五、改字段后要清缓存
加完自定义字段,前台不显示,先清缓存——后台右上角有「更新缓存」,或者删掉 /cache/ 下对应的文件。
迅睿会把字段配置缓存在内存或者文件里,改完不清,模板里还是旧的字段列表,新字段可能直接报未定义。
这条几乎是我每次加字段后的固定动作,比排查错误快多了。