说明:五指cms 上传的附件是无状态的,包括多图上传、编辑器上传。导致很多冗余附件产生。
总体思路:
1.在attachment模块下,对h5upload、ueditor、ckeditor 上传的时候,把记录入库(attachment表)的附件id写入客户端cookie。以供文章提交或者修改的的时候记录入库attachment_index表
2.在文章提交或者修改的时候,从客户端获取刚记录的附件id的cookie,把它属于哪篇文章关联起来。入库attachment_index表。
3.在文章彻底从回收站清空的时候,判断这个附件是否还有别的文章使用,如果有,只清除attachment_index的关联记录,如果只有这篇文章使用,则同时删除attachment表里的附件记录,以及删除硬盘上的附件本身。
具体实现办法。
注意:新模块有需要添加附件功能的,,二是要在添加,修改函数里调用txb_get_att_cookie($cid,$id)删除文章调用txb_del_att($cid,$id)
表结构 attachment表里加一个status的字段,记录是否已经使用。新建表attachment_index里面字段keyid和aid
1.在txbcommon.func.php里增加三个核心处理函数
A.txb_set_att_cookie($aid)函数设置上传附件的json格式cookie。格式:set_cookie('att_json',$json_str);
涉及修改位址:(1).app/attachment/EXT_index.php 的h5upload(),有两处添加此函数,负责在选择已存在附件或者上传新附件后在客户端写cookie记录涉及的附件id;
(2).app/attachment/libs/class/attachment.class.php的insert()。最核心的附件入库函数,之后添加此函数。
(3).app/attachment/libs/class/uploader.class.php的upfile()。有一处添加次函数,负责在编辑器里添加,选择已存在的图片,附件后在客户端写cookie记录涉及的附件id;
B.txb_get_att_cookie($cid,$id)把从客户端获取刚记录的附件id的cookie,和它属于哪篇文章关联起来,入库attachment_index。格式: txb_get_att_cookie($cid,$id)
涉及修改位址:(1.)app/content/admin/EXT_content.php里面的add(),edit(),delete() 这是后台增加文章,修改文章,
(2)app/content/EXT_postinfo.php里面的 txb_newinfo() txb_edit()
(3)app/txbblog/home.php 里面的增删改函数。
C.txb_del_att($cid,$id) 从回收站里删除文章的时候调用。在文章彻底从回收站清空的时候,判断这个附件是否还有别的文章使用,如果有,只清除attachment_index的关联记录,如果只有这篇文章使用,则同时删除attachment表里的附件记录,以及删除硬盘上的附件本身。
涉及修改位址:app/content/admin/EXT_content.php里面的delete();delete_more() 从回收站彻底删除文章。批量删除文章的函数。
/txb设置上传附件的json格式cookie
function txb_set_att_cookie($aid) {
$arr['aid'] = $aid;
$json_str = json_encode($arr);
$att_arr_exist = get_cookie('att_json');
$att_arr_exist_tmp = explode('||', $att_arr_exist);
if(is_array($att_arr_exist_tmp) && in_array($json_str, $att_arr_exist_tmp)) {
return true;
} else {
$json_str = $att_arr_exist ? $att_arr_exist.'||'.$json_str : $json_str;
set_cookie('att_json',$json_str);
return true;
}
}
//组装attachment关联字符串,写入attachment_index,后台content和前台postinfo需要用到
function txb_get_att_cookie($cid,$id){
if(isset($cid)&&isset($id)){
$db=load_class('db');
$att_json=get_cookie("att_json");
$keyid=M."-".$cid."-".$id;
if($att_json) {
$att_cookie_arr = explode('||', $att_json);
$att_cookie_arr = array_unique($att_cookie_arr);
} else {
return false;
}
foreach ($att_cookie_arr as $_att_c) $att[] = json_decode($_att_c,true);
//print_r($att[0]);exit();
foreach ($att as $_v) {
$db->update("attachment",array('status'=>1),array('id'=>$id));
$db->insert("attachment_index",array('keyid'=>$keyid,'aid'=>$_v['aid']));
}
set_cookie("att_json","");
}else{
set_cookie("att_json","");
}
}
//txb增加 删除关联附件开始
function txb_del_att($cid,$id){
$db=load_class('db');
if(isset($cid)&&isset($id)){
//txb增加 删除关联附件开始
$att_keyid=M."-".$cid."-".$id;
$attachment_index=$db->get_list("attachment_index",array('keyid'=>$att_keyid));
//echo $att_keyid;
//print_r($attachment_index);exit;
//$c="";
foreach($attachment_index as $rs=>$r){
$count=$db->count(attachment_index,array('aid'=>$r['aid']));
//print_r($count);exit;
$c.="|".$count['num'];
if($count['num']>=2){
$db->delete('attachment_index',array('keyid'=>$r['keyid'],'aid'=>$r['aid']));
}else{
$db->delete('attachment_index',array('keyid'=>$r['keyid'],'aid'=>$r['aid']));
$attachment=$db->get_one('attachment',array('id'=>$r['aid']));
$db->delete('attachment',array('id'=>$r['aid']));
unlink(ATTACHMENT_ROOT.$attachment['path']);
}
}
//echo $c;exit;
}
//txb增加 删除关联附件结束
}
后台调用涉及修改文件,根据需要调用所定义函数。如需源码请私信!
閱讀更多 那年明月刀 的文章