自定义模型创建后前台不显示的排查过程
今天接到一个紧急工单:客户在后台新建了一个“产品评测”自定义模型,添加了10条数据,但前台无论怎么刷新都看不到,这种问题在帝国CMS二次开发中非常常见,通常有三个排查方向:
第一步:检查模型状态与栏目绑定
-- 查询模型是否启用 SELECT * FROM `phome_enewsmod` WHERE `mid` = 3 AND `tbname` = 'product_review' -- 检查模型字段是否设置为“前台显示”
第二步:验证栏目属性
帝国CMS数据表日志同步,从二次开发到全站搜索的完整技术方案
// 在栏目管理中找到绑定“产品评测”模型的栏目 // 检查“列表模板”是否选择正确,以及“是否隐藏”为0
第三步:排查模板调用代码 客户使用了如下列表标签:
[e:loop={"select * from phome_ecms_product_review where checked=1 order by newstime desc",10,24,0}]
<li><a href="<?=$bqsr[titleurl]?>"><?=$bqr[title]?></a></li>
[/e:loop]
问题出在checked=1条件——帝国CMS自定义模型的数据审核状态字段名可能不是标准的checked,需查看模型字段定义,修正后使用:
SELECT * FROM phome_ecms_product_review WHERE isgood=1 AND classid IN (SELECT classid FROM phome_enewsclass WHERE bclassid=0)
灵动标签SQL调用的高阶技巧
在数据表日志同步场景中,灵动标签是处理跨表查询的利器,例如需要同步“文章模型”和“下载模型”的评论数据时:
// 灵动标签实现多表联合查询
[e:loop={"select a.title, a.newstime, b.filename from phome_ecms_article a left join phome_ecms_download b on a.id=b.id where a.classid in (1,2) and b.isgood=1 order by a.newstime desc",5}]
<?php
$act = new Act();
$content = $act->eget($bqr['id'],'content','article'); // 获取附表字段
?>
<li>文章:<?=$bqr['title']?> 关联下载:<?=$bqr['filename']?></li>
[/e:loop]
注意:当联合查询涉及附表时,需要用eget函数动态获取,避免主查询SQL过于庞大。
列表模板与内容模板的变量调用全解析
很多开发者混淆了列表页和内容页的变量体系,在《帝国CMS数据表日志同步》项目中,我们统一了变量命名规范:
列表模板常用变量:
$bqr['title'] // 标题
$bqr['titleurl'] // 动态URL
$bqr['classid'] // 栏目ID
$bqr['newstime'] // 发布时间戳 -> date('Y-m-d', $bqr['newstime'])
$bqr['smalltext'] // 简介
$bqr['keyboard'] // 关键词
$bqr['onclick'] // 点击数
模板专用变量:**
$navinfor['newstext'] // 正文内容 $navinfor['writer'] // 作者 $navinfor['befrom'] // 来源 $navinfor['titlepic'] // 标题图片 $navinfor['downpath'] // 下载地址(下载模型) $navinfor['buycar'] // 购物车参数(商城模型)
跨模型调用示例(在内容页显示同栏目文章):
// 利用全局变量$GLOBALS['navinfor']获取当前信息 $classid = $GLOBALS['navinfor']['classid']; $sql = "SELECT id,title FROM phome_ecms_article WHERE classid=$classid AND id!=".$GLOBALS['navinfor']['id']." ORDER BY newstime DESC LIMIT 5";
万能标签与智能标签的实战区别
在数据同步需求中,我们经常需要根据日志记录动态生成导航或推荐位:
万能标签(灵活但需手动管理SQL):
<!-- 万能标签:适用于复杂条件聚合 -->
[e:loop={"SELECT id,title FROM phome_ecms_article WHERE checked=1 AND (keyboard LIKE '%同步%' OR keyboard LIKE '%日志%') ORDER BY newstime DESC",8,24,0}]
<li><a href="<?=$bqsr[titleurl]?>"><?=esub($bqr['title'],30)?></a></li>
[/e:loop]
适用场景:需要多条件组合、子查询、临时表运算时。
智能标签(模板引擎自动处理):
<!-- 智能标签:适用于简单列表展示 --> [ecmsinfo]栏目ID=1,8,24,0,0,1,0,'newstime DESC'[/ecmsinfo]
参数含义:栏目ID=1, 显示8条, 24小时更新, 0=无分页, 0=无推荐, 1=显示标题图片, 0=无附加SQL, 排序字段。
选择建议: 当需要调用其他站点的数据(多库同步)或需要对结果集做二次计算时,使用万能标签;只做简单列表展示时,智能标签更高效。
全站搜索配置与自定义字段索引
客户反馈“产品评测”模型的“评分字段”无法被搜索到,这是因为帝国CMS默认只索引主表字段:
第一步:开启自定义字段索引
进入系统设置 → 数据表管理 → 找到产品评测表 phome_ecms_product_review → 索引管理
-- 手动执行索引SQL ALTER TABLE `phome_ecms_product_review_index` ADD FULLTEXT INDEX `idx_score` (`score`); ALTER TABLE `phome_ecms_product_review` ADD FULLTEXT INDEX `idx_score` (`score`);
第二步:更新搜索配置
在e/config/config.php中修改:
// 添加自定义模型的搜索表名 $ecms_config['search']['searchtb'] = 'phome_ecms_article,phome_ecms_product_review'; // 设置搜索结果排序字段 $ecms_config['search']['orderby'] = 'score DESC';
第三步:前端搜索表单改进
<form action="/e/search/index.php" method="get" target="_blank"> <input type="hidden" name="tbname" value="product_review"> <input type="text" name="keyboard" placeholder="输入产品名称/评分区间"> <input type="hidden" name="show" value="title,score"> <!-- 指定搜索字段 --> <input type="submit" value="搜索"> </form>
注意:搜索框需隐藏tbname字段指向自定义模型表名。
模板中调用附表字段的实现技巧
附表字段(如多图片、富文本)在模板中直接$bqr['字段名']是取不到的,必须通过:
使用公共函数(推荐)
<?php require_once ECMS_PATH.'e/class/db_sql.php'; $link=db_connect(); $eget = new Act(); $morefield = $eget->eget($bqr['id'],'morepic,scores','product_review'); // $morefield['morepic'] 多图片数组 // $morefield['scores'] 评分详情 ?>
SQL联表查询(适用于列表页批量调用)
SELECT a.*, b.morepic, b.scores FROM phome_ecms_product_review a LEFT JOIN phome_ecms_product_review_data b ON a.id=b.id WHERE a.checked=1 ORDER BY a.newstime DESC LIMIT 10
注意:_data表是附表,主键与主表id对应。
帝国CMS自带的JS调用(适用于异步加载)
<script src="/e/extend/ecmsapi.php?classid=1&id=<?=$bqr[id]?>&tbname=product_review&fieldid=morepic"></script>
数据表日志同步的最终解决方案
经过以上排查,我们定位到最终问题:自定义模型创建后,数据表日志同步机制未触发,帝国CMS需要手动刷新模型缓存:
- 后台 → 数据表管理 → 点击“更新数据表缓存”
- 系统设置 → 数据更新 → “更新所有缓存”
- 检查
phome_enewslog表中是否有对应的模型操作日志SELECT * FROM `phome_enewslog` WHERE `pubid`=3 AND `doing`='add' ORDER BY `logtime` DESC LIMIT 5
若日志显示“字段同步失败”,则进入模型字段管理,将所有字段的“前台显示”重新保存一次,至此,前台列表页正常显示数据,搜索功能也完美支持自定义评分字段的索引。
整个过程中,帝国CMS的日志表phome_enewslog成为我们排查问题的关键线索,建议在二次开发中,养成定期查看数据表日志的习惯——它记录了每次模型操作、字段修改和缓存更新的完整轨迹,是定位“数据不同步”问题的第一手资料。



发表评论