自定义模型创建后前台不显示
上周接手一个企业站迁移项目,客户在后台创建了“产品参数”自定义模型,添加了20个字段,数据也录入完毕,但前台页面死活不显示,检查模板标签、刷新缓存都无效,最终发现是模型与栏目绑定的问题。
排查步骤:
- 登录后台 → 栏目管理 → 选择目标栏目 → 修改 → 基本设置 → “所属模型”下拉框 → 确认选中的是“产品参数”模型
- 检查自定义模型是否勾选了“前台使用状态”:系统→自定义模型→找到该模型→点击“管理字段”→确认状态为“启用”
- 模板调用代码需指定模型ID:
[e:loop={"select * from [!db.pre!]ecms_product where checked=1 order by id desc limit 10",10,24,0}]
<li><a href="<?=$bqsr[titleurl]?>"><?=$bqr[title]?></a></li>
[/e:loop]
关键点:24是模型ID(需在后台“数据表管理”查看对应模型ID),ecms_product是自定义模型生成的数据表名。
灵动标签SQL调用:复杂查询的终极武器
客户要求首页展示“最近3天发布、点击量超过100且包含图片”的内容,列表标签无法实现这种组合条件,必须用灵动标签+原生SQL:
帝国CMS数据表同步日志,从模型创建到全站搜索的实战故障排查手册
[e:loop={"select * from [!db.pre!]ecms_article where checked=1 and ispic=1 and onclick>100 and newstime>UNIX_TIMESTAMP()-259200 order by id desc limit 12",12,24,0}]
<li>
<a href="<?=$bqsr[titleurl]?>" title="<?=$bqr[title]?>">
<?=substr($bqr[title],0,30)?> (点击:<?=$bqr[onclick]?>)
</a>
<span><?=date('Y-m-d',$bqr[newstime])?></span>
</li>
[/e:loop]
参数说明:第二个参数填写模型ID(系统模型中1为文章,2为下载等),第四个参数0表示分页模式(1启用分页),SQL字段ispic是帝国默认图片标识。
列表模板与内容模板变量调用:别再重复造轮子
普通开发者常困惑:列表页和内容页分别能调用哪些系统变量?
列表模板(ListModel)可用变量:
$bqr:当前记录数组(包含所有字段)$bqsr:当前记录专用数组(包含缩略图路径、标题链接等扩展信息)$class_r:当前栏目信息数组$url:当前列表页URL$page:分页导航字符串
<!-- 列表页调用缩略图 --> <img src="<?=$bqr[titlepic]?>" alt="<?=$bqr[title]?>" /> <!-- 调用副标题字段(需在模型添加"smalltitle"字段) --> <h3><?=$bqr[smalltitle]?></h3>
模板(ShowModel)可用变量:**
$navinfor数组$addr:文章阅读路径数组- 所有字段用
$navinfor[字段名]调用 __VIEWURL__:当前文章伪静态URL(仅限内容页)
<a href="<?=$navinfor[downurl]?>" class="download-btn">立即下载</a>
<!-- 调用多行文本字段(编辑器内容) -->
<div class="content-body"><?=stripslashes($navinfor[content])?></div>
万能标签 vs 智能标签:场景为王
这两个标签常被混淆,直接对比:
| 特性 | 万能标签(phomenews/phpolnews等) | 智能标签(infolist/newstext等) |
|---|---|---|
| 本质 | PHP函数封装,支持高度定制参数 | 模板引擎结构化标签,支持嵌套 |
| 性能 | 较高(直接执行SQL) | 略低(需解析标签属性) |
| 灵活度 | 可调用任意表,自定义排序 | 仅限系统预设模型和排序方式 |
| 适用场景 | 复杂多条件查询、跨模型调用 | 常规列表展示、需要标签嵌套时 |
万能标签示例(调用下载模型附件大小前十):
[phomeinfo]10,24,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0[/phomeinfo] <!-- 参数:个数,模型ID,栏目ID,子栏目,...最后一个1表示按filesize排序 -->
智能标签示例(带条件过滤):
[e:infolist={3,0,0,0,20,2,0,0,0,1,0,0,0,0,0,0,0,0}]
<li><a href="[!--titleurl--]">[!--title--]</a></li>
[/e:infolist]
选择原则:若需调用副表字段、自定义排序或跨模型,用万能标签;若需保持模板整洁和应用系统缓存,用智能标签。
全站搜索配置与自定义字段索引
客户反馈:搜索“关键词A”能搜到文章,但搜不到产品参数模型中的“材质”字段内容,排查发现:自定义字段未加入搜索索引。
配置步骤:
- 后台 → 系统设置 → 系统管理 → 数据表管理 → 找到产品模型的数据表(如
ecms_product) - 点击“管理系统表” → 找到“材质”字段 → 编辑 → 搜索类型 → 选择“可搜索”
- 关键步骤:执行重建索引 → 系统 → 其他管理 → 搜索索引重建 → 选择对应数据表 → 确认
SQL验证(查看哪些字段已启用搜索):
SELECT field, fieldname, issearch FROM `[!db.pre!]enewsf` WHERE tbname='ecms_product' AND issearch=1
模板搜索表单设置(让搜索包含自定义字段):
<form action="/e/search/index.php" method="GET" name="searchform"> <input type="hidden" name="show" value="title,smalltext,newstext,caizhi" /> <!-- show参数指定搜索字段,用逗号分隔 --> <input type="text" name="keyboard" placeholder="输入关键词" /> <input type="submit" value="搜索" /> </form>
模板中调用附表字段的实现技巧
帝国CMS文章内容存储在副表ecms_article_data_1中,但主模板中$bqr无法直接调用副表字段(如newstext、writer等),必须通过$bqsr或配合SQL:
直接使用$bqsr(推荐)
<?php
// 列表页自动包含副表字段(需在标签中设置)
[e:loop={"select * from [!db.pre!]ecms_article where checked=1 limit 10",10,24,0}]
<div><?=$bqr[title]?><br>副表):<?=substr($bqsr[newstext],0,200)?><br>
作者:<?=$bqsr[writer]?>
</div>
[/e:loop]
手动联表查询
[e:loop={"select ecms_article.*, ecms_article_data_1.* from [!db.pre!]ecms_article left join [!db.pre!]ecms_article_data_1 on ecms_article.id=ecms_article_data_1.id where ecms_article.checked=1 limit 10",10,24,0}]
<div>
<?=$bqr[writer]?> - <?=substr($bqr[newstext],0,300)?>
</div>
[/e:loop]
注意:使用联表查询时,主表别名和字段别名需保持一致,避免冲突,模型ID为24时,副表名称为ecms_模型数据表名_data_模型ID。
日志记录最佳实践:同步失败回溯
完成以上所有调整后,务必修改e/config/config.php启用数据库同步日志:
// 开启数据库操作日志 $ecms_config['db']['dblog']=1; $ecms_config['db']['dblogtime']=3600; // 日志保留时间(秒)
查看日志位置:后台 → 系统 → 数据库管理 → 数据库日志,当自定义模型数据同步失败时,日志会记录:
[2024-01-15 14:23:45] SQL Error: Table 'ecms_product_data_24' doesn't exist
这意味着系统试图同步副表但表不存在,需在“管理数据表”中执行“修复表”动作。
终极技巧:在e/class/connect.php的Insertuser函数开头添加:
file_put_contents('/tmp/ecms_sync.log', date('Y-m-d H:i:s')." - ".serialize($add)."\n", FILE_APPEND);
这样每次数据同步写入文件,方便离线排查同步失败原因,且不影响前台性能。



发表评论