Discuz!官方免费开源建站系统

 找回密码
 立即注册
搜索

关于Discuz! X 2.5 门户diy模块聚合不到文章数据的非官方解决方案

[复制链接]
shily001 发表于 2012-5-14 15:45:40 | 显示全部楼层 |阅读模式
本帖最后由 shily001 于 2012-5-14 16:10 编辑

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











回复

使用道具 举报

 楼主| shily001 发表于 2012-5-14 16:01:34 | 显示全部楼层
第一次在dz发帖,自己顶
回复

使用道具 举报

m.king 发表于 2012-5-14 17:29:02 | 显示全部楼层
DIY模块不显示数据,模块聚合不到数据,DIY丢失解决方案
https://discuz.dismall.com/thread-2799570-1-1.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2025-8-25 16:23 , Processed in 0.107552 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表