修复删除回收站文件,空间不变化的bug

This commit is contained in:
zyx0814 2024-01-29 15:58:49 +08:00
parent 0d03a65d32
commit 57db5f3430
2 changed files with 1522 additions and 1504 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,452 +1,466 @@
<?php
if(!defined('IN_DZZ')) {
exit('Access Denied');
}
class table_resources_version extends dzz_table
{
public function __construct()
{
$this->_table = 'resources_version';
$this->_pk = 'vid';
$this->_pre_cache_key = 'resources_version_';
$this->_cache_ttl = 5 * 60;
parent::__construct();
}
//获取文件图标
public function getfileimg($data){
if($data['type']=='image'){
$data['img']=DZZSCRIPT.'?mod=io&op=thumbnail&size=small&path='.dzzencode('attach::'.$data['aid']);
}elseif($data['type']=='attach' || $data['type']=='document'){
$data['img']=geticonfromext($data['ext'],$data['type']);
}elseif($data['type']=='dzzdoc'){
$data['img']=isset($data['img'])?$data['img']:geticonfromext($data['ext'],$data['type']);
}else{
$data['img']=isset($data['img'])?$data['img']:geticonfromext($data['ext'],$data['type']);
}
return $data['img'];
}
public function fetch_all_by_rid($rid,$limit = '',$count = false){
$rid = trim($rid);
$versions = array();
$resources = C::t('resources')->fetch_info_by_rid($rid);
$limitsql = '';
if($limit){
$limitarr = explode('-',$limit);
if(count($limitarr) > 1){
$limitsql = "limit $limitarr[0],$limitarr[1]";
}else{
$limitsql = "limit 0,$limitarr[0]";
}
}/*else{
$cachekey = 'resourcesversiondata_'.$rid;
if($versions = $this->fetch_cache($cachekey)){
return $versions;
}
}*/
if($count){
return DB::result_first("select count(*) from %t where rid = %s",array($this->_table,$rid));
}
if($resources['vid'] == 0){
$attrdata = C::t('resources_attr')->fetch_by_rid($rid,0);
$filedata = array(
'vid' =>0,
'rid'=>$rid,
'uid'=>$resources['uid'],
'username'=>$resources['username'],
'vname'=>'',
'aid'=>$attrdata['aid'],
'type'=>$resources['type'],
'ext'=>$resources['ext'],
'size'=>$resources['size'],
'dateline'=>$resources['dateline'],
'img'=>$attrdata['img']
);
$filedata['img'] = self::getfileimg($filedata);
$versions[$filedata['vid']] = $filedata;
}else{
foreach(DB::fetch_all("select * from %t where rid = %s order by dateline desc $limitsql ",array($this->_table,$rid)) as $val){
$attrdata = C::t('resources_attr')->fetch_by_rid($rid,$val['vid']);
$val['img'] = isset($attrdata['img']) ?$attrdata['img']:'';
$filedata = $val;
$filedata['img'] = self::getfileimg($filedata);
$versions[$val['vid']] = $filedata;
}
}
//$this->store_cache($cachekey,$versions);
return $versions;
}
public function delete_by_vid($vid,$rid){
$vid = intval($vid);
$cachekey = 'resourcesversiondata_'.$rid;
$datainfo = C::t('resources')->fetch_info_by_rid($rid);
$vinfo = parent::fetch($vid);
if(parent::delete($vid)){
SpaceSize(-$vinfo['size'],$datainfo['gid'],1,$datainfo['uid']);
C::t('resources_attr')->delete_by_rvid($rid,$vid);
$this->clear_cache($cachekey);
}
return true;
}
/* public function delete_by_version($icoid,$vid){
global $_G ;
$cachekey = 'resourcesversiondata_'.$icoid;
if(parent::delete($vid)){
C::t('resources_attr')->delete_by_rvid($icoid,$vid);
//DB::delete('resources_attr',array('rid'=>$icoid,'vid'=>$vid));
$eventdata = array(
'rid'=>$icoid,
'uid'=>$_G['uid'],
'username'=>$_G['username'],
'event_body'=>'delete_version',
'body_data'=>serialize(array('version'=>$vid)),
'dateline'=>TIMESTAMP,
);
DB::insert('resources_event',$eventdata);
$v = DB::result_first("select vid from %t where rid=%s order by dateline DESC ",array($this->_table,$icoid));
C::t('resources')->update($icoid,array('vid',$v));
return array('msg'=>$v);
}else return array('error'=>lang('error_delete_version_failed'));
}*/
public function delete_by_rid($rid){
if(!$return = DB::fetch_all("select * from %t where rid = %s",array($this->_table,$rid))){
return ;
}
$cachekey = 'resourcesversiondata_'.$rid;
$aids = array();
foreach($return as $v){
$aids[] = $v['aid'];
}
if(!empty($aids)){
C::t('attachment')->addcopy_by_aid($aids,-1);
}
DB::delete($this->_table,array('rid'=>$rid));
$this->clear_cache($cachekey);
}
//上传新版本
public function add_new_version_by_rid($rid,$setarr,$force=false){
global $_G,$documentexts;
$cachekey = 'resourcesversiondata_'.$rid;
if(!$resources = C::t('resources')->fetch_info_by_rid($rid)){
return array('error'=>lang('file_not_exist'));
}
//检测权限
if (!$force && !perm_check::checkperm_Container($resources['pfid'], 'edit2') && !( $_G['uid'] == $resources['uid'] && perm_check::checkperm_Container($resources['pfid'], 'edit1'))) {
return array('error'=>lang('no_privilege'));
}
//文件类型获取
$imgexts = array('jpg', 'jpeg', 'gif', 'png', 'bmp');
if (in_array(strtolower($setarr['ext']), $imgexts)){
$setarr['type'] = 'image';
}elseif(in_array(strtoupper($setarr['ext']), $documentexts)){
$setarr['type'] = 'document';
}else{
$setarr['type'] = 'attach';
}
//没有版本时,属性表和版本数据处理
if($resources['vid'] == 0){
$oldattr = C::t('resources_attr')->fetch_by_rid($rid);
$setarr1 = array(
'rid'=>$rid,
'uid'=>$resources['uid'],
'username'=>$resources['username'],
'vname'=>'',
'size'=>$resources['size'],
'ext'=>$resources['ext'],
'type'=>$resources['type'],
'dateline'=>$resources['dateline'],
'aid'=>intval($oldattr['aid'])
);
//将原数据插入版本表
if($oldvid = parent::insert($setarr1,1)){
C::t('resources_attr')->update_vid_by_rvid($rid,0,$oldvid);
}else{
return array('error'=>lang('failure'));
}
}
//文件名
$filename = $setarr['name'];
$filename = self::getFileName($setarr['name'],$resources['pfid'],$rid);
unset($setarr['name']);
$setarr['rid'] = $rid;
//新数据插入版本表
if($vid = parent::insert($setarr,1)){
$this->clear_cache($cachekey);
//更新主表数据
//DB::update('resources',array('vid'=>$vid,'size'=>$setarr['size'],'ext'=>$setarr['ext'],'type'=>$setarr['type'],'name'=>$filename),array('rid'=>$rid))
if(C::t('resources')->update_by_rid($rid,array('vid'=>$vid,'size'=>$setarr['size'],'ext'=>$setarr['ext'],'type'=>$setarr['type'],'name'=>$filename))){
SpaceSize($setarr['size'],$resources['gid'],true);
//插入属性表数据
$sourceattrdata = array(
'postip' => $_G['clientip'],
'title' => $filename,
'aid' => isset($setarr['aid']) ? $setarr['aid'] : '',
'img'=>geticonfromext($setarr['ext'],$setarr['type'])
);
//插入属性表
if (C::t('resources_attr')->insert_attr($rid,$vid,$sourceattrdata)) {
if ($setarr['aid']) {
$attach = C::t('attachment')->fetch($setarr['aid']);
C::t('attachment')->update($setarr['aid'], array('copys' => $attach['copys'] + 1));//增加使用数
}
}
//记录事件
$path = C::t('resources_path')->fetch_pathby_pfid($resources['pfid']);
$path = preg_replace('/dzz:(.+?):/','',$path);
$event = 'update_version';
$eventdata = array(
'title' => $resources['name'],
'aid' => $setarr['aid'],
'username' => $setarr['username'],
'uid' => $setarr['uid'],
'position'=>$path
);
C::t('resources_event')->addevent_by_pfid($resources['pfid'], $event, 'updatevesion', $eventdata, $resources['gid'], $rid, $resources['name']);
//增加统计数据
$statis = array(
'edits'=>1,
'uid'=>$_G['uid'],
'editdateline'=>TIMESTAMP
);
c::t('resources_statis')->add_statis_by_rid($rid,$statis);
$setarr['fdateline'] = dgmdate($setarr['dateline'],'Y-m-d H:i:s');
$setarr['vid'] = $vid;
$setarr['size'] = formatsize($setarr['size']);
if($resources['vid'] == 0){
$setarr['olddatavid'] = $oldvid;
}
$indexarr = array('rid'=>$rid);
Hook::listen('createafter_addindex',$indexarr);
$setarr['dpath'] = dzzencode($rid);
return $setarr;
}else{
parent::delete($vid);
return array('error'=>lang('failure'));
}
}
}
//设置主版本
public function set_primary_version_by_vid($vid){
global $_G;
if(!$versioninfo = parent::fetch($vid)){
return array('error'=>lang('file_not_exist'));
}
if(!$fileinfo = C::t('resources')->fetch($versioninfo['rid'])) return array('error'=>lang('file_not_exist'));
//判断编辑权限
if (!perm_check::checkperm_Container($fileinfo['pfid'], 'edit2') && !($_G['uid'] == $fileinfo['uid'] && perm_check::checkperm_Container($fileinfo['pfid'], 'edit1'))) {
return array('error'=>lang('no_privilege'));
}
$vfilename = DB::result_first("select sval from %t where vid = %d and rid = %s and skey = %s",array('resources_attr',$vid,$versioninfo['rid'],'title'));
//获取不重复的名字
$filename = self::getFileName($vfilename,$fileinfo['pfid'],$versioninfo['rid']);
if(!$filename){
$filename = $versioninfo['vname'];
if($filename != $vfilename){
C::t('resources_attr')->update_by_skey($fileinfo['rid'],$vid,array('title'=>$filename));
}
}
//更改resources表数据
$updatearr = array('vid'=>$vid,'name'=>$filename,'size'=>$versioninfo['size'],'ext'=>$versioninfo['ext'],'type'=>$versioninfo['type']);
//DB::update('resources',$updatearr,array('rid'=>$versioninfo['rid']))
if(C::t('resources')->update_by_rid($versioninfo['rid'],$updatearr)){
//文件路径信息
$path = C::t('resources_path')->fetch_pathby_pfid($fileinfo['pfid']);
$path = preg_replace('/dzz:(.+?):/','',$path);
$event = 'setprimary_version';
$hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($fileinfo['pfid'],$fileinfo['gid']);
$eventdata = array(
'name' => $filename,
'oldname'=>$fileinfo['name'],
'aid' => $versioninfo['aid'],
'username' => $_G['username'],
'uid' => $_G['uid'],
'position'=>$path,
'hash'=>$hash
);
$statis = array(
'edits'=>1,
'uid'=>$_G['uid'],
'editdateline'=>TIMESTAMP
);
C::t('resources_statis')->add_statis_by_rid($versioninfo['rid'],$statis);
C::t('resources_event')->addevent_by_pfid($fileinfo['pfid'], $event, 'setprimaryversion', $eventdata, $fileinfo['gid'], $fileinfo['rid'], $fileinfo['name']);
$indexarr = array('rid'=>$versioninfo['rid']);
Hook::listen('createafter_addindex',$indexarr);
return array('rid'=>$versioninfo['rid']);
}else{
return array('error'=>lang('explorer_do_failed'));
}
}
//判断文件重名
public function getFileName($name,$pfid,$rid = ''){
static $i=0;
$params = array('resources',$name,$pfid);
$wheresql = '';
if($rid){
$wheresql .= " and rid != %s ";
$params[] = $rid;
}
$name=self::name_filter($name);
if(DB::result_first("select COUNT(*) from %t where type!='folder' and name=%s and isdelete<1 and pfid=%d $wheresql",$params)){
$ext='';
$namearr=explode('.',$name);
if(count($namearr)>1){
$ext=$namearr[count($namearr)-1];
unset($namearr[count($namearr)-1]);
$ext=$ext?('.'.$ext):'';
}
$tname=implode('.',$namearr);
$name=preg_replace("/\(\d+\)/i",'',$tname).'('.($i+1).')'.$ext;
$i+=1;
return self::getFileName($name,$pfid,$rid);
}else{
return $name;
}
}
//过滤文件名称
public function name_filter($name){
return str_replace(array('/','\\',':','*','?','<','>','|','"',"\n"),'',$name);
}
//根据版本id修改版本名称
public function update_versionname_by_vid($vid,$vname){
global $_G;
if(!$versioninfo = parent::fetch($vid)){
return array('error'=>lang('file_not_exist'));
}
$cachekey = 'resourcesversiondata_'.$versioninfo['rid'];
if(DB::result_first("select count(*) from %t where vname = %s and rid = %s",array($this->_table,$vname,$versioninfo['rid'])) > 0 ){
return array('error'=>lang('explorer_name_repeat'));
}
//文件基本信息
$fileinfo = C::t('resources')->fetch_info_by_rid($versioninfo['rid']);
//判断编辑权限
if (!perm_check::checkperm_Container($fileinfo['pfid'], 'edit2') && !($_G['uid'] == $fileinfo['uid'] && perm_check::checkperm_Container($fileinfo['pfid'], 'edit1'))) {
return array('error'=>lang('no_privilege'));
}
$sertarr = array('vname'=>$vname,'dateline'=>TIMESTAMP);
if(parent::update($vid,$sertarr)){
$path = C::t('resources_path')->fetch_pathby_pfid($fileinfo['pfid']);
$path = preg_replace('/dzz:(.+?):/','',$path);
$event = 'edit_versionname';
$hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($fileinfo['pfid'],$fileinfo['gid']);
$eventdata = array(
'name' => $vname,
'filename'=>$fileinfo['name'],
'username' => $_G['username'],
'oldvname'=>($versioninfo['name']) ? $versioninfo['name']:dgmdate($versioninfo['dateline'],'Y-m-d H:i:s'),
'uid' => $_G['uid'],
'position'=>$path,
'hash'=>$hash
);
$statis = array(
'edits'=>1,
'uid'=>$_G['uid'],
'editdateline'=>TIMESTAMP
);
C::t('resources_statis')->add_statis_by_rid($versioninfo['rid'],$statis);
C::t('resources_event')->addevent_by_pfid($fileinfo['pfid'], $event, 'editversionname', $eventdata, $fileinfo['gid'], $fileinfo['rid'], $fileinfo['name']);
$this->clear_cache($cachekey);
$this->clear_cache($versioninfo['rid']);
return array('vid'=>$vid,'primaryvid'=>$fileinfo['vid'],'fdateline'=>dgmdate($versioninfo['dateline'],'Y-m-d H:i:s'));
}else{
return array('error'=>lang('explorer_do_failed'));
}
}
//根据rid修改版本名称,因版本表无数据,需先将主表数据放入版本表,然后更新主表和属性表
public function update_versionname_by_rid($rid,$vname){
global $_G;
if(!$fileinfo = C::t('resources')->fetch_info_by_rid($rid)){
return array('error'=>lang('file_not_exist'));
}
//判断编辑权限
if (!perm_check::checkperm_Container($fileinfo['pfid'], 'edit2') && !($_G['uid'] == $fileinfo['uid'] && perm_check::checkperm_Container($fileinfo['pfid'], 'edit1'))) {
return array('error'=>lang('no_privilege'));
}
//没有版本时,属性表和版本数据处理
$setarr = array(
'rid'=>$rid,
'uid'=>$fileinfo['uid'],
'username'=>$fileinfo['username'],
'vname'=>$vname,
'size'=>$fileinfo['size'],
'ext'=>$fileinfo['ext'],
'type'=>$fileinfo['type'],
'dateline'=>TIMESTAMP
);
//将数据插入版本表
if($vid = parent::insert($setarr,1)){
//更新属性表数据
//DB::update('resources_attr',array('vid'=>$vid),array('rid'=>$rid,'vid'=>0));
C::t('resources_attr')->update_by_skey($rid,0,array('vid'=>$vid));
//更新主表数据
//DB::update('resources',array('vid'=>$vid),array('rid'=>$rid))
if(C::t('resources')->update_by_rid($rid,array('vid'=>$vid))){
$path = C::t('resources_path')->fetch_pathby_pfid($fileinfo['pfid']);
$path = preg_replace('/dzz:(.+?):/','',$path);
$event = 'edit_versionname';
$vfilename = DB::result_first("select sval from %t where vid = %d and rid = %s and skey = %s",array('resources_attr',$vid,$fileinfo['rid'],'title'));
$hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($fileinfo['pfid'],$fileinfo['gid']);
$eventdata = array(
'name' => $vname,
'filename'=>$fileinfo['name'],
'username' => $_G['username'],
'oldvname'=>($fileinfo['name']) ? $fileinfo['name']:dgmdate($fileinfo['dateline'],'Y-m-d H:i:s'),
'uid' => $_G['uid'],
'position'=>$path,
'hash'=>$hash
);
$statis = array(
'edits'=>1,
'uid'=>$_G['uid'],
'editdateline'=>TIMESTAMP
);
C::t('resources_statis')->add_statis_by_rid($fileinfo['rid'],$statis);
C::t('resources_event')->addevent_by_pfid($fileinfo['pfid'], $event, 'editversionname', $eventdata, $fileinfo['gid'], $fileinfo['rid'], $fileinfo['name']);
return array('vid'=>$vid,'primaryvid'=>$fileinfo['vid'],'fdateline'=>dgmdate($setarr['dateline'],'Y-m-d H:i:s'));
}else{
parent::delete($vid);
return array('error'=>lang('explorer_do_failed'));
}
}else{
return array('error'=>lang('explorer_do_failed'));
}
}
public function get_versioninfo_by_rid_vid($rid,$vid=0){
$rid = trim($rid);
$vid = intval($vid);
if(!$rid) return ;
if(!$vid){
return C::t('resources')->fetch_info_by_rid($rid);
}
return DB::fetch_first("select * from %t where rid = %s and vid = %d",array($this->_table,$rid,$vid));
}
public function fetch_version_by_rid_vid($rid,$vid){
$rid = trim($rid);
$vid = intval($vid);
$data = array();
if(!$data = C::t('resources')->fetch_info_by_rid($rid)){
return $data;
}
$versiondata = DB::fetch_first("select * from %t where rid = %s and vid = %d",array($this->_table,$rid,$vid));
$data = array_merge($data,$versiondata);
$attrdata = C::t('resources_attr')->fetch_by_rid($rid,$vid);
$data = array_merge($data,$attrdata);
$data['icoid'] = dzzencode('attach::' . $data['aid']);
return $data;
}
<?php
if(!defined('IN_DZZ')) {
exit('Access Denied');
}
class table_resources_version extends dzz_table
{
public function __construct()
{
$this->_table = 'resources_version';
$this->_pk = 'vid';
$this->_pre_cache_key = 'resources_version_';
$this->_cache_ttl = 5 * 60;
parent::__construct();
}
//获取文件图标
public function getfileimg($data){
if($data['type']=='image'){
$data['img']=DZZSCRIPT.'?mod=io&op=thumbnail&size=small&path='.dzzencode('attach::'.$data['aid']);
}elseif($data['type']=='attach' || $data['type']=='document'){
$data['img']=geticonfromext($data['ext'],$data['type']);
}elseif($data['type']=='dzzdoc'){
$data['img']=isset($data['img'])?$data['img']:geticonfromext($data['ext'],$data['type']);
}else{
$data['img']=isset($data['img'])?$data['img']:geticonfromext($data['ext'],$data['type']);
}
return $data['img'];
}
public function fetch_all_by_rid($rid,$limit = '',$count = false){
$rid = trim($rid);
$versions = array();
$resources = C::t('resources')->fetch_info_by_rid($rid);
$limitsql = '';
if($limit){
$limitarr = explode('-',$limit);
if(count($limitarr) > 1){
$limitsql = "limit $limitarr[0],$limitarr[1]";
}else{
$limitsql = "limit 0,$limitarr[0]";
}
}/*else{
$cachekey = 'resourcesversiondata_'.$rid;
if($versions = $this->fetch_cache($cachekey)){
return $versions;
}
}*/
if($count){
return DB::result_first("select count(*) from %t where rid = %s",array($this->_table,$rid));
}
if($resources['vid'] == 0){
$attrdata = C::t('resources_attr')->fetch_by_rid($rid,0);
$filedata = array(
'vid' =>0,
'rid'=>$rid,
'uid'=>$resources['uid'],
'username'=>$resources['username'],
'vname'=>'',
'aid'=>$attrdata['aid'],
'type'=>$resources['type'],
'ext'=>$resources['ext'],
'size'=>$resources['size'],
'dateline'=>$resources['dateline'],
'img'=>$attrdata['img']
);
$filedata['img'] = self::getfileimg($filedata);
$versions[$filedata['vid']] = $filedata;
}else{
foreach(DB::fetch_all("select * from %t where rid = %s order by dateline desc $limitsql ",array($this->_table,$rid)) as $val){
$attrdata = C::t('resources_attr')->fetch_by_rid($rid,$val['vid']);
$val['img'] = isset($attrdata['img']) ?$attrdata['img']:'';
$filedata = $val;
$filedata['img'] = self::getfileimg($filedata);
$versions[$val['vid']] = $filedata;
}
}
//$this->store_cache($cachekey,$versions);
return $versions;
}
public function delete_by_vid($vid,$rid=''){
$vid = intval($vid);
if(!$vinfo = parent::fetch($vid)) return false;
if(empty($rid)) $rid=$vinfo['rid'];
$datainfo = C::t('resources')->fetch_info_by_rid($rid);
if($datainfo['vid']==$vinfo['vid']){//如果删除的是主版本,判断是否是最后一个版本,最后一个版本不让删除
if(!$nvid=DB::result_first("select vid form %t where rid=%s and vid!=%d order by vid DESC",array($this->_table,$rid,$vid))){
return false;
}
}
$cachekey = 'resourcesversiondata_'.$rid;
if(parent::delete($vid)){
if($vinfo['aid']) C::t('attachment')->delete_by_aid($vinfo['aid']);
SpaceSize(-$vinfo['size'],$datainfo['gid'],1,$datainfo['uid']);
C::t('resources_attr')->delete_by_rvid($rid,$vid);
$this->clear_cache($cachekey);
if($nvid){//如果删除的是主版本,需要重新设置文件其他版本为主版本
self::set_primary_version_by_vid($nvid,true);
}
}
return true;
}
/* public function delete_by_version($icoid,$vid){
global $_G ;
$cachekey = 'resourcesversiondata_'.$icoid;
if(parent::delete($vid)){
C::t('resources_attr')->delete_by_rvid($icoid,$vid);
//DB::delete('resources_attr',array('rid'=>$icoid,'vid'=>$vid));
$eventdata = array(
'rid'=>$icoid,
'uid'=>$_G['uid'],
'username'=>$_G['username'],
'event_body'=>'delete_version',
'body_data'=>serialize(array('version'=>$vid)),
'dateline'=>TIMESTAMP,
);
DB::insert('resources_event',$eventdata);
$v = DB::result_first("select vid from %t where rid=%s order by dateline DESC ",array($this->_table,$icoid));
C::t('resources')->update($icoid,array('vid',$v));
return array('msg'=>$v);
}else return array('error'=>lang('error_delete_version_failed'));
}*/
public function delete_by_rid($rid){
$vids=array();
$aids=array();
$size=0;
$datainfo = C::t('resources')->fetch($rid);
foreach(DB::fetch_all("select * from %t where rid = %s",array($this->_table,$rid)) as $value){
$vids[]=$value['vid'];
$aids[]=$value['aid'];
$size+=intval($value['size']);
}
$cachekey = 'resourcesversiondata_'.$rid;
if($ret=parent::delete($vids)){
$this->clear_cache($cachekey);
foreach($aids as $aid){
C::t('attachment')->delete_by_aid($aid);
}
SpaceSize(-$size,$datainfo['gid'],1,$datainfo['uid']);
}
return $ret;
}
//上传新版本
public function add_new_version_by_rid($rid,$setarr,$force=false){
global $_G,$documentexts;
$cachekey = 'resourcesversiondata_'.$rid;
if(!$resources = C::t('resources')->fetch_info_by_rid($rid)){
return array('error'=>lang('file_not_exist'));
}
//检测权限
if (!$force && !perm_check::checkperm_Container($resources['pfid'], 'edit2') && !( $_G['uid'] == $resources['uid'] && perm_check::checkperm_Container($resources['pfid'], 'edit1'))) {
return array('error'=>lang('no_privilege'));
}
//文件类型获取
$imgexts = array('jpg', 'jpeg', 'gif', 'png', 'bmp');
if (in_array(strtolower($setarr['ext']), $imgexts)){
$setarr['type'] = 'image';
}elseif(in_array(strtoupper($setarr['ext']), $documentexts)){
$setarr['type'] = 'document';
}else{
$setarr['type'] = 'attach';
}
//没有版本时,属性表和版本数据处理
if($resources['vid'] == 0){
$oldattr = C::t('resources_attr')->fetch_by_rid($rid);
$setarr1 = array(
'rid'=>$rid,
'uid'=>$resources['uid'],
'username'=>$resources['username'],
'vname'=>'',
'size'=>$resources['size'],
'ext'=>$resources['ext'],
'type'=>$resources['type'],
'dateline'=>$resources['dateline'],
'aid'=>intval($oldattr['aid'])
);
//将原数据插入版本表
if($oldvid = parent::insert($setarr1,1)){
C::t('resources_attr')->update_vid_by_rvid($rid,0,$oldvid);
}else{
return array('error'=>lang('failure'));
}
}
//文件名
$filename = $setarr['name'];
$filename = self::getFileName($setarr['name'],$resources['pfid'],$rid);
unset($setarr['name']);
$setarr['rid'] = $rid;
//新数据插入版本表
if($vid = parent::insert($setarr,1)){
$this->clear_cache($cachekey);
//更新主表数据
//DB::update('resources',array('vid'=>$vid,'size'=>$setarr['size'],'ext'=>$setarr['ext'],'type'=>$setarr['type'],'name'=>$filename),array('rid'=>$rid))
if(C::t('resources')->update_by_rid($rid,array('vid'=>$vid,'size'=>$setarr['size'],'ext'=>$setarr['ext'],'type'=>$setarr['type'],'name'=>$filename))){
SpaceSize($setarr['size'],$resources['gid'],true);
//插入属性表数据
$sourceattrdata = array(
'postip' => $_G['clientip'],
'title' => $filename,
'aid' => isset($setarr['aid']) ? $setarr['aid'] : '',
'img'=>geticonfromext($setarr['ext'],$setarr['type'])
);
//插入属性表
if (C::t('resources_attr')->insert_attr($rid,$vid,$sourceattrdata)) {
if ($setarr['aid']) {
$attach = C::t('attachment')->fetch($setarr['aid']);
C::t('attachment')->update($setarr['aid'], array('copys' => $attach['copys'] + 1));//增加使用数
}
}
//记录事件
$path = C::t('resources_path')->fetch_pathby_pfid($resources['pfid']);
$path = preg_replace('/dzz:(.+?):/','',$path);
$event = 'update_version';
$eventdata = array(
'title' => $resources['name'],
'aid' => $setarr['aid'],
'username' => $setarr['username'],
'uid' => $setarr['uid'],
'position'=>$path
);
C::t('resources_event')->addevent_by_pfid($resources['pfid'], $event, 'updatevesion', $eventdata, $resources['gid'], $rid, $resources['name']);
//增加统计数据
$statis = array(
'edits'=>1,
'uid'=>$_G['uid'],
'editdateline'=>TIMESTAMP
);
c::t('resources_statis')->add_statis_by_rid($rid,$statis);
$setarr['fdateline'] = dgmdate($setarr['dateline'],'Y-m-d H:i:s');
$setarr['vid'] = $vid;
$setarr['size'] = formatsize($setarr['size']);
if($resources['vid'] == 0){
$setarr['olddatavid'] = $oldvid;
}
$indexarr = array('rid'=>$rid);
Hook::listen('createafter_addindex',$indexarr);
$setarr['dpath'] = dzzencode($rid);
return $setarr;
}else{
parent::delete($vid);
return array('error'=>lang('failure'));
}
}
}
//设置主版本
public function set_primary_version_by_vid($vid){
global $_G;
if(!$versioninfo = parent::fetch($vid)){
return array('error'=>lang('file_not_exist'));
}
if(!$fileinfo = C::t('resources')->fetch($versioninfo['rid'])) return array('error'=>lang('file_not_exist'));
//判断编辑权限
if (!perm_check::checkperm_Container($fileinfo['pfid'], 'edit2') && !($_G['uid'] == $fileinfo['uid'] && perm_check::checkperm_Container($fileinfo['pfid'], 'edit1'))) {
return array('error'=>lang('no_privilege'));
}
$vfilename = DB::result_first("select sval from %t where vid = %d and rid = %s and skey = %s",array('resources_attr',$vid,$versioninfo['rid'],'title'));
//获取不重复的名字
$filename = self::getFileName($vfilename,$fileinfo['pfid'],$versioninfo['rid']);
if(!$filename){
$filename = $versioninfo['vname'];
if($filename != $vfilename){
C::t('resources_attr')->update_by_skey($fileinfo['rid'],$vid,array('title'=>$filename));
}
}
//更改resources表数据
$updatearr = array('vid'=>$vid,'name'=>$filename,'size'=>$versioninfo['size'],'ext'=>$versioninfo['ext'],'type'=>$versioninfo['type']);
//DB::update('resources',$updatearr,array('rid'=>$versioninfo['rid']))
if(C::t('resources')->update_by_rid($versioninfo['rid'],$updatearr)){
//文件路径信息
$path = C::t('resources_path')->fetch_pathby_pfid($fileinfo['pfid']);
$path = preg_replace('/dzz:(.+?):/','',$path);
$event = 'setprimary_version';
$hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($fileinfo['pfid'],$fileinfo['gid']);
$eventdata = array(
'name' => $filename,
'oldname'=>$fileinfo['name'],
'aid' => $versioninfo['aid'],
'username' => $_G['username'],
'uid' => $_G['uid'],
'position'=>$path,
'hash'=>$hash
);
$statis = array(
'edits'=>1,
'uid'=>$_G['uid'],
'editdateline'=>TIMESTAMP
);
C::t('resources_statis')->add_statis_by_rid($versioninfo['rid'],$statis);
C::t('resources_event')->addevent_by_pfid($fileinfo['pfid'], $event, 'setprimaryversion', $eventdata, $fileinfo['gid'], $fileinfo['rid'], $fileinfo['name']);
$indexarr = array('rid'=>$versioninfo['rid']);
Hook::listen('createafter_addindex',$indexarr);
return array('rid'=>$versioninfo['rid']);
}else{
return array('error'=>lang('explorer_do_failed'));
}
}
//判断文件重名
public function getFileName($name,$pfid,$rid = ''){
static $i=0;
$params = array('resources',$name,$pfid);
$wheresql = '';
if($rid){
$wheresql .= " and rid != %s ";
$params[] = $rid;
}
$name=self::name_filter($name);
if(DB::result_first("select COUNT(*) from %t where type!='folder' and name=%s and isdelete<1 and pfid=%d $wheresql",$params)){
$ext='';
$namearr=explode('.',$name);
if(count($namearr)>1){
$ext=$namearr[count($namearr)-1];
unset($namearr[count($namearr)-1]);
$ext=$ext?('.'.$ext):'';
}
$tname=implode('.',$namearr);
$name=preg_replace("/\(\d+\)/i",'',$tname).'('.($i+1).')'.$ext;
$i+=1;
return self::getFileName($name,$pfid,$rid);
}else{
return $name;
}
}
//过滤文件名称
public function name_filter($name){
return str_replace(array('/','\\',':','*','?','<','>','|','"',"\n"),'',$name);
}
//根据版本id修改版本名称
public function update_versionname_by_vid($vid,$vname){
global $_G;
if(!$versioninfo = parent::fetch($vid)){
return array('error'=>lang('file_not_exist'));
}
$cachekey = 'resourcesversiondata_'.$versioninfo['rid'];
if(DB::result_first("select count(*) from %t where vname = %s and rid = %s",array($this->_table,$vname,$versioninfo['rid'])) > 0 ){
return array('error'=>lang('explorer_name_repeat'));
}
//文件基本信息
$fileinfo = C::t('resources')->fetch_info_by_rid($versioninfo['rid']);
//判断编辑权限
if (!perm_check::checkperm_Container($fileinfo['pfid'], 'edit2') && !($_G['uid'] == $fileinfo['uid'] && perm_check::checkperm_Container($fileinfo['pfid'], 'edit1'))) {
return array('error'=>lang('no_privilege'));
}
$sertarr = array('vname'=>$vname,'dateline'=>TIMESTAMP);
if(parent::update($vid,$sertarr)){
$path = C::t('resources_path')->fetch_pathby_pfid($fileinfo['pfid']);
$path = preg_replace('/dzz:(.+?):/','',$path);
$event = 'edit_versionname';
$hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($fileinfo['pfid'],$fileinfo['gid']);
$eventdata = array(
'name' => $vname,
'filename'=>$fileinfo['name'],
'username' => $_G['username'],
'oldvname'=>($versioninfo['name']) ? $versioninfo['name']:dgmdate($versioninfo['dateline'],'Y-m-d H:i:s'),
'uid' => $_G['uid'],
'position'=>$path,
'hash'=>$hash
);
$statis = array(
'edits'=>1,
'uid'=>$_G['uid'],
'editdateline'=>TIMESTAMP
);
C::t('resources_statis')->add_statis_by_rid($versioninfo['rid'],$statis);
C::t('resources_event')->addevent_by_pfid($fileinfo['pfid'], $event, 'editversionname', $eventdata, $fileinfo['gid'], $fileinfo['rid'], $fileinfo['name']);
$this->clear_cache($cachekey);
$this->clear_cache($versioninfo['rid']);
return array('vid'=>$vid,'primaryvid'=>$fileinfo['vid'],'fdateline'=>dgmdate($versioninfo['dateline'],'Y-m-d H:i:s'));
}else{
return array('error'=>lang('explorer_do_failed'));
}
}
//根据rid修改版本名称,因版本表无数据,需先将主表数据放入版本表,然后更新主表和属性表
public function update_versionname_by_rid($rid,$vname){
global $_G;
if(!$fileinfo = C::t('resources')->fetch_info_by_rid($rid)){
return array('error'=>lang('file_not_exist'));
}
//判断编辑权限
if (!perm_check::checkperm_Container($fileinfo['pfid'], 'edit2') && !($_G['uid'] == $fileinfo['uid'] && perm_check::checkperm_Container($fileinfo['pfid'], 'edit1'))) {
return array('error'=>lang('no_privilege'));
}
//没有版本时,属性表和版本数据处理
$setarr = array(
'rid'=>$rid,
'uid'=>$fileinfo['uid'],
'username'=>$fileinfo['username'],
'vname'=>$vname,
'size'=>$fileinfo['size'],
'ext'=>$fileinfo['ext'],
'type'=>$fileinfo['type'],
'dateline'=>TIMESTAMP
);
//将数据插入版本表
if($vid = parent::insert($setarr,1)){
//更新属性表数据
//DB::update('resources_attr',array('vid'=>$vid),array('rid'=>$rid,'vid'=>0));
C::t('resources_attr')->update_by_skey($rid,0,array('vid'=>$vid));
//更新主表数据
//DB::update('resources',array('vid'=>$vid),array('rid'=>$rid))
if(C::t('resources')->update_by_rid($rid,array('vid'=>$vid))){
$path = C::t('resources_path')->fetch_pathby_pfid($fileinfo['pfid']);
$path = preg_replace('/dzz:(.+?):/','',$path);
$event = 'edit_versionname';
$vfilename = DB::result_first("select sval from %t where vid = %d and rid = %s and skey = %s",array('resources_attr',$vid,$fileinfo['rid'],'title'));
$hash = C::t('resources_event')->get_showtpl_hash_by_gpfid($fileinfo['pfid'],$fileinfo['gid']);
$eventdata = array(
'name' => $vname,
'filename'=>$fileinfo['name'],
'username' => $_G['username'],
'oldvname'=>($fileinfo['name']) ? $fileinfo['name']:dgmdate($fileinfo['dateline'],'Y-m-d H:i:s'),
'uid' => $_G['uid'],
'position'=>$path,
'hash'=>$hash
);
$statis = array(
'edits'=>1,
'uid'=>$_G['uid'],
'editdateline'=>TIMESTAMP
);
C::t('resources_statis')->add_statis_by_rid($fileinfo['rid'],$statis);
C::t('resources_event')->addevent_by_pfid($fileinfo['pfid'], $event, 'editversionname', $eventdata, $fileinfo['gid'], $fileinfo['rid'], $fileinfo['name']);
return array('vid'=>$vid,'primaryvid'=>$fileinfo['vid'],'fdateline'=>dgmdate($setarr['dateline'],'Y-m-d H:i:s'));
}else{
parent::delete($vid);
return array('error'=>lang('explorer_do_failed'));
}
}else{
return array('error'=>lang('explorer_do_failed'));
}
}
public function get_versioninfo_by_rid_vid($rid,$vid=0){
$rid = trim($rid);
$vid = intval($vid);
if(!$rid) return ;
if(!$vid){
return C::t('resources')->fetch_info_by_rid($rid);
}
return DB::fetch_first("select * from %t where rid = %s and vid = %d",array($this->_table,$rid,$vid));
}
public function fetch_version_by_rid_vid($rid,$vid){
$rid = trim($rid);
$vid = intval($vid);
$data = array();
if(!$data = C::t('resources')->fetch_info_by_rid($rid)){
return $data;
}
$versiondata = DB::fetch_first("select * from %t where rid = %s and vid = %d",array($this->_table,$rid,$vid));
$data = array_merge($data,$versiondata);
$attrdata = C::t('resources_attr')->fetch_by_rid($rid,$vid);
$data = array_merge($data,$attrdata);
$data['icoid'] = dzzencode('attach::' . $data['aid']);
return $data;
}
}