在前文(
链接)中我们讨论里如何从用户的IP中得知用户所在的国家,进而将某些模块挡在国门之外。捍卫人间的最后一片净土不受污染,不能仅靠党国的防火墙,海外华人网站管理者也人人有责。 本文延续那里的讨论,重点讨论下如何添加一个日志设置,让管理员决定是否将某篇日志向中国大陆用户开放。

1)首先要修改数据库,在储存日志的数表 home_blog 和储藏动态的数表 home_feed 里添加一个名叫 nomainlandchina 的表列:
alter table home_blog add nomainlandchina tinyint(1) not null default 0
alter table home_feed add nomainlandchina tinyint(1) not null default 0
上面假定数表名无前缀,不然要加上前缀。
2)在语言包文件 source/language/home/lang_template.php 里加上下面的字符串:
'no_access_from_mainland_china' => '仅中国大陆以外用户可见',
3)在日志编辑状态下,对管理员显示"仅中国大陆以外用户可见"选项。修改文件 source/include/spacecp/spacecp_blog.php,将下面两句
改成
并在下面这句
后添加
4)将管理员的选择存入数据库。将文件 source/function/function_blog.php 里的函数 blog_post 中的下面这句
$blogarr = array(
'subject' => $POST['subject'],
'classid' => $classid,
'friend' => $POST['friend'],
'password' => $POST['password'],
'noreply' => empty($POST['noreply'])?0:1,
'catid' => intval($POST['catid']),
'status' => $blog_status,
);
改成
$blogarr = array(
'subject' => $POST['subject'],
'classid' => $classid,
'friend' => $POST['friend'],
'password' => $POST['password'],
'noreply' => empty($POST['noreply'])?0:1,
'nomainlandchina' => empty($POST['nomainlandchina'])?0:1,
'catid' => intval($POST['catid']),
'status' => $blog_status,
);
再在文件 source/function/function_feed.php 里的函数 feed_publish 中的下面这句
$setarr['id'] = $value['blogid'];
后添加
$setarr['nomainlandchina'] = $value['nomainlandchina'];
5)如前文所述,添加代码来判断用户是否来自国内。在文件 source/class/discuz/discuz_application.php 里的函数 _init_user 定义的结尾部分加上:
$clientip = getglobal('clientip');
require_once libfile('function/misc');
$location = convertip($clientip);
$location = substr($location, 2);
$provs = array('中国', '北京', '天津', '重庆', '上海', '河北', '山西', '辽宁', '吉林', '黑龙江', '江苏', '浙江', '安徽', '福建', '江西', '山东', '河南', '湖北', '湖南', '广东', '海南', '四川', '贵州', '云南', '陕西', '甘肃', '青海', '内蒙古', '广西', '西藏', '宁夏', '新疆');
foreach ($provs as $prov) {
if (0 === strpos($location, $prov)) setglobal('inmainlandchina', true);
}
6)日志列表:对国内用户不显示"仅中国大陆以外用户可见"的日志。修改文件 source/include/space/space_blog.php,将下面这句
if(ckfriend($value['uid'], $value['friend'], $value['target_ids']) && ($value['status'] == 0 || $value['uid'] == $_G['uid'] || $_G['adminid'] == 1)) {
改成
if(ckfriend($value['uid'], $value['friend'], $value['target_ids']) && ($value['status'] == 0 || $value['uid'] == $_G['uid'] || $_G['adminid'] == 1) && (!$_G['inmainlandchina'] || !$value['nomainlandchina'])) {
7)DIY日志模块:不显示"仅中国大陆以外用户可见"的日志的标题和摘要。修改文件 source/class/block/space/block_blog.php ,在下面这句
$wheresql = $wheres ? implode(' AND ', $wheres) : '1';
前添加
$wheres[] = "(b.nomainlandchina is null or b.nomainlandchina='0')";
8)在动态里对国内用户不显示"仅中国大陆以外用户可见"的日志的标题和摘要。修改文件 source/include/space/space_home.php,将下面这句
if($value['hot']>0 && ckfriend($value['uid'], $value['friend'], $value['target_ids'])) {
改成
if($value['hot']>0 && ckfriend($value['uid'], $value['friend'], $value['target_ids']) && (!$_G['inmainlandchina'] || !$value['nomainlandchina'])) {
再将下面这句(有两句同样的)
if(!isset($hotlist[$value['feedid']]) && !isset($hotlist_all[$value['feedid']]) && ckfriend($value['uid'], $value['friend'], $value['target_ids'])) {
都改成
if(!isset($hotlist[$value['feedid']]) && !isset($hotlist_all[$value['feedid']]) && ckfriend($value['uid'], $value['friend'], $value['target_ids']) && (!$_G['inmainlandchina'] || !$value['nomainlandchina'])) {
9)一般来讲加了上面三点,国内用户就没有了接触该日志的途径。但还是要防止用户得知了该日志的地址后直接进入。修改文件 source/include/space/space_blog.php,将下面这句
if(!ckfriend($blog['uid'], $blog['friend'], $blog['target_ids'])) {
改成
if(!ckfriend($blog['uid'], $blog['friend'], $blog['target_ids']) || ($_G['inmainlandchina'] && $blog['nomainlandchina'])) {文章来源:
http://www.bian-wang.com/discuz/home.php?mod=space&uid=10005&do=blog&id=1731