本帖最后由 shily001 于 2012-5-14 16:10 编辑
症状如下:用文章模块聚合数据的时候,只有选择全部分类才能聚合到数据,选择具体的分类时候发现聚合不到数据。比如在我的网站塞班人有个频道塞班旅游http://www.saipanr.com/tour/ 作为一个diy模块聚合到首页,结果发现选择“塞班旅游”这个栏目的时候根本聚合不到数据,但是如果选择“所有分类”或者不选择分类则可以聚合到数据。
我尝试在网站找其他解决方案,还是没有解决问题。我一气之下决定自己调试源码,经过两个小时的奋战,终于找到了bug。下面先指出bug所在,然后给出解决方案。
打开源码文件:source\class\block\portal\block_article.php
为什么选择“所有分类”或者不选择分类的的时候能聚合到数据?- if(!empty($parameter['catid'])) {
- if($parameter['catid'][0] == '0') {
- unset($parameter['catid'][0]);
- }
- $catid = $parameter['catid'];
- }
复制代码 上面的代码是如果选择的分类id(catid)等于0,也就是选择所有分类的时候清空分类id。- if($catid) {
- include_once libfile('function/portalcp');
- $childids = array();
- foreach($catid as $id) {
- if($_G['cache']['portalcategory'][$id]['disallowpublish']) {
- $childids = array_merge($childids, category_get_childids('portal', $id));
- }
- }
- $catid = array_merge($catid, $childids);
- $catid = array_unique($catid);
- $wheres[] = 'at.catid IN ('.dimplode($catid).')';
- }
复制代码 上面的代码是执行条件是分类id(catid)不为空。也就是当我们不选择分类或者选择“所有分类”时,上面的代码大括号内的逻辑是不会触发的。
但是为什么当我们选择具体的分类,比如“塞班旅游”的时候聚合不到数据了呢?懂代码的朋友都知道当我们选择了具体的分类也就是当catid不等于0的时候,上面的大括号内代码会执行,用来聚合我们选择的分类。上面代码大意是遍历我们选中的分类,如果分类允许显示,则读取该分类下面的所有子分类,并将所有获取到分类id合并到一块形成查询文章的条件。按理来说这个逻辑没有错,那么为什么聚合不到数据呢?原来开发人员一时疏忽,留下了一个bug。如下- if($_G['cache']['portalcategory'][$id]['disallowpublish']) {
- $childids = array_merge($childids, category_get_childids('portal', $id));
- }
复制代码 这个代码的意思“如果分类不允许显示则读取子分类”,这与程序要执行表达的逻辑恰恰相反啦,应该是“如果分类允许显示则读取子分类”所以这个一个bug。解决方案很简单:- if(!$_G['cache']['portalcategory'][$id]['disallowpublish']) {
- $childids = array_merge($childids, category_get_childids('portal', $id));
- }
复制代码 就多了一个“!”。意思是disallowpublish(不允许显示)取反,也就是允许显示的意思。
另外,为了方便不懂代码的站长朋友,我在我的网站塞班人旅游社区论坛的灌水区上面发布这个一个非官方的补丁(http://bbs.saipanr.com/thread-38-1-1.html),有需要的朋友可以去下载。
|