- 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>
完成后保存,在后台中刷新就可以看到该选项了。同时可以在数据库中查看参数是否成功提交了。
选项添加完成,接下来就是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页面全部报错,快捷回复也同样报错: