有图片展示版的站长可能发现,在重新封面的时候,封面已经不是自己选择的图了,而是发帖时系统默认的了。这个问题反馈了半年了,人家不当是问题。所以就这样了。自己动手吧。(其实有时真不是自己不会修改,也不是自己不想去修改,只是自己修改的太多,影响升级。但人家死活不重视,你拿他没有办法。)
需要修改的文件
source/admincp/admincp_counter.php
source/function/function_post.php
source/class/table/table_forum_threadimage.php
老规距,先分析问题。
为什么会这样,其实原因很简单,在重建的时候,没有读取自己设置的封面,而只是直接从主题附件里面选择最后上传的那张图片。
首先,看看数据库
SELECT *
FROM `pre_forum_threadimage`
LIMIT 0 , 30
tid attachment remote
编辑 删除 1 201309/23/171902q7ahfsbt7xz957t7.jpg 0
编辑 删除 2 201310/30/114312uw221w8t8vw1z1yj.jpg 0
编辑 删除 3 201310/30/114537rlgk0k2kli2z9xg1.jpg 0
编辑 删除 4 201310/30/114619sutk8vvhunxvdbpk.jpg 0
编辑 删除 5 201310/30/114859ylvwz196kdmgw19q.jpg 0
编辑 删除 6 201310/30/120641lgkgq1oa7x00anag.jpg 0
编辑 删除 7 201310/30/121726olrzq3qkpnw383tz.jpg 0
编辑 删除 9 201310/30/122003uk63etg6wmtjjh4e.jpg 0
编辑 删除 11 201310/30/141256ixgxc0m0xzhqg0g0.jpg 0
编辑 删除 12 201310/30/141344qtaide36tzdilz35.jpg 0
编辑 删除 14 201312/29/225508mr9f7rdt7dhbbkp9.jpg 0
我们看到,数据库记录了封面图片的原文件。
有原文件记录就好办了,再看看文件吧,打开
source/admincp/admincp_counter.php
关键部位 451-456行,版本不同略有不同
foreach(C::t('forum_thread')->fetch_all_by_fid_cover_lastpost($fid, $cover, $starttime, $endtime, $current, $pertask) as $thread) {
$processed = 1;
$pid = C::t('forum_post')->fetch_threadpost_by_tid_invisible($thread['tid'], 0);
$pid = $pid['pid'];
setthreadcover($pid);
}
可以很明显的看到,数据库中只记录了TID,而处理函数是处理PID(红色字体)
因此我们需要修改如下:
- foreach(C::t('forum_thread')->fetch_all_by_fid_cover_lastpost($fid, $cover, $starttime, $endtime, $current, $pertask) as $thread) {
- $processed = 1;
- $pid = C::t('forum_post')->fetch_threadpost_by_tid_invisible($thread['tid'], 0);
- $pid = $pid['pid'];
- setthreadcover($pid,$thread['tid']);
- }
复制代码
好,现在我们找到setthreadcover函数。
在source/function/function_post.php文件的最后
- function setthreadcover($pid, $tid = 0, $aid = 0, $countimg = 0, $imgurl = '') {
- global $_G;
- $cover = 0;
- if(empty($_G['uid']) || !intval($_G['setting']['forumpicstyle']['thumbheight']) || !intval($_G['setting']['forumpicstyle']['thumbwidth'])) {
- return false;
- }
- if(($pid || $aid) && empty($countimg)) {
- if(empty($imgurl)) {
- if($aid) {
- $attachtable = 'aid:'.$aid;
- $attach = C::t('forum_attachment_n')->fetch('aid:'.$aid, $aid, array(1, -1));
- }else{
- $attachtable = 'pid:'.$pid;
- $attach = C::t('forum_attachment_n')->fetch_max_image('pid:'.$pid, 'pid', $pid);
-
- }
- if(!$attach) {
- return false;
- }
- if(empty($_G['forum']['ismoderator']) && $_G['uid'] != $attach['uid']) {
- return false;
- }
- $pid = empty($pid) ? $attach['pid'] : $pid;
- $tid = empty($tid) ? $attach['tid'] : $tid;
- $picsource = ($attach['remote'] ? $_G['setting']['ftp']['attachurl'] : $_G['setting']['attachurl']).'forum/'.$attach['attachment'];
- } else {
- $attachtable = 'pid:'.$pid;
- $picsource = $imgurl;
- }
- $basedir = !$_G['setting']['attachdir'] ? (DISCUZ_ROOT.'./data/attachment/') : $_G['setting']['attachdir'];
- $coverdir = 'threadcover/'.substr(md5($tid), 0, 2).'/'.substr(md5($tid), 2, 2).'/';
- dmkdir($basedir.'./forum/'.$coverdir);
- require_once libfile('class/image');
- $image = new image();
- if($image->Thumb($picsource, 'forum/'.$coverdir.$tid.'.jpg', $_G['setting']['forumpicstyle']['thumbwidth'], $_G['setting']['forumpicstyle']['thumbheight'], 2)) {
- $remote = '';
- if(getglobal('setting/ftp/on')) {
- if(ftpcmd('upload', 'forum/'.$coverdir.$tid.'.jpg')) {
- $remote = '-';
- }
- }
- $cover = C::t('forum_attachment_n')->count_image_by_id($attachtable, 'pid', $pid);
- if($imgurl && empty($cover)) {
- $cover = 1;
- }
- $cover = $remote.$cover;
- } else {
- return false;
- }
- }
- if($countimg) {
- if(empty($cover)) {
- $thread = C::t('forum_thread')->fetch($tid);
- $oldcover = $thread['cover'];
- $cover = C::t('forum_attachment_n')->count_image_by_id('tid:'.$tid, 'pid', $pid);
- if($cover) {
- $cover = $oldcover < 0 ? '-'.$cover : $cover;
- }
- }
- }
- if($cover) {
- C::t('forum_thread')->update($tid, array('cover' => $cover));
- return true;
- }
- }
复制代码
发现这个函数有传递TID的参数。但在读取图片数据的时候只处理了AID和PID的情况,并没有TID
if(($pid || $aid) && empty($countimg)) {
if(empty($imgurl)) {
if($aid) {
$attachtable = 'aid:'.$aid;
$attach = C::t('forum_attachment_n')->fetch('aid:'.$aid, $aid, array(1, -1));
}else{
$attachtable = 'pid:'.$pid;
$attach = C::t('forum_attachment_n')->fetch_max_image('pid:'.$pid, 'pid', $pid);
}
OK,那我们把他加上吧,修改如下:
- if(($pid || $aid) && empty($countimg)) {
- if(empty($imgurl)) {
- if($aid) {
- $attachtable = 'aid:'.$aid;
- $attach = C::t('forum_attachment_n')->fetch('aid:'.$aid, $aid, array(1, -1));
- } elseif($tid) {
- $attachtable = 'pid:'.$pid;
- $attach = C::t('forum_threadimage')->fetch($tid);
- }else{
- $attachtable = 'pid:'.$pid;
- $attach = C::t('forum_attachment_n')->fetch_max_image('pid:'.$pid, 'pid', $pid);
-
- }
复制代码
在上面的代码修改中,我们给forum_threadimage添加了fetch动作。
因此,需要打开source/class/table/table_forum_threadimage.php 文件给他添加fetch动作
- public function fetch($tid) {
- return DB::fetch_first('SELECT * FROM %t WHERE tid=%d', array($this->_table,$tid));
- }
复制代码
到些全部修改完毕,测试通过。
希望有一定基础的站长,测试一下,有没有其它方面的问题。
|