迅睿CMS 自定义字段建了取不出来:数据调用里的几个坑

· 迅睿CMS · 阅读 24
摘要

迅睿CMS自定义字段在后台建好了,模板里调用却是空白,问题多半不在字段本身,而在取值方式或作用域。这篇先分清字段存在主表还是附表——列表页默认只查主表,必须加 more=1 才连附表——再讲字段绑定模块、字段类型影响输出、以及详情页和列表页取值的差别,最后给出按顺序排查的清单。

自定义字段在后台加好了,模板里写 {\$t.字段名} 却是空白——这不是字段没存住,多半是取值方式或作用域不对。

一、先分清字段存在哪张表

迅睿CMS 的内容数据分主表和附表。主表存标题、时间、状态、点击数这类高频字段;附表存正文和自定义字段。

位置典型字段查询成本
主表id、title、updatetime、hits、status低
附表content、自定义字段高(需关联)

列表页默认只查主表,所以自定义字段一律取不到。这不是 bug,是性能设计。

二、列表页取自定义字段要显式声明

{module module=news page=1 pagesize=10 order=updatetime more=1}
  <span>{\$t.字段名}</span>
{/module}

more=1 触发附表关联。加了这个参数才有值,去掉就是空。

代价是查询变重:10 条还行,50 条以上明显变慢。列表页确实需要展示自定义字段时,建议只保留一两个必要字段,或者把该字段冗余到主表。

三、详情页为什么有时也是空

详情页默认已合并附表,正常情况下直接取就有。还取不到,按这个顺序查:

  1. 字段名大小写:模板里写错一个字母就空白,且不报错。
  2. 字段是否属于当前模块:字段是绑模块的,A 模块的字段在 B 模块模板里取不到。
  3. 字段类型:单行文本、多行文本、下拉、图片,取值形态不同。图片字段存的是文件 ID 或路径,可能还要再调一次取地址。
  4. 内容是否有值:老文章发布时字段还没建,那些记录的该字段是 NULL。批量补默认值能解决。

第四条最常见:字段是后来加的,历史数据全空,看着像取值错误,其实数据本来就没有。

四、字段值不是纯文本时怎么处理

图片字段

存的是附件记录关联,直接输出可能是一串 ID。要走附件取值:

{if \$t.thumb}
  <img src="{\$t.thumb}" alt="{\$t.title}">
{/if}

部分版本会直接返回可用路径,取决字段配置里「存储方式」的选择,配错就得手工拼。

下拉/单选字段

存的是选项值(key),不是显示文字。要显示中文标签,得在模板里做映射,或者把字段配置成存值即文本。

{if \$t.level == 'a'}高级{elseif \$t.level == 'b'}中级{else}初级{/if}

多选/关联字段

存的是序列化数组或逗号串,直接输出会是乱码样的字符串。要循环展开:

{loop \$t.tags \$k \$v}
  <span>{\$v}</span>
{/loop}

传进来的不是数组时,{loop} 不执行也不报错,页面就静默少一块内容。取值前最好判断类型。

五、字段改了名,历史数据去哪了

后台把字段名从 price 改成 jiage,数据库列名跟着改还是新建列,取决于版本的实现。保守做法是:

  • 项目上线后不改字段名
  • 要改就新建字段、跑一次数据迁移、验证后再删旧字段
  • 改之前先导出该表结构备查

直接改名导致历史数据对不上,是二次开发里最难查的一类问题——模板、控制器、数据三层全对不上,且没有报错。

六、一个自检方法

怀疑取值有问题时,在模板里临时打一行:

{php}var_dump(\$t);{/php}

把当前行完整结构打出来,字段在不在、值是什么、类型是什么,一眼看清。查完记得删掉,别留在线上。

七、小结

  • 列表页取自定义字段必须 more=1
  • 字段绑模块,跨模块取不到
  • 图片、下拉、多选字段存的不是纯文本,要按类型处理
  • 后加的字段对历史数据是 NULL,不是取值失败
  • 字段名上线后不要改

到这里,迅睿CMS 这条线从目录结构、模块配置、模板标签、URL 规则、缓存性能到数据调用,六个面都过了。下一篇换个方向,写 WordPress 和迅睿CMS 在二次开发上的思路差异。