注意,本教程本人还未测试过,只收藏并转发。
请自行研究使用,记得备份!
作者:em_kxh
在网友提交帖子时,在后台自动的把帖子中的附件,分成多个帖子来显示,原理就是分隔字符串。
根据你的需要修改:
发新主题:bbs/include/newthread.inc.php
发表回复:bbs/include/newreply.inc.php
对于帖子修改,我没做处理,因为可能导致当前的帖子因为分贴而断层
下面是我的newthread.inc.php代码,对于 newreply.inc.php你们可以做类似的修改,有小小的不同,主要是posts的first全为0
将源代码中的:- $allowpostattach && ($attachnew || $attachdel || $sortid) && updateattach();
复制代码 注释掉,改为如下:- // $allowpostattach && ($attachnew || $attachdel || $sortid) && updateattach();
- 将源代码中的:
- /*
- $db->query("INSERT INTO {$tablepre}posts (fid, tid, first, author, authorid, subject, dateline, message, useip, invisible, anonymous, usesig, htmlon, bbcodeoff, smileyoff, parseurloff, attachment)
- VALUES ('$fid', '$tid', '1', '$discuz_user', '$discuz_uid', '$subject', '$timestamp', '$message', '$onlineip', '$pinvisible', '$isanonymous', '$usesig', '$htmlon', '$bbcodeoff', '$smileyoff', '$parseurloff', '0')");
- $pid = $db->insert_id();
- if($pid && getstatus($thread['status'], 1)) {
- savepostposition($tid, $pid);
- }
- */
复制代码 上面的代码也注释掉,如上所示:
将源代码中的:- $message = preg_replace('/\[attachimg\](\d+)\[\/attachimg\]/is', '[attach]\1[/attach]', $message);
复制代码 此行,替换为:- $message=trim($message);
- // 统计帖子正文中的图片附件数,未插入到正文中的图片不做处理,非图片附件也不做分贴处理
- $mac = substr_count($message, '[/attachimg]');
- // 帖子正文中没有附件,但不表示本帖子没有附件,因为可能有些附件未插入到正文中
- if($mac <= $max_imagattach_count ){
- $message = preg_replace('/\[attachimg\](\d+)\[\/attachimg\]/is', '[attach]\1[/attach]', $message);
- $db->query("INSERT INTO {$tablepre}posts (fid, tid, first, author, authorid, subject, dateline, message, useip, invisible, anonymous, usesig, htmlon, bbcodeoff, smileyoff, parseurloff, attachment)
- VALUES ('$fid', '$tid', '1', '$discuz_user', '$discuz_uid', '$subject', '$timestamp', '$message', '$onlineip', '$pinvisible', '$isanonymous', '$usesig', '$htmlon', '$bbcodeoff', '$smileyoff', '$parseurloff', '0')");
- $pid = $db->insert_id();
- if($pid && getstatus($thread['status'], 1)){
- savepostposition($tid, $pid);
- }
- }else{
- // 根据[/attachimg],将$message字符串分为若干个数组,再根据这些数组生成相应的insert语句,把一个帖子分成多个回贴进行处理
- $msglist = array();
- $step = floor(($mac % $max_imagattach_count > 0) ? ($mac / $max_imagattach_count) : (($mac / $max_imagattach_count) - 1));
- $p1 = $p2 = 0;
- for($i=1; $i<=$step; $i++){
- $str = '';
- for($j=1;$j<=$max_imagattach_count;$j++){
- $p1 = strpos($message,'[/attachimg]',$p1) + 12;
- $str .= substr($message,$p2,($p1-$p2));
- $p2 = $p1;
- }
- if (trim($str) != '') $msglist[] = trim($str);
- }
- $msglist[] = trim(substr($message,$p2,strlen($message) - $p2));
- for($i=0; $i<count($msglist); $i++){
- $v = preg_replace('/\[attachimg\](\d+)\[\/attachimg\]/is', '[attach]\1[/attach]', $msglist[$i]);
- $first = ($i==0) ? 1 : 0;
- $subject1 = ($i==0) ? $subject : '';
- $db->query("INSERT INTO {$tablepre}posts (fid, tid, first, author, authorid, subject, dateline, message, useip, invisible, anonymous, usesig, htmlon, bbcodeoff, smileyoff, parseurloff, attachment)
- VALUES ('$fid', '$tid', '$first', '$discuz_user', '$discuz_uid', '$subject1', '$timestamp', '$v', '$onlineip', '$pinvisible', '$isanonymous', '$usesig', '$htmlon', '$bbcodeoff', '$smileyoff', '$parseurloff', '0')");
- $pid = $db->insert_id();
- if($pid && getstatus($thread['status'], 1)){
- savepostposition($tid, $pid);
- }
- preg_match_all('/\[attach\](\d+)\[\/attach\]/is', $v, $aids); //本次更新的正文中的附件ID
- // 更新相应的附件
- $allowpostattach && ($attachnew || $attachdel || $sortid) && updateattachByIds($aids[1]);
- unset($aid);
- }
- }
- // 更新相应未处理的附件
- $allowpostattach && ($attachnew || $attachdel || $sortid) && updateattach();
复制代码 上面代码中的变量 $max_imagattach_count 定义在config.inc.php中,意思是每楼的图片附件数。
|