今天遇到一个客户有这么个需求,在主表中增加了个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、如果某个专题的信息集合又有新闻表又有其他数据表,那么排序结果就不那么准确了。
所以使用这个方法只能针对比较固定的数据表去操作才没问题。