fairycat

Created:
Updated:
Fairycat

phpwind9.0 只允许浏览设置

有时候我们想打开论坛让用户浏览论坛上的信息,但是不允许发布内容,比如假期无人维护论坛的时候。如果关了论坛,帖子无法浏览了,开了论坛,无人维护,一些不好的信息不能及时处理。这时候就设置只允许浏览。

在使用phpwind9.0之后,发现没有“只允许浏览”这一选项。

自己添加选项吧。

首先,在后台的站点设置添加这么一个选项。

在论坛后台全局站点设置站点信息里边,站点的状态设置,,找到该模板,模板路径为:

/template/config/admin/config_run.htm

在该模板中找到站点状态下边的列表,添加一行。这一行,可以直接复制内部开放一行的代码,然后改相应的数值就行了。这里,只允许浏览的参数为3。

<th>站点状态</th>
<td>
    <ul id="J_status_type" class="single_list cc">
        <li><label><input data-title="s1" data-type="" name="visitState" type="radio" value="0"{@Pw::ifcheck(!$config['visit.state'])}><span>完全开放</span></label></li>
        <li><label><input data-title="s2" data-type="J_status_s1,J_status_s2" name="visitState" type="radio" value="1"{@Pw::ifcheck($config['visit.state']==1)}><span>内部开放</span></label></li>
        <li><label><input data-title="s3" data-type="J_status_s2" name="visitState" type="radio" value="2"{@Pw::ifcheck($config['visit.state']==2)}><span>完全关闭</span></label></li>
        <li><label><input data-title="s4" data-type="J_status_s1,J_status_s2" name="visitState" type="radio" value="3"{@Pw::ifcheck($config['visit.state']==3)}><span>只允许浏览</span></label></li>
    </ul>
</td>

完成后保存,在后台中刷新就可以看到该选项了。同时可以在数据库中查看参数是否成功提交了。

2.png

3.png

选项添加完成,接下来就是post拦截了。我们参照内部开放的过滤,给只允许浏览也进行过滤。

过滤文件的目录,不同的版本,在不同的地方。都是phpwind9.0,但还是分不同的版本。

要找到过滤文件,可以到config文件看看。

config文件为:

/conf/application/phpwind.php

在文件中大概14行的位置,找到键名为global,键值中的class指的就是过滤文件了。

APPS:bbs.controller.filter.PwGlobalFilter

APPS为:/src/applications

则,文件路径为:/src/applications/bbs/controller/filter/PwGlobalFilter.php

如果键值为

LIB:filter.PwFilter

LIB为:/src/library

则,文件路径为:/src/library/filter/PwFilter.php

在过滤文件中,大概46行的位置,有对visit.state的判断,我们就在这里更改。

$config = Wekit::C('site');
if ($config['visit.state'] > 0) {
    $service = Wekit::load('site.srv.PwSiteStatusService');
    $resource = $service->siteStatus($loginUser, $config);
    if ($resource instanceof PwError) {
        if (!($config['visit.state'] == 1 && $request['mc'] == 'u/login')) {
            $this->showError($resource->getError());
        }
    }
}

我们要修改的地方是

        if (!($config['visit.state'] == 1 && $request['mc'] == 'u/login')) {
            $this->showError($resource->getError());
        }

从Wekit::load看出,先找到这个文件,进行站点状态设定:site.srv.PwSiteStatusService

文件路径:/src/service/site/ser/PwSiteStatusService.php

在siteStatus方法里边的switch,添加参数为3的条件。

case '0':
    return true;
case '1':
    return $this->protectVisit();
case '2':
    return $this->founderVisit();
case '3':
    return $this->onlyVisit();

然后在下边添加方法onlyVisit。这个方法可以直接复制protectVisit。就是,如果参数为3,我们也会对用户进行用户组判断,和内部开放一样。

protected function onlyVisit() {
    if (!empty($this->_config['visit.gid'])){
        if (in_array($this->_user->gid, $this->_config['visit.gid'])) return true;
    }
    if (!empty($this->_config['visit.ip'])){
        if ($this->formatAllowIP($this->_user->ip)) return true;
    }
    if (!empty($this->_config['visit.member'])){
        if (in_array($this->_user->username, explode(',', $this->_config['visit.member']))) return true;
    }
    return new PwError($this->_config['visit.message']);
}

接下来,返回到过滤文件,先判断参数是否为3,否则逻辑不对了。

if ($config['visit.state'] == 3) {
    if ($request['c'] == 'post') {
        $this->showError($resource->getError());
    }
} elseif (!($config['visit.state'] == 1 && $request['mc'] == 'u/login')) {
    $this->showError($resource->getError());
}

这样,修改完成了。

整理一下,先在模板文件中添加一行:

/template/config/admin/config_run.htm

<li><label><input data-title="s4" data-type="J_status_s1,J_status_s2" name="visitState" type="radio" value="3"{@Pw::ifcheck($config['visit.state']==3)}><span>只允许浏览</span></label></li>

然后,在站点状态Service里边添加switch条件,然后添加方法:

/src/service/site/ser/PwSiteStatusService.php

case '3':
    return $this->onlyVisit();
protected function onlyVisit() {
    if (!empty($this->_config['visit.gid'])){
        if (in_array($this->_user->gid, $this->_config['visit.gid'])) return true;
    }
    if (!empty($this->_config['visit.ip'])){
        if ($this->formatAllowIP($this->_user->ip)) return true;
    }
    if (!empty($this->_config['visit.member'])){
        if (in_array($this->_user->username, explode(',', $this->_config['visit.member']))) return true;
    }
    return new PwError($this->_config['visit.message']);
}

最后,在过滤文件中添加判断

if ($config['visit.state'] == 3) {
    if ($request['c'] == 'post') {
        $this->showError($resource->getError());
    }
} elseif (!($config['visit.state'] == 1 && $request['mc'] == 'u/login')) {
    $this->showError($resource->getError());
}

修改后的效果:

post页面全部报错,快捷回复也同样报错:

截图20150401154053.png

截图20150401151249.png

评论

Name

Email

Website

Subject