|
河源论坛的一个需求: 定时发帖功能的扩展,在开启定时发帖功能的情况下对用户今日发表主题帖的数量来控制是否允许用户继续发帖功能,主要是为了避免一些发贴机狂刷主题帖后的一种预防措施. 此修改的代码可以支持在开启Memcached的情况下使用的!修改如下: 打开template/admin/setting.htm文件,找到: - <p class="mb5">关闭于 <input name="postctl[postend]" value="$db_postend" class="input input_wd"> 时 <input name="postctl[postendminute]" value="$db_postendminute" class="input input_wd"> 分</p>
下方添加如下代码: - <p class="mb5">允许主题数上限:<input name="postctl[allowtopic]" type="text" value="$db_allowtopic" class="input" style="width:30px;"></p>
找到: - <td class="td2"><div class="help_a">设置用户可以使用发帖功能的时间段(24小时制),支持跨越零点设置。例如:用户在 每晚20:00 到 次日8:00 这段时间内可以使用发帖,发帖开启于(点)设为:<b>20</b>;发帖关闭于(点)设为:<b>8</b>。<br />管理员与总版主不受此限制</div></td>
替换成: - <td class="td2"><div class="help_a">设置用户可以使用发帖功能的时间段(24小时制),支持跨越零点设置。例如:用户在 每晚20:00 到 次日8:00 这段时间内可以使用发帖,发帖开启于(点)设为:<b>20</b>;发帖关闭于(点)设为:<b>8</b>。<br />管理员与总版主不受此限制<br><span style="color:red;font-weight:bold;">允许主题数上限</span>:定时发帖开启状态下生效,用户主题帖超过此上限后不能发帖(包括主题和回复)!设置为0表示没有限制</div></td>
打开admin/settings.php,找到: - list($db_openpost, $db_poststart, $db_poststartminute, $db_postend, $db_postendminute) = explode("\t", $db_openpost);
替换成: - list($db_openpost, $db_poststart, $db_poststartminute, $db_postend, $db_postendminute, $db_allowtopic) = explode("\t", $db_openpost);
找到: - $config['openpost'] = $postctl['openpost'] . "\t" . $postctl['poststart'] . "\t" . $postctl['poststartminute'] . "\t" . $postctl['postend']. "\t" . $postctl['postendminute'];
替换成: - $postctl['allowtopic'] = (($postctl['openpost'] == '0') || ($postctl['allowtopic'] < 0)) ? '0' : (int)$postctl['allowtopic'];
- $config['openpost'] = $postctl['openpost'] . "\t" . $postctl['poststart'] . "\t" . $postctl['poststartminute'] . "\t" . $postctl['postend']. "\t" . $postctl['postendminute']."\t".$postctl['allowtopic'];
上面是后台保存配置的代码。下面开始修改前台发帖的时候进行的判断代码部分: 打开lib/forum/post.class.php文件,找到: - list($openpost, $poststart, $poststartminute, $postend, $postendminute) = explode("\t", $db_openpost);
替换成: - list($openpost, $poststart, $poststartminute, $postend, $postendminute, $allowtopic) = explode("\t", $db_openpost);
找到: - $GLOBALS['db_postendminute'] = $postendminute;
下方添加如下代码: - $GLOBALS['db_allowtopic'] = $allowtopic;
找到: - elseif ($poststart == $postend && $this->hours == $poststart && ($minute < $poststartminute || $minute > $postendminute)) {
- return $this->showmsg('post_openpost');
- }
下方添加如下代码: - elseif (($GLOBALS['winddb']['today_topic'] >= (int)$allowtopic) && !empty($allowtopic)){
- return $this->showmsg('post_openpost_allowtopic');
- }
打开template/wind/lang_msg.php文件,找到: - 'post_openpost' => '由于工作力度与时间原因, 站点开放发帖时间为 {$GLOBALS[db_poststart]}:{$GLOBALS[db_poststartminute]} 到 {$GLOBALS[db_postend]}:{$GLOBALS[db_postendminute]}',
下方添加如下代码: - 'post_openpost_allowtopic' => '站点开放发帖时间为 {$GLOBALS[db_poststart]}:{$GLOBALS[db_poststartminute]} 到 {$GLOBALS[db_postend]}:{$GLOBALS[db_postendminute]},此时间段内,站点限制主题发帖数不能超过 <span style="color:red;font-weight:bold;">{$GLOBALS[db_allowtopic]}</span> 帖',
打开require/common.php文件,找到函数getUserByUid()代码段: - function getUserByUid($uid) {
- ……
- }
替换成: - function getUserByUid($uid) {
- $uid = S::int($uid);
- if ($uid < 1) return false;
- if (perf::checkMemcache()){
- $_cacheService = Perf::getCacheService();
- $detail = $_cacheService->get('member_all_uid_' . $uid);
- if ($detail && in_array(SCR, array('index', 'read', 'thread', 'post'))){
- $_singleRight = $_cacheService->get('member_singleright_uid_' . $uid);
- $detail = ($_singleRight === false) ? false : (array)$detail + (array)$_singleRight;
- }
- if ($detail){
- return $detail && $detail['groupid'] != 0 && isset($detail['md.uid']) ? $detail : false;
- }
- $cache = perf::gatherCache('pw_members');
- if (in_array(SCR, array('index', 'read', 'thread', 'post'))){
- $detail = $cache->getMembersAndMemberDataAndSingleRightByUserId($uid);
- } else {
- $detail = $cache->getAllByUserId($uid, true, true);
- }
-
- return $detail && $detail['groupid'] != 0 && isset($detail['md.uid']) ? $detail : false;
- }else {
- global $db;
- $sqladd = $sqltab = '';
- if (in_array(SCR, array('index', 'read', 'thread', 'post'))) {
- $sqladd = (SCR == 'post') ? ',md.postcheck,sr.visit,sr.post,sr.reply' : (SCR == 'read' ? ',sr.visit,sr.reply' : ',sr.visit');
- $sqltab = "LEFT JOIN pw_singleright sr ON m.uid=sr.uid";
- }
- $detail = $db->get_one("SELECT m.uid,m.username,m.password,m.safecv,m.email,m.bday,m.oicq,m.groupid,m.memberid,m.groups,m.icon,m.regdate,m.honor,m.timedf,m.style,m.datefm,m.t_num,m.p_num,m.yz,m.newpm,m.userstatus,m.shortcut,m.medals,m.gender,md.lastmsg,md.postnum,md.rvrc,md.money,md.credit,md.currency,md.lastvisit,md.thisvisit,md.onlinetime,md.lastpost,md.todaypost,md.monthpost,md.onlineip,md.uploadtime,md.uploadnum,md.starttime,md.pwdctime,md.monoltime,md.digests,md.f_num,md.creditpop,md.jobnum,md.lastgrab,md.follows,md.fans,md.newfans,md.newreferto,md.newcomment,md.punch,md.bubble,md.newnotice,md.newrequest,md.shafa $sqladd FROM pw_members m LEFT JOIN pw_memberdata md ON m.uid=md.uid $sqltab WHERE m.uid=" . S::sqlEscape($uid) . " AND m.groupid<>'0' AND md.uid IS NOT NULL");
- $detail['today_topic'] = $db->get_value("SELECT COUNT(*) FROM pw_threads WHERE authorid=".S::sqlEscape($uid)." AND postdate >=".S::sqlEscape($GLOBALS['tdtime']));
-
- return $detail;
- }
- }
找到: lib/gather/gathercache/pw_members.cache.php文件,找到: - function _getMembersAndMemberDataAndMemberInfoByUserIdsNoCache($userIds){
- ……
- }
函数代码段替换成: - function _getMembersAndMemberDataAndMemberInfoByUserIdsNoCache($userIds){
- global $customfield;
- $fieldinfo = '';
- if (is_array($customfield)) {
- foreach ($customfield as $value) {
- !$value['ifsys'] && $fieldinfo .= ',mi.field_'.(int)$value['id'];
- }
- }
- $membersDb = L::loadDB ( 'Members', 'user' );
- $tmpData = array();
- $tmpData = $membersDb->getMembersAndMemberDataAndMemberInfoByUserIds ( $userIds,$fieldinfo );
- foreach ($userIds AS $userId){
- $tmpData[$userId]['today_topic'] = $this->getTodayTopicByUserId($userId);
- }
-
- return $tmpData;
- }
另外在这个方法的下方再新建一个新的方法: - /**
- * 获取单一用户今日发表主题帖个数
- * @param int $userId
- * @return unknown
- */
- function getTodayTopicByUserId($userId){
- global $db,$tdtime;
- $todayTopic = '0';
- $todayTopic = $db->get_value("SELECT COUNT(*) FROM pw_threads WHERE authorid=".S::sqlEscape($userId)." AND postdate >=".S::sqlEscape($tdtime));
-
- return $todayTopic;
- }
|