自定义模型创建后,前台列表页空白如也?
你创建了“新品发布”模型,后台录入数据妥妥的,可前台访问/e/action/ListInfo.php?mid=5时,浏览器却甩给你一片白屏,别急着摔键盘,按这个顺序排查:
帝国CMS数据表归档实战,从模型失踪到全站搜索的六重门
第一步:确认模型ID,在后台“系统设置 → 数据表与模型”里,找到该模型对应的mid值(比如5),检查前台URL里的mid=5是否与后台一致。
第二步:检查模板是否存在,帝国CMS默认模板命名规则:列表模板为list5.htm模板为view5.htm,如果你的模板文件没放在e/template/temp/对应目录下,或者文件名拼错(比如list_5.htm),系统会直接报错但不提示,用FTP看一眼目录。
第三步:清空系统缓存,很多老手会忽略:后台“系统设置 → 性能优化 → 清空缓存文件”,同时删除e/temp/下的md5文件(如md5_5.php),因为帝国CMS会把已编译模板生成MD5文件缓存,模型改动后旧缓存会“幻觉般”存在。
第四步:检查SQL数据表是否存在,进入phpMyAdmin,确认phome_ecms_前缀的数据表已创建(比如phome_ecms_newproduct),如果没建,回到后台“数据表与模型 → 管理模型 → 重建数据表”。
灵动标签SQL调用,想调出“今日新增”且带图片的内容?
灵动标签[e:loop]本质是封装了query查询,但很多人掉进“字段名写错”的坑,比如你要调出news表今日发布的10条标题+缩略图:
[e:loop={"SELECT title, titlepic, id FROM phome_ecms_news WHERE newstime > UNIX_TIMESTAMP() - 86400 ORDER BY id DESC LIMIT 10",10,0,0}]
<li><a href="[!--titleurl--]"><img src="[!--titlepic--]" alt="[!--title--]"> [!--title--]</a></li>
[/e:loop]
关键陷阱:
[!--titleurl--]是帝国CMS自带的字段,需要列表模板里开启了“链接”属性,否则输出为空。 pic不存在,会报Undefined index错误,可用[!--onepic--]`(取第一张图)代替。UNIX_TIMESTAMP()是MySQL函数,如果数据表字段newstime是int类型,直接减86400即可。
列表模板和内容模板的变量调用,傻傻分不清?
很多二开者混淆[!--字段名--]和<?=$bqr[字段名]?>,区别在于:
- 列表模板(如
list5.htm)中,循环体内用[!--字段名--](如[!--title--]),循环体外用$bqr数组(如$bqr[title])。 模板**(如view5.htm)中,主内容变量用[!--字段名--],但自定义字段必须用<?=$navinfor['字段名']?>(注意是$navinfor,不是$bqr)。
示例模板中调用自定义字段“作者简介”(字段名writer_intro):
<p>作者简介:<?=$navinfor['writer_intro']?></p>
如果你直接写[!--writer_intro--],页面只会输出一个空字符串,因为该字段未经过系统内置解析。
万能标签 vs 智能标签,何时用谁?
-
智能标签(
[e:smart]):适用于简单查询,自动生成分页,但无法自定义排序规则,比如调5条最新文章:
[e:smart]news,5,10,0,0,0,0,0,0,0[/e:smart]
参数含义:数据表名,显示数量,标题截取字数,日期格式,栏目ID(0不限),推荐属性,排序(0=ID DESC,1=点击量),等。 -
万能标签(
[e:loop]):适合复杂SQL,支持多表联查、子查询、条件组合,比如调出“点击量>500且加了头条标志”的新闻:
[e:loop={"SELECT * FROM phome_ecms_news WHERE onclick > 500 AND isfirst=1 ORDER BY newstime DESC LIMIT 5",5,0,0}]
<a href="[!--titleurl--]">[!--title--]</a> (点击:[!--onclick--])
[/e:loop]
选型原则:数据量小、逻辑简单用智能;要联表、要聚合、要子查询必须上万能。
全站搜索搜不到自定义字段?那是因为没建索引!
默认搜索只匹配title、newstime等核心字段,你的“型号”(model_no)字段要参与搜索,必须两步走:
第一步:在后台“系统设置 → 搜索配置 → 搜索字段”里,把model_no加进“可搜索字段”,同时勾选“参与全文搜索”。
第二步:在phpMyAdmin中给该字段添加索引:
ALTER TABLE phome_ecms_news ADD INDEX (model_no);
血泪教训:如果字段是TEXT类型,需指定前缀长度,否则MySQL会拒绝加索引:
ALTER TABLE phome_ecms_news ADD INDEX (model_no(50));
附表字段调用技巧,避免“数据丢失”错觉
帝国CMS主表存常用字段,附表存大文本(如内容newstext),在列表页或首页调附表字段,常见错误是写[!--newstext--],结果啥也没有,正确姿势是:
方法一:在模型里把newstext设为“列表显示”字段,但这会加重主表负担。
方法二:用灵动标签内联查询:
[e:loop={"SELECT s.newstext, n.title, n.id FROM phome_ecms_news_index i LEFT JOIN phome_ecms_news n ON i.id=n.id LEFT JOIN phome_ecms_news_data s ON i.id=s.id WHERE n.id='$GLOBALS[navclassid]' LIMIT 1",1,0,0}]
<?php echo mb_substr(strip_tags($bqr['newstext']),0,100);?>
[/e:loop]
注意:phome_ecms_news_data是附表,phome_ecms_news_index是索引表(包含id和classid),直接join附表会慢,尽量用索引表驱动。
最后提醒:任何模型改变后,如果前台“鬼打墙”般不更新,除了清缓存,还要检查e/data/dbcache/下的model缓存文件,帝国CMS的缓存机制有时比你想的顽固——删除e/temp/和e/data/dbcache/下对应模型文件,再刷新,往往立竿见影。



发表评论