【思路解析】discuz 帖子设置封面 setthreadcover 表pre_forum_threadimage
在Discuz 中有一项就是给帖子设置封面,很多情况下只能通过手动的方式去设置或者用提交POST请求的式去设置; 但是这都是调用DISCUZ的功能设置的; 有的时候并非万能的,也有用不到的时候;下面就给大家讲一下DISCUZ在设计封面的设计思路; 知道了思路,就可以自己用代码去实现;
好开始:
在设置了封面后,会在 pre_forum_threadimage 中插入一条这样的数据;
tid 是贴子的ID 后面的是对应的附件的地址;
在点击设置封面的时候会看到,程序会请求一个地址如下图
对是他:
http://localhost/dz/forum.php?mod=ajax&action=setthreadcover&aid=1&fid=36&infloat=yes&handlekey=setcover1&inajax=1&ajaxtarget=fwin_content_setcover1
在这个请求的连接中对我们重要的有 mod /action/fid/aid这几个参数; 请求的是Forum.php 那我们去找。
在Forum.php的最后,我们发现了下面一句代码:
require DISCUZ_ROOT.'./source/module/forum/forum_'.$mod.'.php';
根据这句代码和请求参数,我们找到了:source/module/forum/forum_ajax.php 这个文件,并在里面找到了setthreadcover的处理代码如下:
elseif($_GET['action'] == 'setthreadcover') {
$aid = intval($_GET['aid']);
$imgurl = $_GET['imgurl'];
require_once libfile('function/post');
if($_G['forum'] && ($aid || $imgurl)) {
if($imgurl) {
$tid = intval($_GET['tid']);
$pid = intval($_GET['pid']);
} else {
$threadimage = C::t('forum_attachment_n')->fetch('aid:'.$aid, $aid);
$tid = $threadimage['tid'];
$pid = $threadimage['pid'];
} if($tid && $pid) {
$thread =get_thread_by_tid($tid);
} else {
$thread = array();
}
if(empty($thread) || (!$_G['forum']['ismoderator'] && $_G['uid'] != $thread['authorid'])) {
if($_GET['newthread']) {
showmessage('set_cover_faild', '', array(), array('msgtype' => 3));
} else {
showmessage('set_cover_faild', '', array(), array('closetime' => 3));
}
}
if(setthreadcover($pid, $tid, $aid, 0, $imgurl)) {
if(empty($imgurl)) {
C::t('forum_threadimage')->delete_by_tid($threadimage['tid']);
C::t('forum_threadimage')->insert(array(
'tid' => $threadimage['tid'],
'attachment' => $threadimage['attachment'],
'remote' => $threadimage['remote'],
));
}
if($_GET['newthread']) {
showmessage('set_cover_succeed', '', array(), array('msgtype' => 3));
} else {
showmessage('set_cover_succeed', '', array(), array('alert' => 'right', 'closetime' => 1));
}
}
}
if($_GET['newthread']) {
showmessage('set_cover_faild', '', array(), array('msgtype' => 3));
} else {
showmessage('set_cover_faild', '', array(), array('closetime' => 3));
} }
在这一段代码中,最重要的一段代码是:if(setthreadcover($pid, $tid, $aid, 0, $imgurl)) 不用看下面的代码怎么处理的,但是我们可以猜到在调用过setthreadcover 这个函数之后,封面已经设置完成了;
那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;
}
}
整个这个函数就是处理设置封面的处理函数,处理过程不过多解释,只讲思路,在这个函数中有一句重要的代码是这样的:
if(ftpcmd('upload', 'forum/'.$coverdir.$tid.'.jpg')) {
在查看封面请求地址的时候,会感觉到封面缩略图存放的地址很怪异如下:
c4/ca? 看起来是随机的,与上面提到的封面数据库存储的完全不一样,到底是怎么样对应上的呢;
那我们还得看上面我们提到的函数 setthreadcover 了,上面我们说if(ftpcmd('upload', 'forum/'.$coverdir.$tid.'.jpg')) { //这句代码很重要
ftpcmd 这个什么作用,看到后面的upload我们有理由猜到,这句代码是实现的是一个上传图片的操作; 那能在这个函数里面处理的,肯定是上传缩略图到新的路径了。
那路径在哪呢 'forum/'.$coverdir.$tid.' //对就是后面这一句就是上传的路径。
$tid 不用说,那肯定是贴子的ID也就是这个封面图的文件名;至于 $coverdir 这个我们不难发现,这个就是路径,通过这个我们往上找;找到了这段代码:
$coverdir = 'threadcover/'.substr(md5($tid), 0, 2).'/'.substr(md5($tid), 2, 2).'/';
到此就真相大白了,他生成目录的方式是截取$tid MD5加密后的前两位作为一个目录和第三、四位做了一个目录;为了证明我们的猜测,做如下比较:
再看我们的目录:
完全稳合,知道了DISCUZ的设置思路,那我们就算以后自己给自己的论坛开接口的时候就可以用程序的试实现自动发贴并设置封面了。
总结:很明显DISCUZ使用了新建目录的方式用来存放贴子的封面,不知道他们为何会这么设计 ,感觉很蛋疼,个人认为完全没必要;
【思路解析】discuz 帖子设置封面 setthreadcover 表pre_forum_threadimage的更多相关文章
- discuz 帖子模块用到的表及自动发帖函数
最近在做一个discuz的插件,由于需要程序自动生成并调用discuz已经存在插件的帖子.然而这就相当于自动发帖的功能了.网上找了一下,大部分都是通过curl模拟登陆,模拟发帖的,这显然不满足我的要求 ...
- ECMALL目录结构设置与数据库表
[Ecmall]ECMALL目录结构设置与数据库表 最近在做ecmall的开发,ecmall在开源方面还有待进步啊,官方没有提供开发文档,也没有关于系统架构组织的贡献,使用者都要自己从0开始,官方 ...
- django基础之day08,分页器从无到有,动态思路解析全过程
*********分页器从无到有的全过程,动态思路解析如下:******** 1.通过book_queryset = models.Book.objects.all()[start_num:end_n ...
- 关于TornadoFx和Android的全局配置工具类封装实现及思路解析
原文地址: 关于TornadoFx和Android的全局配置工具类封装实现及思路解析 - Stars-One的杂货小窝 目前个人开发软件存在设置页面,可以让用户自定义些设置,但我发现,存储数据的代码逻 ...
- discuz X3.1 关于分表 和 分表数据迁移
// *********** 关于读取分表的数据*********** { // forum_thread 分表代码片段 -- 帖子列表 { // 定位某个板块的帖子落在哪个表(forum_threa ...
- u-boot分析(四)---设置异常向量表|设置SVC模式
u-boot分析(四) 通过前三篇的分析,我们对u-boot已经有了整体的认识和掌握,但是我们仍然对于其部分硬件是如何初始化的不太清楚,所以接下来几篇博文我将会对我们在http://www.cnblo ...
- discuz首页设置默认地址不带forum.php后缀的方法
最近在研究discuz,上传安装几部搞定,打开首页跳到含有"/forum.php"的网址,到管理中心改了好一会儿也没好.那么如何实现discuz首页设置不带forum.php后缀呢 ...
- SQL Server时间粒度系列----第8节位运算以及设置日历数据表节假日标志详解
本文目录列表: 1.位运算 2.设置日历数据表节假日标志 3.总结语 4.参考清单列表 位运算 SQL Server支持的按位运算符有三个,分别为:按位与(&).按位或(|).按位异或 ...
- 设置MySQL数据表主键
设置MySQL数据表主键: 使用“primary key”关键字创建主键数据列.被设置为主键列不允许出现重复的值,很多情况下与“auto_increment”递增数字相结合.如下SQL语句所示: My ...
随机推荐
- C#实现在winfrom程序中下载文件
//下载文件//downlaodUrl 系统路径如:http://xxx.xxx.xxx/UpFile/kaoqin.doc//fileName 自定义文件名字加后缀(如:考勤.doc)//fileP ...
- javascript的层次
1.功能api 2.代码organization 3.performance 4.work flow
- 小米手机与魅族的PK战结果 说明了什么
我国电子商务面临的问题,淘宝退出百度无疑是一个遗憾.当在网上购物时.用户面临的一个非常大的问题就是怎样在众多的站点找到自己想要的物品,并以最低的价格买到.自从淘宝退出百度.建立自己的搜索引擎后,广大消 ...
- Android解析中国天气网的Json数据
在Android开发中.一般的APP都是通过获取server端的数据来更新UI.从server获取到的数据能够是Json.它的数据量要比XML要小,这里解析中国天气网上获取的数据,尽管已经不再更新了. ...
- 动态的 css——less
less 是一种样式语言,它将 css 赋予了动态语言的特性,如变量. 继承. 运算. 函数.less 既可以在客户端上运行(支持 ie6+,webkit,firefox),也可以借助 Node.js ...
- 不管ACM是不是屠龙之技
有一个目标,每天早上起床能让你保持斗志满满..找到自己的战场和归属. 这件事本身就是很难得的...是不是 ACM 并不重要. 你现在能从其他事情上获得这种体验么? -xiaodao
- SecureCRT中文显示乱码的解决方法
注:本文出自:http://riching.iteye.com/blog/349754 最近开始用SecureCRT登陆linux系统,由于是新手,很多问题不清楚,碰到显示中文乱码的问题,困扰了好几天 ...
- C# @字符用法
1.用 @ 符号加在字符串前面表示其中的转义字符“不”被处理. 如果我们写一个文件的路径,例如"D:/文本文件"路径下的text.txt文件,不加@符号的话写法如下: string ...
- Nodejs随笔(三):全局对象之process
process是全局对象,在任何地方都可以访问,而且它是EventEmitter的一个实例(关于EventEmitter后面会提到). process对象对一些标准的输入输出流进行了封装,如stdin ...
- 使用 Struts 2 实现国际化
struts2国际化(I18N) 国际化也叫I18N,是Internationalization的简称.Struts2国际化是建立在Java国际化基础上,只是Struts2框架对Java国际化进行了进 ...