为什么我创建的自定义模型,前台就是不显示?
昨天一个客户在群里急得跳脚:“我明明在后台建了一个‘产品展示’模型,添加了十几个字段,数据也录入了几十条,可前台页面就是一片空白,连个错误提示都没有!”这种问题我每天都能遇到,十有八九是数据表同步出了问题。
排查步骤
-
检查模型是否绑定数据表
进入后台→模型管理→找到你的模型,查看“绑定数据表”字段,如果显示“未绑定”,点击“绑定数据表”,系统会自动创建phome_ecms_你的模型名,这里有个坑:如果手动删过表,需要先删除模型再重建。 -
查看系统数据表同步状态
执行SQL查询:帝国CMS数据表同步实战,从模型创建到全站索引的完整指南
SELECT * FROM phome_enewsclass WHERE classid=模型ID;
检查
newspath字段是否包含模型目录名,例如模型名为product,这里应显示product/。 -
强制同步数据表结构
如果以上正常,后台执行“数据更新→更新数据表结构”,勾选你的模型,重新生成缓存,这是最容易被忽略的步骤——尤其是你手工修改过表结构后。
灵动标签SQL调用:从“写死”到“智能”的跃迁
大多数新手写灵动标签时,习惯了select * from phome_ecms_news where classid=1这种硬编码,但实际应用中,我们需要实现“当前栏目下所有子栏目的最新文章”这种动态需求。
正确写法
[e:loop={"select * from phome_ecms_news where classid in (select classid from phome_enewsclass where bclassid='$GLOBALS[navclassid]') and checked=1 order by newstime desc limit 10",10,24,0}]
<li><a href="<?=$bqsr[titleurl]?>"><?=$bqr[title]?></a></li>
[/e:loop]
参数解析:
- 第一个参数是SQL语句,注意用单引号包裹字符串变量
- 第二个参数是调用数量(10条)
- 第三个参数是操作类型(24代表列表模式,必须与标签类型匹配)
- 第四个参数是是否显示附件(0否1是)
高级技巧:跨模型调用
select a.*,b.classname from phome_ecms_news a left join phome_enewsclass b on a.classid=b.classid where a.firsttitle=1
这样就可以在灵动标签里直接输出$bqr[classname]。
列表模板与内容模板变量:别再手动拼HTML了
经常有人问我:“为什么我用灵动标签循环出来的内容,在列表页显示正常,到内容页就不行了?”这通常是因为你不清楚模板变量的作用域。
列表模板中调用当前文章
<!-- 列表模板(list.var) --> <a href="<?=$class_r[$r[classid]]['classurl']?>" target="_blank"><?=$class_r[$r[classid]]['classname']?></a>
重点:$r是当前记录数组,$class_r是全局栏目数组,要用$r[classid]去索引$class_r。
模板中调用上一篇/下一篇
<?php
$pr=$empire->fetch1("select id,title from {$dbtbpre}ecms_news where id<".$navinfor['id']." and classid='".$navinfor[classid]."' order by id desc limit 1");
$ne=$empire->fetch1("select id,title from {$dbtbpre}ecms_news where id>".$navinfor['id']." and classid='".$navinfor[classid]."' order by id asc limit 1");
?>
上一篇:<a href="<?=$public_r[newsurl]?>e/action/ShowInfo.php?classid=<?=$navinfor[classid]?>&id=<?=$pr[id]?>"><?=$pr[title]?></a>
下一篇:<a href="<?=$public_r[newsurl]?>e/action/ShowInfo.php?classid=<?=$navinfor[classid]?>&id=<?=$ne[id]?>"><?=$ne[title]?></a>
万能标签vs智能标签:选错等于白干
这两个标签是帝国CMS里最容易被混淆的功能,直接说结论:
- 智能标签:适合对性能要求极高的场景,比如首页调用最新文章,它会自动生成静态缓存,但只能调用资讯模型,且字段限制多。
- 万能标签:可以调用任何模型(包括自定义字段),支持多表联查,但每次访问都会执行SQL。
万能标签示例:调用下载模型的文件名
[wztag:sql,0,1,1,10]select * from phome_ecms_download where checked=1 order by newstime desc[/wztag:sql] <ul> [wztag:list] <li><a href="[wztag:titleurl/]">[wztag:title/] - [wztag:softsay/]</a></li> [/wztag:list] </ul>
关键点:[wztag:softsay/]是下载模型的字段名,智能标签无法直接输出此字段。
全站搜索配置:让自定义字段也能被搜到
默认的全站搜索只索引标题和正文,如果想让“产品型号”“价格”等自定义字段被搜索到,必须手动配置。
步骤
- 后台→系统设置→搜索配置→增加搜索字段
- 写入SQL:
ALTER TABLE `phome_ecms_article_data_1` ADD FULLTEXT INDEX `idx_modelno` (`modelno`);
(假设你的自定义字段名为
modelno,表后缀_data_1对应模型ID) - 在“自定义字段索引”中勾选该字段,保存后重新生成索引。
验证搜索
测试搜索“M-2024”:
SELECT * FROM phome_ecms_article_data_1 WHERE MATCH(modelno) AGAINST('M-2024' IN BOOLEAN MODE)
如果返回为空,检查索引是否重建成功。
模板中调用附表字段:绕开“只读主表”的限制
帝国CMS为了提高效率,主表只存储核心字段,自定义字段存在_data附表里,在模板中直接调用$r[modelno]会返回空,正确做法有两种:
SQL联表
在灵动标签SQL中写:
select a.*,b.modelno from phome_ecms_news a left join phome_ecms_news_data_1 b on a.id=b.id where a.classid=1
然后模板中用$bqr[modelno]输出。
系统函数模板中:
<?php
$fid=$navinfor['id'];
$fr=$empire->fetch1("select modelno from {$dbtbpre}ecms_news_data_1 where id='$fid'");
echo $fr['modelno'];
?>
注:_data_1中的数字1是模型ID,务必核对。



发表评论