迅睿CMS 模板里读自定义字段值,dr_share_cat_value 和直接写不一样

· 迅睿CMS · 阅读 7
摘要

分类页要显示一段 SEO 描述,我在后台给分类加了自定义字段 seo_desc,模板里手写 {$cat.seo_desc},输出空白。改了半小时模板才发现,字段是加上了,但取值方式不对。 全局拿值和从对象拿值,是两套 迅睿的模板里,当前分类

分类页要显示一段 SEO 描述,我在后台给分类加了自定义字段 seo_desc,模板里手写 {$cat.seo_desc},输出空白。改了半小时模板才发现,字段是加上了,取值方式不对。

全局拿值和从对象拿值,是两套

迅睿模板里当前分类可以用 $cat 调,但那只覆盖内置字段。自定义字段得走函数:

// 模板文件:template/default/category/list.html
{dr_share_cat_value($cat.id, 'seo_desc')}

第一个参数是分类 ID,不是分类对象。我一开始把整个 $cat 传进去,返回空,也不报错,静悄悄就过去了。挺反直觉的。同类函数还有文章用的 dr_share_value,名字得对号入座。

列表循环里是另一回事

在 {dr_cat_list} 的循环体里,当前项已经带上了自定义字段,直接点出来就行:

{dr_cat_list pid=0 num=10}
    {if $t.seo_desc}
        <p>{$t.seo_desc}</p>
    {else}
        <p>{$t.name}</p>
    {/if}
{/dr_cat_list}

用 $t,别用 $cat——后者在循环里仍然指向外层那个分类,你会拿到重复的值而且百思不得其解。我第二次栽在这。

字段没值的时候别硬输出

没填的自定义字段是空字符串,直接吐出去就是个空标签,SEO 上不好看。包一层判断:

{if dr_share_cat_value($cat.id, 'seo_desc')}
<div class="cat-desc">{dr_share_cat_value($cat.id, 'seo_desc')}</div>
{/if}

会调用两次,这点开销可以忽略。别为了省一次调用去塞 PHP 变量,模板里混 PHP 后面更难维护。

改完不生效,先看清缓存

后台改了字段配置,模板缓存不清是看不到变化的。迅睿后台有「更新缓存」,我习惯改完顺手点一下。清完还不生效,就看字段是不是真的挂到了这个分类模型上——这个我没法隔空判断,去内容模型里确认一眼最稳。

另外那几个函数名不同版本有点出入,我手上这套是 2.x 的写法。你装的要是早期版本,直接去 system 目录里 grep 一下函数名,比翻文档快。