作 者: alan888
適用版本: Discuz 4.0 & 4.1
修改文件: index.php, logging.php, topicadmin.php, include/newthread.inc.php, include/newreply.inc.php, include/editpost.inc.php, include/counter.inc.php, include/cache.func.php, index 模板
加入文件: foruminfo 模板 (附件 1)
演 示:
AL8 Forum
本插件加入伸縮顯示, 請參考下帖
http://www.alan888.com/Discuz/viewthread.php?tid=62380
本插件因是按本站的條件編寫, 在其他 Discuz Forum 使用可能出現一些問題, 故原本不打算發放, 但修到不少會員的查詢, 所以將部份較易出問題的部份修改後發放
在所見的現有 cache 版 4 格插件, 因參考以前本站 2.2 版的修改, 做成每次更新快取時大量數據庫查詢次數, 例如將 cache.func.php 改成 "
'index'=> array('announcements', 'onlinelist', 'forumlinks', 'newthread', 'replythread');" 每次發帖回帖等更新快取檔 "updatecache" 動作時便增加 5 次數據庫查詢, 本插件使用獨立快取檔, 只會更新需要的部份, 所以在下列動作時只會增加數據庫查詢 1-2 次:
1. 會員注冊: 1次 (當天注冊人數更新)
2. 會員登陸: 1次 (當天到訪人數更新)
3. 發新帖: 1次 (最新發表文章更新)
4. 回帖: 2次 (最新發表文章及最新回覆文章更新)
5. 管理動作執行: 2次 (最新發表文章及最新回覆文章更新)
本站曾經嘗試使用 Discuz 4 的 JS 調用功能, 但更新不及時而速度也跟本插件相若, 故最後還是使用此插件的辦法
注意:
1. 安裝此插件非常繁瑣, 對初學者不建議使用;
2. "是日到訪會員" 的數據是根據會員執行登入程序後更新, 如會員使用 cookies 登入, 數據會在下次其他會員使用登入程序後才更新;
3. 請子細閱讀每個安裝程序, 尤其修改 cache.func.php 部份
4. 四格顯示只提供快速登陸口, 但有安全登錄連接
5. 積分政策按兩種而設, 超過兩種左手邊第一格會較高, 可增加發帖及回帖的顯示數量平衡, 在 include/cache.func.php 內找 "DESC LIMIT 0,
11" 將 11 (顯示 11 行) 改為修改後的行數
6. 本插件在使用新版本的 MySQL 4.1 (含 4.1)以上 或 PHP 5.x系統時可能出現錯誤
補丁
1. 修正在編輯帖子內刪除帖子未能即時更新的問題 (2006年6月11日更新)
請補回本帖第 4 步 include/editpost.php 的修改
安裝程序
1. 修改 include/cache.func.php
修改完成此文件後請即時到後台→更新緩存
找
'medals' => array('medals')
更換為
'medals' => array('medals'),
'newtopic' => array('newtopic'),
'newreply' => array('newreply'),
'todayvisit' => array('todayvisit')
再找
case 'medals':
$table = 'medals';
$cols = 'medalid, name, image';
$conditions = "WHERE available='1'";
break;
在下面加上
(注意先填妥紅字部份)
由於使用快取檔型式, 故某些私密區不能判斷會員權限來顯示發帖及回帖, 所以要先修改及取代下紅字部份 "
填上需要顯示回帖區域的 fid 編號, 以逗號作分格, 最後一個不用加上逗號" 部份, 例如希望顯示 fid 1,3,5 便填上 "
$fids="1,3,5";"
case newtopic:
$table = 'threads t, cdb_forums f';
$cols = "t.tid, t.subject, t.author, t.dateline, t.views, t.replies, t.lastpost, t.lastposter, t.highlight, f.name";
$fids="填上需要顯示發新帖區域的 fid 編號, 以逗號作分格, 最後一個不用加上逗號";//例如 "1,2,3";
$conditions = "WHERE t.fid<>'$fid' AND f.fid=t.fid AND f.fid IN ($fids) ORDER BY t.dateline DESC LIMIT 0, 11";
break;
case newreply:
$table = 'threads t, cdb_forums f';
$cols = "t.tid, t.subject, t.author, t.dateline, t.views, t.replies, t.lastpost, t.lastposter, t.highlight, f.name";
$fids="填上需要顯示回帖區域的 fid 編號, 以逗號作分格, 最後一個不用加上逗號";//例如 "1,2,3";
$conditions = "WHERE t.fid<>'$fid' AND f.fid=t.fid AND f.fid IN ($fids) AND t.replies !=0 ORDER BY t.lastpost DESC LIMIT 0, 11";
break;
case todayvisit:
$table = 'members';
$cols = "COUNT(*)";
$datecut = time() - (3600 * 24);
$conditions = "WHERE lastactivity>='$datecut' ORDER BY lastvisit DESC";
break;
找
$GLOBALS['totlamembers'] = $data['totalmembers'] = $db->result($query, 0);
在下面加上
$datecut = time() - (3600 * 24);
$query = $db->query("SELECT COUNT(*) FROM {$tablepre}members WHERE regdate>='$datecut'");
$GLOBALS['todaynewmems'] = $data['todaynewmems'] = $db->result($query, 0);
2. 修改 include/newthread.inc.php
找
$allowuseblog && $isblog && $blog ? showmessage('post_newthread_blog_succeed', "blog.php?tid=$tid")
在上面加上
require DISCUZ_ROOT.'./include/cache.func.php';
updatecache('newtopic');
3. 修改 include/newreply.inc.php
找
!$allowuseblog || empty($isblog) ? showmessage('post_reply_succeed',
在上面加上
require DISCUZ_ROOT.'./include/cache.func.php';
updatecache('newreply');
updatecache('newtopic');
4. 修改 include/editpost.inc.php
(2006年6月11日前修改者請加回此步驟)
找
updatecache('globalstick');
下面加上
updatecache('newtopic');
updatecache('newreply');
5. 修改 include/counter.inc.php
找
if(!$sessionexists) {
if(strpos($visitor['agent'], 'MSIE')) {
$visitor['browser'] = 'MSIE';
} elseif(strpos($visitor['agent'], 'Netscape')) {
$visitor['browser'] = 'Netscape';
} elseif(strpos($visitor['agent'], 'Lynx')) {
$visitor['browser'] = 'Lynx';
} elseif(strpos($visitor['agent'], 'Opera')) {
$visitor['browser'] = 'Opera';
} elseif(strpos($visitor['agent'], 'Konqueror')) {
$visitor['browser'] = 'Konqueror';
} elseif(substr($visitor['agent'], 0, 7) == 'Mozilla') {
$visitor['browser'] = 'Mozilla';
} else {
$visitor['browser'] = 'Other';
}
if(strpos($visitor['agent'], 'Win')) {
$visitor['os'] = 'Windows';
} elseif(strpos($visitor['agent'], 'Mac')) {
$visitor['os'] = 'Mac';
} elseif(strpos($visitor['agent'], 'Linux')) {
$visitor['os'] = 'Linux';
} elseif(strpos($visitor['agent'], 'FreeBSD')) {
$visitor['os'] = 'FreeBSD';
} elseif(strpos($visitor['agent'], 'SunOS')) {
$visitor['os'] = 'SunOS';
} elseif(strpos($visitor['agent'], 'OS/2')) {
$visitor['os'] = 'OS/2';
} elseif(strpos($visitor['agent'], 'AIX')) {
$visitor['os'] = 'AIX';
} elseif(preg_match("/(Bot|Crawl|Spider)/i", $visitor['agent'])) {
$visitor['os'] = 'Spiders';
} else {
$visitor['os'] = 'Other';
}
更換為
if(!$sessionexists || $discuz_uid) {
if(strpos($visitor['agent'], "MSIE 7.0")) {
$visitor_browser = "Internet Explorer 7.0";
$visitor['browser'] = 'MSIE';
} elseif(strpos($visitor['agent'], "MSIE 6.0")) {
$visitor_browser = "Internet Explorer 6.0";
$visitor['browser'] = 'MSIE';
} elseif(strpos($visitor['agent'], "MSIE 5.5")) {
$visitor_browser = "Internet Explorer 5.5";
$visitor['browser'] = 'MSIE';
} elseif(strpos($visitor['agent'], "MSIE 5.0")) {
$visitor_browser = "Internet Explorer 5.0";
$visitor['browser'] = 'MSIE';
} elseif(strpos($visitor['agent'], "MSIE 4.01")) {
$visitor_browser = "Internet Explorer 4.01";
$visitor['browser'] = 'MSIE';
} elseif(strpos($visitor['agent'], "Netscape")) {
$visitor_browser = "Netscape";
$visitor['browser'] = 'Netscape';
} elseif(strpos($visitor['agent'], "Lynx")) {
$visitor_browser = "Lynx";
$visitor['browser'] = 'Lynx';
} elseif(strpos($visitor['agent'], "Opera")) {
$visitor_browser = "Opera";
$visitor['browser'] = 'Opera';
} elseif(strpos($visitor['agent'], "Konqueror")) {
$visitor_browser = "Konqueror";
$visitor['browser'] = 'Konqueror';
} elseif(strpos($visitor['agent'], "Firefox")) {
$visitor_browser = "Firefox";
$visitor['browser'] = 'Mozilla';
} elseif(strpos($visitor['agent'], "Mozilla/5.0")) {
$visitor_browser = "Mozilla";
$visitor['browser'] = 'Mozilla';
} else {
$visitor_browser = "其它";
$visitor['browser'] = 'Other';
}
if(strpos($visitor['agent'], "NT 5.1")) {
if(strpos($visitor['agent'], "SV1")){
$visitor_os = "Windows XP SP2";
$visitor['os'] = 'Windows';
}else{
$visitor_os = "Windows XP";
$visitor['os'] = 'Windows';
}
}elseif(strpos($visitor['agent'], "NT 6.0")) {
$visitor_os = "Win Vista";
$visitor['os'] = 'Windows';
}elseif(strpos($visitor['agent'], "NT 5.2")) {
$visitor_os = "Windows Server 2003";
$visitor['os'] = 'Windows';
}elseif(strpos($visitor['agent'], "NT 5")) {
$visitor_os = "Windows 2000";
$visitor['os'] = 'Windows';
} elseif(strpos($visitor['agent'], "4.9")) {
$visitor_os = "Windows ME";
$visitor['os'] = 'Windows';
} elseif(strpos($visitor['agent'], "NT 4")) {
$visitor_os = "Windows NT 4.0";
$visitor['os'] = 'Windows';
} elseif(strpos($visitor['agent'], "98")) {
$visitor_os = "Windows 98";
$visitor['os'] = 'Windows';
} elseif(strpos($visitor['agent'], "95")) {
$visitor_os = "Windows 95";
$visitor['os'] = 'Windows';
} elseif(strpos($visitor['agent'], "Mac")) {
$visitor_os = "Mac";
$visitor['os'] = 'Mac';
} elseif(strpos($visitor['agent'], "Linux")) {
$visitor_os = "Linux";
$visitor['os'] = 'Linux';
} elseif(strpos($visitor['agent'], "Unix")) {
$visitor_os = "Unix";
$visitor['os'] = 'Other';
} elseif(strpos($visitor['agent'], "FreeBSD")) {
$visitor_os = "FreeBSD";
$visitor['os'] = 'FreeBSD';
} elseif(strpos($visitor['agent'], "SunOS")) {
$visitor_os = "SunOS";
$visitor['os'] = 'SunOS';
} elseif(strpos($visitor['agent'], "OS/2")) {
$visitor_os = "OS/2";
$visitor['os'] = 'OS/2';
}elseif(strpos($visitor['agent'], "AIX")) {
$visitor_os = "AIX";
$visitor['os'] = 'AIX';
} elseif(preg_match("/(Bot|Crawl|Spider)/i", $visitor['agent'])) {
$visitor_os = "Spiders";
$visitor['os'] = 'Spiders';
} else {
$visitor_os = "其他";
$visitor['os'] = 'Other';
}
6. 修改 topicadmin.php
找到及刪除
(共三處)
require_once DISCUZ_ROOT.'./include/cache.func.php';
找
require_once './include/common.inc.php';
在下面加上
require_once DISCUZ_ROOT.'./include/cache.func.php';
找
$db->query("UPDATE {$tablepre}threads SET author='$fpost[author]', authorid='$fpost[authorid]', dateline='$fpost[dateline]', rate='".intval(@($fpost['rate'] / abs($fpost['rate'])))."', moderated='1' WHERE tid='$newtid'");
在下面加上
updatecache('newreply');
updatecache('newtopic');
找
showmessage((isset($resultarray['message']) ? $resultarray['message'] : 'admin_succeed'), $resultarray['redirect']);
在上面加上
updatecache('newreply');
updatecache('newtopic');
7. 修改 logging.php
找
在下面加上
require_once DISCUZ_ROOT.'./include/cache.func.php';
updatecache('todayvisit');
8. 修改 index.php
找
$newthreads = round(($timestamp - $lastvisit + 600) / 1000) * 1000;
在下面加上
//-----------hack AL8 Info
require_once DISCUZ_ROOT.'./include/counter.inc.php';
require_once DISCUZ_ROOT.'./include/misc.func.php';
$mem_home = convertip($onlineip, $datadir = "./");
require_once DISCUZ_ROOT.'./forumdata/cache/cache_todayvisit.php';
$todayvisit=$_DCACHE['todayvisit']['0']['COUNT(*)'] ;
$hack_cut_str = 26;
$new_post_threadlist = array();
$nthread = array();
$colorarray = array('', 'red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'purple', 'gray');
require_once './forumdata/cache/cache_newtopic.php';
foreach($_DCACHE['newtopic'] as $nthread) {
$nthread['forumname'] = $nthread['name'];
$nthread['view_subject'] = cutstr($nthread['subject'],$hack_cut_str);
$nthread['subject'] = cutstr($nthread['subject'],46);
$nthread['date']= gmdate("$dateformat $timeformat", $nthread['dateline'] + $timeoffset * 3600);
$nthread['lastreplytime']= gmdate("$dateformat $timeformat", $nthread[lastpost] + ($timeoffset * 3600));
if($nthread['highlight']) {
$string = sprintf('%02d', $nthread['highlight']);
$stylestr = sprintf('%03b', $string[0]);
$nthread['highlight'] = 'style="';
$nthread['highlight'] .= $stylestr[0] ? 'font-weight: bold;' : '';
$nthread['highlight'] .= $stylestr[1] ? 'font-style: italic;' : '';
$nthread['highlight'] .= $stylestr[2] ? 'text-decoration: underline;' : '';
$nthread['highlight'] .= $string[1] ? 'color: '.$colorarray[$string[1]] : '';
$nthread['highlight'] .= '"';
} else {
$nthread['highlight'] = '';
}
$new_post_threadlist[] = $nthread;
}
unset($_DCACHE['newtopic']);
$hack_cut_str = 26;
$new_reply_threadlist = array();
$rthread = array();
$colorarray = array('', 'red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'purple', 'gray');
require_once './forumdata/cache/cache_newreply.php';
foreach($_DCACHE['newreply'] as $rthread) {
$rthread['forumname'] = $rthread['name'];
$rthread['view_subject'] = cutstr($rthread['subject'],$hack_cut_str);
$rthread['subject'] = cutstr($rthread['subject'],46);
$rthread['date']= gmdate("$dateformat $timeformat", $rthread['dateline'] + $timeoffset * 3600);
$rthread['lastreplytime']= gmdate("$dateformat $timeformat", $rthread[lastpost] + ($timeoffset * 3600));
if($rthread['highlight']) {
$string = sprintf('%02d', $rthread['highlight']);
$stylestr = sprintf('%03b', $string[0]);
$rthread['highlight'] = 'style="';
$rthread['highlight'] .= $stylestr[0] ? 'font-weight: bold;' : '';
$rthread['highlight'] .= $stylestr[1] ? 'font-style: italic;' : '';
$rthread['highlight'] .= $stylestr[2] ? 'text-decoration: underline;' : '';
$rthread['highlight'] .= $string[1] ? 'color: '.$colorarray[$string[1]] : '';
$rthread['highlight'] .= '"';
} else {
$rthread['highlight'] = '';
}
$new_reply_threadlist[] = $rthread;
}
unset($_DCACHE['newreply']);
//-----------hack AL8 Info End
9. Discuz 4.0 修改 index 模板
(Discuz 4.1 見第二帖)
找
<table cellspacing="{TABLESPACE}" cellpadding="0" border="0" width="{TABLEWIDTH}" align="center" class="outertxt">
<tr><td class="smalltxt">
{lang timenow} $currenttime, {lang your_lastvisit} $lastvisittime<br>
{lang credits}: <span class="bold">$credits</span>
<!--{loop $extcredits $id $credit}-->
$credit[title]: <span class="bold">$GLOBALS[extcredits.$id]</span>$credit[unit]
<!--{/loop}-->
/ {lang index_status}:
<!--{if $validdays}--><a href="member.php?action=groupexpiry"><span class="bold">$grouptitle</span>($validdays)</a><!--{else}--><span class="bold">$grouptitle</span><!--{/if}-->
<!--{if !empty($invisible)}--> / {lang login_invisible_mode}<!--{/if}-->
</td><td align="right" nowrap class="smalltxt">
<a href="search.php?srchfrom=$newthreads&searchsubmit=yes">{lang show_newthreads}</a> |
<!--{if $discuz_uid}-->
<a href="search.php?srchuid=$discuz_uid&mytopics=yes&searchsubmit=yes">{lang show_mytopics}</a> |
<!--{if $allowuseblog}-->
<a href="blog.php?uid=$discuz_uid" target="_blank">{lang blog}</a> |
<!--{/if}-->
<!--{/if}-->
<a href="digest.php">{lang digest}</a> |
<a href="member.php?action=markread">{lang mark_read}</a>
| {lang welcome_newmember} <a href="viewpro.php?username=$memberenc"><span class="bold">$lastmember</span></a><br>
{lang total} <span class="bold">$threads</span> {lang index_threads} / <span class="bold">$posts</span> {lang index_posts} / {lang index_today} <span class="bold">$todayposts</span> {lang index_posts} / <span class="bold">$totalmembers</span> {lang index_members}
</td></tr></table>
<!--{if empty($gid)}-->
<table cellspacing="{INNERBORDERWIDTH}" cellpadding="{TABLESPACE}" width="{TABLEWIDTH}" align="center" class="tableborder">
<tr class="header"><td colspan="3">$bbname {lang index_announcements}</td></tr>
<tr class="altbg2" align="center">
<td colspan="3" align="center">
<!--{if empty($announcements)}-->
{lang index_noannouncement}
<!--{else}-->
<marquee direction="left" scrollamount="3" onMouseOver="this.stop();" onMouseOut="this.start();">
$announcements
</marquee>
<!--{/if}-->
</td></tr></table><br>
<!--{/if}-->
更換為
<!--{if empty($gid)}-->
{template foruminfo}<br>
<!--{/if}-->
10. 下載附件 foruminfo.rar 及解壓為 foruminfo.htm, 並執行
a. 根據自身討論區對下一段作出調整
來自 $mem_home 的訪客, 現{lang register}成為會員即獲贈現金 100 點, 用作參予本討論區的活動之用。
b. 上載至 templates/default 目錄下
~完成~
安全更新
凡於 2007.01.07 前修改者, 請如下修改
include/newthread.inc.php 及 include/newreply.inc.php
找
更換為