侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130560 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

帝国CMS专题列表自定义字段排序

2022-06-10 星期五 / 0 评论 / 0 点赞 / 101 阅读 / 3201 字

今天遇到一个客户有这么个需求,在主表中增加了个sort的字段,然后在专题列表里按这个字段的大小降序排列。刚开始以为很简单,直接在编辑专题的时候,在列表增加sort desc,newstime desc即可。

今天遇到一个客户有这么个需求,在主表中增加了个sort的字段,然后在专题列表里按这个字段的大小降序排列。刚开始以为很简单,直接在编辑专题的时候,在列表增加sort desc,newstime desc即可。截图如下:

结果报错:专题数据表没有sort字段

怎么办呢?

想要专题列表支持其他表的字段进行信息排序,那么就必须要将两个表关联起来,所以就想到了使用left join语句。根据自已对帝国的了解,知道生成专题列表页的代码是在/e/class/functions.php文件,然后打开这个文件,定位到3094行代码。其中$addorder就是专题列表的排序方式代码。

此时我们要考虑一个问题,那就是不是所有专题都需要使用主表的字段去排序的,怎么去兼容呢?

我们可以这么去定义,把专题数据表enewsztinfo定义为a表,主表ecms_news定义为b表,两者关联,得到如下代码:

$query="select a.ztid,a.cid,a.classid,a.id,a.isgood from {$dbtbpre}enewsztinfo a left join {$dbtbpre}ecms_news b on a.id=b.id where ".$yhadd."ztid='$classid' order by ".$addorder.$limit;

后台设置如下:

然后在代码里通过判断$addorder是否包含a.字符,如果存在,就走关联查询语句,如果不存在,就按官方代码走,这样就得到如下代码:

if(strstr($addorder,'a.')) {     $query="select a.ztid,a.cid,a.classid,a.id,a.isgood from {$dbtbpre}enewsztinfo a left join {$dbtbpre}ecms_news b on a.id=b.id where ".$yhadd."ztid='$classid' order by ".$addorder.$limit;}else{     $query="select ztid,cid,classid,id,isgood from {$dbtbpre}enewsztinfo where ".$yhadd."ztid='$classid' order by ".$addorder.$limit;}

截图如下:

如此这般操作便解决了用户的需求。

最后,这样做的话会存在两个问题:
1、如果某个专题的信息集合不是新闻数据表(ecms_news)的话,那么这个查询语句就不行了,可能需要另外的扩展或者把ecms_news表改一下。
2、如果某个专题的信息集合又有新闻表又有其他数据表,那么排序结果就不那么准确了。

所以使用这个方法只能针对比较固定的数据表去操作才没问题。

广告 广告

评论区