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

discuz x3 与通知表有关的程序源代码分析

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

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

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

x
discuz x3 与通知表有关的程序源代码分析,推荐阅读discuz核心类库class_core的函数注释

  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: helper_notification.php 34003 2013-09-18 04:31:14Z nemohou $
  7. */

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

  11. class helper_notification {


  12.         //添加通知
  13.         public static function notification_add($touid, $type, $note, $notevars = array(), $system = 0, $category = -1) {
  14.                 global $_G;

  15.                 if(!($tospace = getuserbyuid($touid))) {
  16.                         return false;
  17.                 }
  18.                 space_merge($tospace, 'field_home');
  19.                 $filter = empty($tospace['privacy']['filter_note'])?array():array_keys($tospace['privacy']['filter_note']);

  20.                 if($filter && (in_array($type.'|0', $filter) || in_array($type.'|'.$_G['uid'], $filter))) {
  21.                         return false;
  22.                 }
  23.                 if($category == -1) {//默认值
  24.                         $category = 0;//重新设置为0
  25.                         $categoryname = '';//分类名
  26.                         if($type == 'follow' || $type == 'follower') {
  27.                                 switch ($type) {
  28.                                                         case 'follow' : $category = 5; break;//收听
  29.                                                         case 'follower' : $category = 6; break;//听众
  30.                                                 }
  31.                                 $categoryname = $type;//分类名
  32.                         } else {
  33.                                 foreach($_G['notice_structure'] as $key => $val) {
  34.                                         if(in_array($type, $val)) {
  35.                                                 switch ($key) {
  36.                                                         case 'mypost' : $category = 1; break;//我的帖子
  37.                                                         case 'interactive' : $category = 2; break;//坛友互动
  38.                                                         case 'system' : $category = 3; break;//系统提醒
  39.                                                         case 'manage' : $category = 4; break;//管理工作
  40.                                                         default :  $category = 0;//应用消息
  41.                                                 }
  42.                                                 $categoryname = $key;//分类名
  43.                                                 break;
  44.                                         }
  45.                                 }
  46.                         }
  47.                 } else {//$category值不为-1的情况
  48.                         switch ($category) {
  49.                                 case 1 : $categoryname = 'mypost'; break;//我的帖子
  50.                                 case 2 : $categoryname = 'interactive'; break;//坛友互动
  51.                                 case 3 : $categoryname = 'system'; break;//系统提醒
  52.                                 case 4 : $categoryname = 'manage'; break;//管理工作
  53.                                 case 5 : $categoryname = 'follow'; break;//收听
  54.                                 case 6 : $categoryname = 'follower'; break;//听众
  55.                                 default :  $categoryname = 'app';//应用消息
  56.                         }
  57.                 }
  58.                 if($category == 0) {//应用消息
  59.                         $categoryname = 'app';
  60.                 } elseif($category == 1 || $category == 2) {//我的帖子、坛友互动
  61.                         $categoryname = $type;
  62.                 }
  63.                 /*
  64.                  * zhuoweida 回复了您的帖子 多城公积金贷款额度吃紧背后:非法套现频发   查看
  65.                  * 通知内容中用户名部分
  66.                  * 默认执行
  67.                  */
  68.                 //默认执行
  69.                 $notevars['actor'] = "<a href=\"home.php?mod=space&uid=$_G[uid]\">".$_G['member']['username']."</a>";
  70.                
  71.                 if(!is_numeric($type)) {
  72.                     
  73.                         $vars = explode(':', $note);
  74.                         if(count($vars) == 2) {
  75.                                 $notestring = lang('plugin/'.$vars[0], $vars[1], $notevars);//通知内容
  76.                         } else {
  77.                                 $notestring = lang('notification', $note, $notevars);//通知内容
  78.                         }
  79.                         $frommyapp = false;
  80.                 } else {
  81.                         $frommyapp = true;
  82.                         $notestring = $note;//通知内容
  83.                 }

  84.                 $oldnote = array();//定义一个旧的通知内容数组
  85.                 //from_id:来源对象id ,from_idtype:来源对象类型
  86.                 if($notevars['from_id'] && $notevars['from_idtype']) {
  87.                         //通过from_id、from_idtype、touid作为条件来获取最新一条通知内容
  88.                         $oldnote = C::t('home_notification')->fetch_by_fromid_uid($notevars['from_id'], $notevars['from_idtype'], $touid);
  89.                 }
  90.                 //from_num:来源量
  91.                 if(empty($oldnote['from_num'])) $oldnote['from_num'] = 0;//来源量设置为0
  92.                 $notevars['from_num'] = $notevars['from_num'] ? $notevars['from_num'] : 1;
  93.                 //通知数组
  94.                 $setarr = array(
  95.                         'uid' => $touid,                //通知用户ID
  96.                         'type' => $type,                //通知类型:"doing"记录,"friend"好友请求,"sharenotice"好友分享,"post"话题回复
  97.                         'new' => 1,                     //通知是否为新:"1"为新通知,"0"为通知已读
  98.                         'authorid' => $_G['uid'],       //作者用户ID
  99.                         'author' => $_G['username'],    //用户名
  100.                         'note' => $notestring,          //通知内容
  101.                         'dateline' => $_G['timestamp'], //通知产生的时间戳
  102.                         'from_id' => $notevars['from_id'],//来源对象id
  103.                         'from_idtype' => $notevars['from_idtype'],//来源对象类型
  104.                         'from_num' => ($oldnote['from_num']+$notevars['from_num']),//来源量
  105.                         'category' => $category         //提醒分类 1我的帖子 2坛友互动 3系统消息 4管理工作 0应用消息
  106.                 );
  107.                 //系统提醒的情况
  108.                 if($system) {
  109.                         $setarr['authorid'] = 0;        //作者用户ID设置为0
  110.                         $setarr['author'] = '';         //用户名设置为空
  111.                 }
  112.                 $pkId = 0;
  113.                 if($oldnote['id']) {//旧通知内容的id
  114.                         C::t('home_notification')->update($oldnote['id'], $setarr);//更新为最新的通知内容
  115.                         $pkId = $oldnote['id'];//主键id值
  116.                 } else {
  117.                         $oldnote['new'] = 0;
  118.                         $pkId = C::t('home_notification')->insert($setarr, true);//插入操作
  119.                 }
  120.                 $banType = array('task');
  121.                 //云状态的情况
  122.                 if($_G['setting']['cloud_status'] && !in_array($type, $banType)) {
  123.                         $noticeService = Cloud::loadClass('Service_Client_Notification');
  124.                         if($oldnote['id']) {
  125.                                 $noticeService->update($touid, $pkId, $setarr['from_num'], $setarr['dateline'], $note);
  126.                         } else {
  127.                                 $extra = $type == 'post' ? array('pId' => $notevars['pid']) : array();
  128.                                 $extra['notekey'] = $note;
  129.                                 $noticeService->add($touid, $pkId, $type, $setarr['authorid'], $setarr['author'], $setarr['from_id'], $setarr['from_idtype'], $setarr['note'], $setarr['from_num'], $setarr['dateline'], $extra);
  130.                         }
  131.                 }

  132.                 //新通知
  133.                 if(empty($oldnote['new'])) {
  134.                         C::t('common_member')->increase($touid, array('newprompt' => 1));//更新数据
  135.                         $newprompt = C::t('common_member_newprompt')->fetch($touid);//获取新通知
  136.                         if($newprompt) {
  137.                                 $newprompt['data'] = unserialize($newprompt['data']);//反序列化数据
  138.                                 if(!empty($newprompt['data'][$categoryname])) {
  139.                                         $newprompt['data'][$categoryname] = intval($newprompt['data'][$categoryname]) + 1;
  140.                                 } else {
  141.                                         $newprompt['data'][$categoryname] = 1;
  142.                                 }
  143.                                 C::t('common_member_newprompt')->update($touid, array('data' => serialize($newprompt['data'])));
  144.                         } else {
  145.                                 C::t('common_member_newprompt')->insert($touid, array($categoryname => 1));
  146.                         }
  147.                         //邮件函数类库
  148.                         require_once libfile('function/mail');
  149.                         //邮件标题
  150.                         $mail_subject = lang('notification', 'mail_to_user');
  151.                         //发邮件通知
  152.                         sendmail_touser($touid, $mail_subject, $notestring, $frommyapp ? 'myapp' : $type);
  153.                 }

  154.                 if(!$system && $_G['uid'] && $touid != $_G['uid']) {
  155.                         C::t('home_friend')->update_num_by_uid_fuid(1, $_G['uid'], $touid);
  156.                 }
  157.         }

  158.         public static function manage_addnotify($type, $from_num = 0, $langvar = array()) {
  159.                 global $_G;
  160.                 $notifyusers = dunserialize($_G['setting']['notifyusers']);
  161.                 $notifytypes = explode(',', $_G['setting']['adminnotifytypes']);
  162.                 $notifytypes = array_flip($notifytypes);
  163.                 $notearr = array('from_id' => 1,'from_idtype' => $type, 'from_num' => $from_num);
  164.                 if($langvar) {
  165.                         $langkey = $langvar['langkey'];
  166.                         $notearr = array_merge($notearr, $langvar);
  167.                 } else {
  168.                         $langkey = 'manage_'.$type;
  169.                 }
  170.                 foreach($notifyusers as $uid => $user) {
  171.                         if($user['types'][$notifytypes[$type]]) {
  172.                                 helper_notification::notification_add($uid, $type, $langkey, $notearr, 1, 4);
  173.                         }
  174.                 }
  175.         }

  176.         public function get_categorynum($newprompt_data) {
  177.                 global $_G;
  178.                 $categorynum = array();
  179.                 if(empty($newprompt_data) || !is_array($newprompt_data)) {
  180.                         return array();
  181.                 }
  182.                 foreach($newprompt_data as $key => $val) {
  183.                         if(in_array($key, array('follow', 'follower'))) {
  184.                                 continue;
  185.                         }
  186.                         if(in_array($key, $_G['notice_structure']['mypost'])) {//我的帖子的情况
  187.                                 $categorynum['mypost'] += $val;
  188.                         } elseif(in_array($key, $_G['notice_structure']['interactive'])) {//坛友互动的情况
  189.                                 $categorynum['interactive'] += $val;
  190.                         }else{
  191.                                 $categorynum[$key] = $val;//其它情况
  192.                         }
  193.                 }
  194.                 return $categorynum;
  195.         }

  196.         //更新新提醒数目
  197.         public function update_newprompt($uid, $type) {
  198.                 global $_G;
  199.                 if($_G['member']['newprompt_num']) {//我的帖子或坛友互动新提醒总数量
  200.                         $tmpprompt = $_G['member']['newprompt_num'];//临时新提醒总数量
  201.                         $num = 0;//累计器
  202.                         $updateprompt = 0;//更新提醒数的标识,默认值为0
  203.                         //$tmpprompt[$type]等价于$_G['member']['newprompt_num'][$type]
  204.                         if(!empty($tmpprompt[$type])) {//当前分类下(我的帖子或坛友互动)当前类型下(如:at\post\pcomment等)的提醒数量不为空的情况
  205.                                 unset($tmpprompt[$type]);//释放将当前分类下当前类型下提醒数量
  206.                                 $updateprompt = true;//将标识更新为true
  207.                         }
  208.                         //通过循环重新统计新提醒消息总数,将当前分类下当前类型下的新提醒数量清空后再重新统计一遍非当前类型下的新提醒消息总量
  209.                         //$tmpprompt:各种类型的新提醒数量
  210.                         foreach($tmpprompt as $key => $val) {
  211.                                 $num += $val;//新提醒消息数量累加
  212.                         }
  213.                         //如果重新统计的新提醒数目不为空
  214.                         if($num) {
  215.                                 if($updateprompt) {//允许更新的标识
  216.                                         //用户新提醒数量表
  217.                                         C::t('common_member_newprompt')->update($uid, array('data' => serialize($tmpprompt)));
  218.                                         //更新用户主表中的新提醒数目
  219.                                         C::t('common_member')->update($uid, array('newprompt'=>$num));
  220.                                 }
  221.                         } else {//如果重新统计的新提醒数目为空
  222.                                 //删除用户新提醒数目表中关于当前登录用户的有关信息
  223.                                 C::t('common_member_newprompt')->delete($_G['uid']);
  224.                                 //更新用户主表中的新提醒数目为0
  225.                                 C::t('common_member')->update($_G['uid'], array('newprompt'=>0));
  226.                         }
  227.                 }
  228.         }
  229. }

  230. ?>
复制代码


更多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的forum_index.php文件的分析
下一篇:discuz x3 space_notice.php分析注释
UC955 发表于 2015-7-1 17:35:28 来自PC
我只是路过站帮网打酱油的,顺便支持下
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

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