首页
站长论坛BBS
救助
投稿
discuz视频教程
discuz技术支持
版块
登录
快速注册

discuz x3 space_notice.php分析注释

ARCHY 2015-6-13 [Discuz开发] 来自PC 复制链接
19445
discuz使用视频教程
31idc

马上注册,一起探讨正确快速的建站方法

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
discuz x3 space_notice.php分析注释,具体看如下代码
  1. <?php

  2. /**
  3. *      [Discuz!] (C)2001-2099 Comsenz Inc.
  4. *      This is NOT a freeware, use is subject to license terms
  5. *
  6. *      $Id: space_notice.php 34047 2013-09-25 04:41:45Z nemohou $
  7. */

  8. if(!defined('IN_DISCUZ')) {
  9.         exit('Access Denied');
  10. }

  11. $perpage = 30;
  12. $perpage = mob_perpage($perpage);

  13. $page = empty($_GET['page'])?0:intval($_GET['page']);//页码
  14. if($page<1) $page = 1;
  15. $start = ($page-1)*$perpage;//开始记录

  16. ckstart($start, $perpage);//分页判断

  17. $list = array();//定义了一个list数组
  18. $mynotice = $count = 0;//应用提醒变量
  19. $multi = '';//分页变量

  20. if(empty($_G['member']['category_num']['manage']) && !in_array($_G['adminid'], array(1,2,3))) {
  21.         unset($_G['notice_structure']['manage']);
  22. }
  23. /*
  24. * $_GET[view]的值有以下几种
  25. * $_G['notice_structure']:
  26. *      mypost-我的帖子
  27. *      interactive-坛友互动
  28. *      system-系统提醒
  29. *      app-应用提醒
  30. */
  31. $view = (!empty($_GET['view']) && (isset($_G['notice_structure'][$_GET[view]]) || in_array($_GET['view'], array('userapp'))))?$_GET['view']:'mypost';
  32. $actives = array($view=>' class="a"');
  33. $opactives[$view] = 'class="a"';//当前选中项添加class="a"样式
  34. $categorynum = $newprompt = array();//定义一个分类变量和新提醒数变量
  35. if($view == 'userapp') {//@提到我 页面中默认不执行
  36.    
  37.         space_merge($space, 'status');

  38.         if($_GET['op'] == 'del') {
  39.                 $appid = intval($_GET['appid']);
  40.                 C::t('common_myinvite')->delete_by_appid_touid($appid, $_G['uid']);
  41.                 showmessage('do_success', "home.php?mod=space&do=notice&view=userapp&quickforward=1");
  42.         }

  43.         $filtrate = 0;
  44.         $count = 0;
  45.         $apparr = array();
  46.         $type = intval($_GET['type']);
  47.         foreach(C::t('common_myinvite')->fetch_all_by_touid($_G['uid']) as $value) {
  48.                 $count++;
  49.                 $key = md5($value['typename'].$value['type']);
  50.                 $apparr[$key][] = $value;
  51.                 if($filtrate) {
  52.                         $filtrate--;
  53.                 } else {
  54.                         if($count < $perpage) {
  55.                                 if($type && $value['appid'] == $type) {
  56.                                         $list[$key][] = $value;
  57.                                 } elseif(!$type) {
  58.                                         $list[$key][] = $value;
  59.                                 }
  60.                         }
  61.                 }
  62.         }
  63.         $mynotice = $count;

  64. } else {//@提到我 页面中默认执行

  65.         if(!empty($_GET['ignore'])) {//忽略
  66.                 //通知表
  67.                 C::t('home_notification')->ignore($_G['uid']);
  68.         }

  69.         foreach (array('wall', 'piccomment', 'blogcomment', 'clickblog', 'clickpic', 'sharecomment', 'doing', 'friend', 'credit', 'bbs', 'system', 'thread', 'task', 'group') as $key) {
  70.                 //key的值:'wall', 'piccomment', 'blogcomment', 'clickblog', 'clickpic', 'sharecomment', 'doing', 'friend', 'credit', 'bbs', 'system', 'thread', 'task', 'group'
  71.                 $noticetypes[$key] = lang('notification', "type_$key");//提醒类型
  72.         }

  73.         $isread = in_array($_GET['isread'], array(0, 1)) ? intval($_GET['isread']) : 0;//是否已读
  74.         $category = $type = '';//定义$category、$type变量
  75.         /*
  76.          * 1、$view值:mypost-我的帖子  interactive-坛友互动
  77.          *    第一:$view值为mypost的情况
  78.          *    Array (
  79.          *          [0] => post //帖子
  80.          *          [1] => pcomment //点评
  81.          *          [2] => activity //活动
  82.          *          [3] => reward //悬赏
  83.          *          [4] => goods //商品
  84.          *          [5] => at //@提到我的
  85.          *    )
  86.          */
  87.         if(isset($_G['notice_structure'][$view])) {
  88.                 if(!in_array($view, array('mypost', 'interactive'))) {//非我的帖子、坛友互动的情况
  89.                         $category = $view;
  90.                 } else {//我的帖子和坛友互动的情况
  91.                         $deftype = $_G['notice_structure'][$view][0];//post
  92.                         if($_G['member']['newprompt_num']) {//我的帖子或坛友互动新提醒总数量
  93.                                 //各个新提醒数量,如:帖子新提醒数量、点评新提醒数量、活动新提醒数量、悬赏新提醒数量、商品新提醒数量、提到我的新提醒数量
  94.                                 foreach($_G['notice_structure'][$view] as $subtype) {
  95.                                         if($_G['member']['newprompt_num'][$subtype]) {
  96.                                                 $deftype = $subtype;
  97.                                                 break;
  98.                                         }
  99.                                 }
  100.                         }
  101.                         //当前选项类型,默认值为post:可能值为 post-帖子、pcomment-点评、activity-活动、reward-悬赏、goods-商品、at-提到我的 等等
  102.                         $type = in_array($_GET['type'], $_G['notice_structure'][$view]) ? trim($_GET['type']) : $deftype;
  103.                 }
  104.         }
  105.         $wherearr = array();//定义一个where条件数组,用于sql查询
  106.         $new = -1;//如果$new等于-1的话,在sql语句中会将new字段的值重新设置为空
  107.         if(!empty($type)) {
  108.                 $wherearr[] = "`type`='$type'";//如果当前选项类型不为空,则加入到条件数组中
  109.         }

  110.         $sql = ' AND '.implode(' AND ', $wherearr);//拼接的sql语句


  111.         $newnotify = false;//新通知标识,false-非新通知 true-新通知
  112.         /*
  113.          * 通知表
  114.          * $type:通知类型:"doing"记录,"friend"好友请求,"sharenotice"好友分享,"post"话题回复,"at"提到我的 等等
  115.          * $category不为空的情况:提醒分类 1-我的帖子 2-坛友互动 3-系统消息 4-管理工作 0-应用消息
  116.          * $new:通知是否为新:"1"为新通知,"0"为通知已读
  117.          * $uid:通知用户的id
  118.          * note字段:通知内容,这个是我们关心的
  119.          *
  120.          * $count:帖子数量、点评数量、活动数量、悬赏数量、商品数量、提到我的数量,如,提到我的-数量7,代表总共有7个提到我的信息(包括已读和未读的信息)
  121.          */
  122.         $count = C::t('home_notification')->count_by_uid($_G['uid'], $new, $type, $category);//当前登录用户当前分类下当前选中项信息总数量条数
  123.         
  124.         if($count) {//如果当前选中项信息总数量不为空
  125.                 if($new == 1 && $perpage == 30) {
  126.                         $perpage = 200;
  127.                 }
  128.                 /*
  129.                  * 当前登录用户当前选中类型所有信息组成的数组,如:帖子类型中所有帖子的回复内容
  130.                  * $category不为空的情况:提醒分类 1-我的帖子 2-坛友互动 3-系统消息 4-管理工作 0-应用消息 5-收听 6-听众
  131.                  * $new:如果$new的值等于-1的话,那么会将$new的值重新设置为空
  132.                  */
  133.                 foreach(C::t('home_notification')->fetch_all_by_uid($_G['uid'], $new, $type, $start, $perpage, $category) as $value) {
  134.                         if($value['new']) {//通知是否为新:"1"为新通知,"0"为通知已读
  135.                                 $newnotify = true;//新通知
  136.                                 $value['style'] = 'color:#000;font-weight:bold;';//新通知的样式
  137.                         } else {
  138.                                 $value['style'] = '';//非新通知的样式
  139.                         }
  140.                        
  141.                         $value['rowid'] = '';
  142.                         
  143.                         //打招呼、好友的情况下才执行
  144.                         if(in_array($value['type'], array('friend', 'poke'))) {//坛友互动:打招呼-id="pokeQuery_1" 、好友-id="pendingFriend_1" id="pendingFriend_3"
  145.                                 $value['rowid'] = ' id="'.($value['type'] == 'friend' ? 'pendingFriend_' : 'pokeQuery_').$value['authorid'].'" ';
  146.                         }
  147.                         //来源量
  148.                         if($value['from_num'] > 0) $value['from_num'] = $value['from_num'] - 1;
  149.                         $list[$value['id']] = $value;//$list数组的值
  150.                 }

  151.                 $multi = '';
  152.                 $multi = multi($count, $perpage, $page, "home.php?mod=space&do=$do&isread=1");
  153.         }

  154.         if($newnotify) {//新通知不为空的情况
  155.                 /*
  156.                  * 作用:将新通知更新为已读,将来源量更新为0
  157.                  * 第四个参数为$new参数,默认值为true,在$new为true的情况下会自动将其重置为0,0-通知更新为已读
  158.                  * 第五个参数为$from_num参数,默认值为true,在$from_num为true的情况下会自动将其重置为0,0-来源量更新为0
  159.                  * $category不为空的情况:提醒分类 1-我的帖子 2-坛友互动 3-系统消息 4-管理工作 0-应用消息
  160.                  */
  161.                 C::t('home_notification')->ignore($_G['uid'], $type, $category, true, true);//忽略意义:将新通知更新为已读,将来源量更新为0
  162.                 //云状态的情况
  163.                 if($_G['setting']['cloud_status']) {
  164.                         $noticeService = Cloud::loadClass('Service_Client_Notification');
  165.                         $noticeService->setNoticeFlag($_G['uid'], TIMESTAMP);
  166.                 }
  167.         }
  168.         
  169.         //更新common_member_newprompt及common_member表中的新提醒数目
  170.         helper_notification::update_newprompt($_G['uid'], ($type ? $type : $category));
  171.         
  172.         //我的app应用状态,默认不执行
  173.         if($_G['setting']['my_app_status']) {
  174.                 //用户邀请表
  175.                 $mynotice = C::t('common_myinvite')->count_by_touid($_G['uid']);
  176.         }
  177.         
  178.         //新提醒数目
  179.         if($_G['member']['newprompt']) {
  180.                 $recountprompt = 0;//重新统计新提醒数目标识
  181.                 /*
  182.                  * 分类下新提醒数目,即:左侧显示的新提醒数目
  183.                  * 如:通知左侧
  184.                  *      消息
  185.                  *      我的帖子(11)
  186.                  *      坛友互动(9)
  187.                  *      系统消息(1)
  188.                  *      应用提醒
  189.                  */
  190.                 foreach($_G['member']['category_num'] as $promptnum) {//分类下新提醒总数目
  191.                         $recountprompt += $promptnum;//新提醒数目累加:1+9+11
  192.                 }
  193.                 $recountprompt += $mynotice;//将应用提醒也累加进来
  194.                 if($recountprompt == 0) {//如果新提醒为0
  195.                         //更新用户主表中当前登录用户的新提醒数目为0
  196.                         C::t('common_member')->update($_G['uid'], array('newprompt' => 0));
  197.                 }
  198.         }

  199.         $readtag = array($type => ' class="a"');//给当前选中标签项添加样式:<li class="a">提到我的</li>


  200. }
  201. //将$newprompt新提醒数保存到cookie中
  202. dsetcookie('promptstate_'.$_G['uid'], $newprompt, 31536000);
  203. include_once template("diy:home/space_notice");

  204. ?>
复制代码


更多Discuz二次开发相关源码分析
1、discuz核心类库class_core的函数注释
http://bbs.zb7.com/thread-514094-1-1.html
2、Discuz的forum_index.php文件的分析
http://bbs.zb7.com/thread-517467-1-1.html
3、discuz x3 与通知表有关的程序源代码分析
http://bbs.zb7.com/thread-517471-1-1.html
4、discuz x3 space_notice.php分析注释
http://bbs.zb7.com/thread-517472-1-1.html
5、discuz x3 uc_client/client.php接口文件分析
http://bbs.zb7.com/thread-517473-1-1.html
6、Discuz中session机制流程图
http://bbs.zb7.com/thread-517443-1-1.html






上一篇:discuz x3 与通知表有关的程序源代码分析
下一篇:discuz x3 uc_client/client.php接口文件分析
UC955 发表于 2015-7-1 17:35:03 来自PC
感谢楼主无私的分享与奉献
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

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