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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

x2解析回帖可见处理过程

[复制链接]
evenzhou 发表于 2011-7-31 23:09:33 | 显示全部楼层 |阅读模式
回帖可见是针对用户发帖的时候使用了hide标签的功能,用户需要用使用hide标签的权限
hide标签可以直接使用hide标签,将要隐藏的内容包括在其中
也可以添加隐藏条件:[hide=数字]满足积分条件[/hide],当用户满足这个条件就会自动显示内容

回帖内容也是可以添加隐藏标签的,只要用户用使用hide标签权限,当用户回复了该主题的时候也会将内容显示出来      
                                      
回帖可见对游客也是有效的,当一个用户在发帖的时候使用了hide标签,发布主题的时候会调用discuzcode函数对discuz代码进行解析,其中解析hide标签部分:
  1. if($parsetype != 1 && strpos($msglower, '[/hide]') !== FALSE && $pid) {
  2.                         if(strpos($msglower, '[hide]') !== FALSE) {
  3.                                 if($authorreplyexist === null) {
  4.                                         $posttable = getposttablebytid($_G['tid']);
  5.                                         $authorreplyexist = !$_G['forum']['ismoderator'] ? DB::result_first("SELECT pid FROM ".DB::table($posttable)." WHERE tid='$_G[tid]' AND ".($_G['uid'] ? "authorid='$_G[uid]'" : "authorid=0 AND useip='$_G[clientip]'")." LIMIT 1") : TRUE;
  6.                                 }
  7.                                 if($authorreplyexist) {
  8.                                         $message = preg_replace("/\[hide\]\s*(.*?)\s*\[\/hide\]/is", tpl_hide_reply(), $message);
  9.                                 } else {
  10.                                         $message = preg_replace("/\[hide\](.*?)\[\/hide\]/is", tpl_hide_reply_hidden(), $message);
  11.                                         $message .= '<script type="text/javascript">replyreload += \',\' + '.$pid.';</script>';
  12.                                 }
  13.                         }
  14.                         if(strpos($msglower, '[hide=') !== FALSE) {
  15.                                 $message = preg_replace("/\[hide=(\d+)\]\s*(.*?)\s*\[\/hide\]/ies", "creditshide(\\1,'\\2', $pid)", $message);
  16.                         }
  17.                 }
  18.         }
复制代码
由于post表中,主题也是会被存在其中$authorreplyexist = !$_G['forum']['ismoderator'] ? DB::result_first("SELECT pid FROM ".DB::table($posttable)." WHERE tid='$_G[tid]' AND ".($_G['uid'] ? "authorid='$_G[uid]'" : "authorid=0 AND useip='$_G[clientip]'")." LIMIT 1") : TRUE;

这段代码能够查询出是被回复了(包括游客回复)或者是版主,则用$message = preg_replace("/\[hide\]\s*(.*?)\s*\[\/hide\]/is", tpl_hide_reply(), $message)将hide标签部分的代码替换掉,如果没有回复则用 tpl_hide_reply_hidden()处理掉hide标签部分的内容,这里的函数来自于:discuzcode.htm,其中的函数原理在这里不做介绍

gongrs 发表于 2011-10-9 08:06:59 | 显示全部楼层
{:soso_e179:}   谢谢提供,学习了。已经在网站  http://www.gongrs.cn    试过。
回复

使用道具 举报

Gnagno 发表于 2011-10-14 22:51:05 | 显示全部楼层
这个好,支持
回复

使用道具 举报

facphone 发表于 2011-10-16 20:56:01 | 显示全部楼层
我的站怎么不能设置回复可见? www.zd118.com/bbs
回复

使用道具 举报

 楼主| evenzhou 发表于 2011-10-17 09:50:10 | 显示全部楼层
facphone 发表于 2011-10-16 20:56
我的站怎么不能设置回复可见? www.zd118.com/bbs

管理员也不行吗?检查后台 用户组 --允许使用 [hide] 代码
回复

使用道具 举报

oyoy8629 发表于 2011-12-27 01:15:54 | 显示全部楼层
这个功能有BUG,
如果是特殊主题这里会出问题
因为你拼接是拼接在最后面。
会导致$specialextra = substr($postlist[$_G['forum_firstpid']]['message'], $sppos + 3);
得到的内容为后面是    “内容插件名<script....”
这样就匹配错了。
正确方法应该是
  1. $message = preg_replace("/\[hide\](.*?)\[\/hide\]/is", tpl_hide_reply_hidden().'<script type="text/javascript">replyreload += \',\' + '.$pid.';</script>', $message);
  2.                                
复制代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 18:25 , Processed in 0.178401 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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