2022-11-02 23:21:46 +08:00
< ? php
if ( ! defined ( 'IN_DZZ' )) {
exit ( 'Access Denied' );
}
class table_resources extends dzz_table
{
public $noperm = false ;
public function __construct ()
{
$this -> _table = 'resources' ;
$this -> _pk = 'rid' ;
$this -> _pre_cache_key = 'resources_' ;
$this -> _cache_ttl = 60 * 60 ;
parent :: __construct ();
}
public function insert_data ( $data , $rid = '' )
{
$data [ 'rid' ] = ( $rid ) ? $rid : self :: create_id ();
if ( parent :: insert ( $data )) {
return $data [ 'rid' ];
}
return false ;
}
//生成主键rid
public function create_id ()
{
$microtime = microtime ();
list ( $msec , $sec ) = explode ( ' ' , $microtime );
$msec = $msec * 1000000 ;
$idstr = md5 ( $sec . $msec . random ( 6 ));
return $idstr ;
}
/* public function getparentsuri ( $pfid )
{
$path = array ();
if ( $parent = DB :: result_first ( 'select pfid,fname from %t where fid = %d' , array ( 'folder' , $pfid ))) {
if ( $parent [ 'pfid' ] > 0 && $parent [ 'pfid' ] != $pfid ) {
$path [] = $parent [ 'fname' ];
self :: getparenturi ( $parent [ 'pfid' ]);
}
}
$path = array_reverse ( $path );
$path = implode ( '/' , $path );
return $path ;
} */
public function update_by_pfids ( $pfids , $setarr )
{
if ( ! is_array ( $pfids )) $pfids = ( array ) $pfids ;
$rids = array ();
foreach ( DB :: fetch_all ( " select rid from %t where pfid in(%n) " , array ( 'resources' , $pfids )) as $v ) {
$rids [] = $v [ 'rid' ];
}
return self :: update_by_rid ( $rids , $setarr );
}
public function rename_by_rid ( $rid , $newname )
{
global $_G ;
$uid = $_G [ 'uid' ];
if ( ! $infoarr = $this -> fetch_info_by_rid ( $rid )) {
return array ( 'error' => lang ( 'file_not_exist' ));
}
$cachkey = 'resourcesdata_' . $rid ;
$updatepath = false ;
if ( $infoarr [ 'type' ] == 'folder' ) {
$updatepath = true ;
}
$fid = $infoarr [ 'pfid' ];
if ( ! perm_check :: checkperm_Container ( $infoarr [ 'pfid' ], 'edit2' ) && ! ( $_G [ 'uid' ] == $infoarr [ 'uid' ] && perm_check :: checkperm_Container ( $infoarr [ 'pfid' ], 'edit1' ))) {
return array ( 'error' => true );
}
$setarr = array (
'isdelete' => 1 ,
'deldateline' => time ()
);
$position = C :: t ( 'resources_path' ) -> fetch_pathby_pfid ( $fid );
$position = preg_replace ( '/dzz:(.+?):/' , '' , $position );
//DB::update($this->_table, array('name' => $newname, 'dateline' => TIMESTAMP), array('rid' => $rid))
if ( self :: update_by_rid ( $rid , array ( 'name' => $newname , 'dateline' => TIMESTAMP ))) {
if ( $updatepath ) {
C :: t ( 'folder' ) -> update ( $infoarr [ 'oid' ], array ( 'fname' => $newname ));
C :: t ( 'resources_path' ) -> update_path_by_fid ( $infoarr [ 'oid' ], $newname );
}
//更新属性表数据
C :: t ( 'resources_attr' ) -> update_by_skey ( $rid , $infoarr [ 'vid' ], array ( 'title' => $newname ));
//更新缓存
$cachkey = 'resourcesdata_' . $rid ;
$this -> clear_cache ( $cachkey );
$statisdata = array (
'uid' => getglobal ( 'uid' ),
'edits' => 1 ,
'editdateline' => TIMESTAMP
);
C :: t ( 'resources_statis' ) -> add_statis_by_rid ( $rid , $statisdata );
$hash = C :: t ( 'resources_event' ) -> get_showtpl_hash_by_gpfid ( $infoarr [ 'pfid' ], $infoarr [ 'gid' ]);
$eventdata = array ( 'username' => $_G [ 'username' ], 'position' => $position , 'filename' => $infoarr [ 'name' ], 'newfilename' => $newname , 'hash' => $hash );
C :: t ( 'resources_event' ) -> addevent_by_pfid ( $infoarr [ 'pfid' ], 'rename_file' , 'rename' , $eventdata , $infoarr [ 'gid' ], $rid , $infoarr [ 'name' ]);
$this -> clear_cache ( $cachkey );
$this -> clear_cache ( $rid );
return array ( 'newname' => $newname );
}
return array ( 'error' => true );
}
//查询文件表基础信息 $notisdelete是否是已删除
public function fetch_info_by_rid ( $rid , $notisdelete = false )
{
if ( ! $data = parent :: fetch ( $rid )) return false ;
if ( $notisdelete ) {
if ( $data [ 'isdelete' ] > 0 ) return false ;
}
return $data ;
}
//检查目录权限 如删除,复制,剪切
public function check_folder_perm ( $icoarr , $action , $isdelete = false )
{
global $_G ;
if ( $action == 'cut' ) $action = 'delete' ;
//获取文件夹fid集合
$fids = C :: t ( 'resources_path' ) -> fetch_folder_containfid_by_pfid ( $icoarr [ 'oid' ]);
$rids = array ();
$resources = array ();
$extrasql = '' ;
if ( ! $isdelete ) {
$extrasql = ' and isdelete < 1 ' ;
}
//获取当前文件下所有下级rid
foreach ( DB :: fetch_all ( " select rid,pfid,oid,uid,sperm from %t where (oid in(%n) or pfid in(%n)) and rid != %s $extrasql " , array ( $this -> _table , $fids , $fids , $icoarr [ 'rid' ])) as $v ) {
$rids [] = $v [ 'rid' ];
$resources [] = $v ;
}
$index = array_search ( $icoarr [ 'oid' ], $fids );
unset ( $fids [ $index ]);
$ridnum = count ( $rids );
$fidnum = count ( $fids );
if ( $icoarr [ 'gid' ] > 0 ) {
$folderinfo = C :: t ( 'folder' ) -> fetch ( $icoarr [ 'oid' ]);
if ( ! perm_FolderSPerm :: isPower ( $folderinfo [ 'fsperm' ], $action )) return array ( 'error' => lang ( 'has_no_privilege_file' ));
//判断目录是否为空,为空则不判断当前目录权限
if ( $ridnum ) {
if ( perm_check :: checkperm_Container ( $icoarr [ 'pfid' ], $action . '2' ) || ( $_G [ 'uid' ] == $folderinfo [ 'uid' ] && perm_check :: checkperm_Container ( $icoarr [ 'pfid' ], $action . '1' ))) {
if ( ! perm_check :: checkperm_Container ( $icoarr [ 'oid' ], $action . '2' ) && ! ( $_G [ 'uid' ] == $folderinfo [ 'uid' ] && perm_check :: checkperm_Container ( $icoarr [ 'oid' ], $action . '1' ))) return array ( 'error' => lang ( 'has_no_privilege_file' ));
} else {
return array ( 'error' => lang ( 'has_no_privilege_file' ));
}
} else {
//判断是否具有上级删除权限
if ( ! perm_check :: checkperm_Container ( $icoarr [ 'pfid' ], $action . '2' ) && ! ( $_G [ 'uid' ] == $folderinfo [ 'uid' ] && perm_check :: checkperm_Container ( $icoarr [ 'pfid' ], $action . '1' ))) {
return array ( 'error' => lang ( 'has_no_privilege_file' ));
}
}
if ( count ( $resources )) {
foreach ( $resources as $v ) {
if ( ! perm_check :: checkperm ( $action , $v )) {
return array ( 'error' => lang ( 'has_no_privilege_file' ));
}
}
}
}
return array ( $icoarr [ 'oid' ], $ridnum , $fidnum , $fids , $rids );
}
//删除文件(移动文件到回收站)
public function recyle_by_rid ( $rid )
{
global $_G ;
$uid = $_G [ 'uid' ];
$rid = trim ( $rid );
$dels = array ();
//判断文件是否存在
if ( ! $infoarr = parent :: fetch ( $rid )) {
return false ;
}
$parentfid = $infoarr [ 'pfid' ]; //父级目录
$setarr = array (
'pfid' => - 1 ,
'isdelete' => 1 ,
'deldateline' => TIMESTAMP
);
$setarr1 = array (
'isdelete' => 1 ,
'deldateline' => TIMESTAMP
);
//如果删除的是文件夹
if ( $infoarr [ 'type' ] == 'folder' ) {
$result = self :: check_folder_perm ( $infoarr , 'delete' );
if ( $result [ 'error' ]) {
return array ( 'error' => $result [ 'error' ]);
} else {
list ( $currentfid , $ridnum , $fidnum , $fids , $rids ) = $result ;
}
if ( self :: update_by_rid ( $rid , $setarr )) {
$infoarr [ 'deldateline' ] = $setarr [ 'deldateline' ];
$infoarr [ 'isdelete' ] = $setarr [ 'isdelete' ];
//更改下级目录删除状态
if ( $ridnum ) self :: update_by_rid ( $rids , $setarr1 );
//查询回收站是否有相同数据,如果有合并回收站数据
if ( $recyledata = C :: t ( 'resources_recyle' ) -> fetch_by_rid ( $infoarr [ 'rid' ])) {
if ( C :: t ( 'folder' ) -> update ( $currentfid , $setarr )) {
if ( $fidnum ) DB :: update ( 'folder' , $setarr1 , 'fid in(' . dimplode ( $rfids ) . ')' );
DB :: update ( 'resources_recyle' , array ( 'deldateline' => $infoarr [ 'deldateline' ], 'uid' => $uid ), array ( 'id' => $recyledata [ 'id' ]));
} else {
if ( $ridnum ) DB :: update ( $this -> table , array ( 'isdelete' => 0 , 'deldateline' => 0 , 'pfid' => $infoarr [ 'pfid' ]), 'rid in(' . dimplode ( $rids ) . ')' );
self :: update_by_rid ( $rid , array ( 'isdelete' => 0 , 'deldateline' => 0 , 'pfid' => $infoarr [ 'pfid' ]));
return array ( 'error' => lang ( 'do_failed' ));
}
} else {
if ( C :: t ( 'folder' ) -> update ( $currentfid , $setarr )) {
if ( $fidnum ) DB :: update ( 'folder' , $setarr1 , 'fid in(' . dimplode ( $rfids ) . ')' );
C :: t ( 'resources_recyle' ) -> insert_data ( $infoarr );
} else {
if ( $ridnum ) self :: update_by_rid ( $rids , array ( 'isdelete' => 0 , 'deldateline' => 0 , 'pfid' => $infoarr [ 'pfid' ]));
self :: update_by_rid ( $rid , array ( 'isdelete' => 0 , 'deldateline' => 0 , 'pfid' => $infoarr [ 'pfid' ]));
return array ( 'error' => lang ( 'do_failed' ));
}
}
}
$dels [] = $rid ;
} else {
//文件权限判断
if ( ! perm_check :: checkperm_Container ( $parentfid , 'delete2' ) && ! ( $uid == $infoarr [ 'uid' ] && perm_check :: checkperm_Container ( $parentfid , 'delete1' ))) {
return array ( 'error' => lang ( 'no_privilege' ));
}
if ( DB :: result_first ( " select count(*) from %t where rid = %s " , array ( 'resources_recyle' , $rid ))) {
return array ( 'error' => lang ( 'file_isdelete_in_recycle' ));
}
//执行删除
if ( self :: update_by_rid ( $rid , $setarr )) {
//修改分享表状态
C :: t ( 'shares' ) -> change_by_rid ( $rid );
$infoarr [ 'deldateline' ] = $setarr [ 'deldateline' ];
$infoarr [ 'isdelete' ] = $setarr [ 'isdelete' ];
//数据放入回收站表
if ( C :: t ( 'resources_recyle' ) -> insert_data ( $infoarr )) {
$dels [] = $rid ;
} else { //放入回收站失败处理
self :: update_by_rid ( $rid , array ( 'isdelete' => 0 , 'deldateline' => 0 , 'pfid' => $infoarr [ 'pfid' ]));
}
}
}
return $dels ;
}
/* 返回1, 正常删除, 需删除附属表数据, 返回2, 非删除状态内容, 只删除回收站表数据, 返回3删除失败
* $force => 是否彻底删除 ( 即是否强制删除非删除状态文件 )
* */
public function deletesourcedata ( $resource , $force = false )
{
$type = $resource [ 'type' ];
$oid = $resource [ 'oid' ];
switch ( $type ) {
case 'folder' :
return C :: t ( 'folder' ) -> delete_by_fid ( $oid , $force );
case 'link' :
C :: t ( 'collect' ) -> delete_by_cid ( $oid );
return 1 ;
case 'app' :
return 1 ;
case 'user' :
return 1 ;
case 'pan' :
return 1 ;
case 'storage' :
return 1 ;
default :
if ( ! $resource [ 'vid' ]) {
C :: t ( 'attachment' ) -> delete_by_aid ( $resource [ 'aid' ], - 1 );
}
return 1 ;
}
}
public function delete_by_rid ( $rid , $force = false )
{ //删除图标
global $_G ;
$cachekey = 'resourcesdata_' . $rid ;
$data = self :: getsourcedata ( $rid );
$status = self :: deletesourcedata ( $data , $force );
//删除相关数据
if ( $status == 1 ) {
//刪除属性表数据
C :: t ( 'resources_attr' ) -> delete_by_rid ( $rid );
//删除事件表数据
C :: t ( 'resources_event' ) -> delete_by_rid ( $rid );
//删除标签表数据
C :: t ( 'resources_tag' ) -> delete_by_rid ( $rid );
//删除回收站数据
C :: t ( 'resources_recyle' ) -> delete_by_rid ( $rid );
//删除版本表数据
if ( $data [ 'vid' ]) {
C :: t ( 'resources_version' ) -> delete_by_rid ( $rid );
}
//删除收藏表数据
C :: t ( 'resources_collect' ) -> delete_by_rid ( $rid );
//删除统计表数据
C :: t ( 'resources_statis' ) -> delete_by_rid ( $rid );
//删除resources表数据
if ( parent :: delete ( $rid )) {
//记录删除事件
$hash = C :: t ( 'resources_event' ) -> get_showtpl_hash_by_gpfid ( $data [ 'pfid' ], $data [ 'gid' ]);
$eventdata = array ( 'username' => $_G [ 'username' ], 'position' => $data [ 'relpath' ], 'filename' => $data [ 'name' ], 'hash' => $hash );
C :: t ( 'resources_event' ) -> addevent_by_pfid ( $data [ 'pfid' ], 'finallydel_file' , 'finallydelete' , $eventdata , $data [ 'gid' ], $rid , $data [ 'name' ]);
$this -> clear_cache ( $cachekey );
return true ;
} else {
return false ;
}
} elseif ( $status == 2 ) {
$this -> clear_cache ( $rid );
$this -> clear_cache ( $cachekey );
//删除回收站数据
C :: t ( 'resources_recyle' ) -> delete_by_rid ( $rid );
} else {
return false ;
}
}
public function getsourcedata ( $rid )
{
//查询索引表数据
$resourcedata = array ();
if ( ! $resourcedata = self :: fetch ( $rid )) {
return array ();
}
//查询文件夹信息
if ( $resourcedata [ 'type' ] == 'folder' ) {
$folder = C :: t ( 'folder' ) -> fetch_by_fid ( $resourcedata [ 'oid' ]);
$resourcedata = array_merge ( $resourcedata , $folder );
$folderattr = C :: t ( 'folder_attr' ) -> fetch_all_folder_setting_by_fid ( $resourcedata [ 'oid' ]);
$resourcedata = array_merge ( $resourcedata , $folderattr );
}
//查询文件路径
if ( $path = C :: t ( 'resources_path' ) -> fetch_pathby_pfid ( $resourcedata [ 'pfid' ])) {
$resourcedata [ 'path' ] = ( $resourcedata [ 'type' ] == 'folder' ) ? $path . $resourcedata [ 'name' ] . '/' : $path . $resourcedata [ 'name' ];
}
$vdata = array ();
if ( $resourcedata [ 'vid' ] > 0 ) {
$vdata = C :: t ( 'resources_version' ) -> fetch ( $resourcedata [ 'vid' ]);
}
$versiondata = array ();
if ( $vdata ) {
$versiondata = array (
'dateline' => $vdata [ 'dateline' ], //文件修改时间
);
}
//查询文件属性信息
$attrdata = C :: t ( 'resources_attr' ) -> fetch_by_rid ( $rid , $resourcedata [ 'vid' ]);
$resourcedata = array_merge ( $resourcedata , $attrdata );
$resourcedata = array_merge ( $resourcedata , $versiondata );
if ( $resourcedata [ 'aid' ]) { //查询附件数据
$attachment = C :: t ( 'attachment' ) -> fetch ( $resourcedata [ 'aid' ]);
//附件表上传时间和文件创建时间字段名称冲突
$attachment [ 'olddateline' ] = $attachment [ 'dateline' ];
unset ( $attachment [ 'dateline' ]);
$resourcedata = array_merge ( $resourcedata , $attachment );
}
return $resourcedata ;
}
public function fetch_by_rid ( $rid , $force_from_db = false )
{ //返回一条数据同时加载资源表数据
global $_G ;
$cachekey = 'resourcesdata_' . $rid ;
if ( $data = $this -> fetch_cache ( $cachekey )) {
return $data ;
}
$data = array ();
if ( ! $data = self :: getsourcedata ( $rid )) {
return array ();
}
$data [ 'size' ] = isset ( $data [ 'size' ]) ? $data [ 'size' ] : 0 ;
if ( $data [ 'type' ] == 'image' ) {
$data [ 'img' ] = DZZSCRIPT . '?mod=io&op=thumbnail&size=small&path=' . dzzencode ( 'attach::' . $data [ 'aid' ]);
$data [ 'url' ] = DZZSCRIPT . '?mod=io&op=thumbnail&size=large&path=' . dzzencode ( 'attach::' . $data [ 'aid' ]);
} elseif ( $data [ 'type' ] == 'attach' || $data [ 'type' ] == 'document' ) {
$data [ 'img' ] = isset ( $data [ 'img' ]) ? $data [ 'img' ] : geticonfromext ( $data [ 'ext' ], $data [ 'type' ]);
$data [ 'url' ] = DZZSCRIPT . '?mod=io&op=getStream&path=' . dzzencode ( 'attach::' . $data [ 'aid' ]);
} elseif ( $data [ 'type' ] == 'shortcut' ) {
$data [ 'ttype' ] = $data [ 'tdata' ][ 'type' ];
$data [ 'ext' ] = $data [ 'tdata' ][ 'ext' ];
} elseif ( $data [ 'type' ] == 'dzzdoc' ) {
$data [ 'url' ] = DZZSCRIPT . '?mod=document&icoid=' . dzzencode ( 'attach::' . $data [ 'aid' ]);
$data [ 'img' ] = isset ( $data [ 'img' ]) ? $data [ 'img' ] : geticonfromext ( $data [ 'ext' ], $data [ 'type' ]);
} elseif ( $data [ 'type' ] == 'folder' ) {
//$contaions = self::get_contains_by_fid($data['oid'], true);
//$data['contaions'] = $contaions;
$relativepath = str_replace ( ':' , '' , strrchr ( $data [ 'path' ], ':' ));
$data [ 'position' ] = substr ( $relativepath , 0 , strlen ( $relativepath ) - 1 );
$data [ 'fsize' ] = 0 ; //formatsize($contaions['size']);
// $data['ffsize'] = lang('property_info_size', array('fsize' => formatsize($contaions['size']), 'size' => $contaions['size']));
// $data['contain'] = lang('property_info_contain', array('filenum' => $contaions['contain'][0], 'foldernum' => $contaions['contain'][1]));
$data [ 'img' ] = $data [ 'img' ] ? $data [ 'img' ] : 'dzz/images/default/system/' . $data [ 'flag' ] . '.png' ;
} else {
$data [ 'img' ] = isset ( $data [ 'img' ]) ? $data [ 'img' ] : geticonfromext ( $data [ 'ext' ], $data [ 'type' ]);
}
if ( $data [ 'appid' ]) {
$imgs = C :: t ( 'app_market' ) -> fetch_appico_by_appid ( $data [ 'appid' ]);
$data [ 'img' ] = ( $imgs ) ? 'data/attachment/' . $imgs : geticonfromext ( $data [ 'ext' ], $data [ 'type' ]);
}
if ( empty ( $data [ 'name' ])) $data [ 'name' ] = $data [ 'title' ];
$data [ 'url' ] = isset ( $data [ 'url' ]) ? replace_canshu ( $data [ 'url' ]) : '' ;
$data [ 'ftype' ] = getFileTypeName ( $data [ 'type' ], $data [ 'ext' ]);
$data [ 'fdateline' ] = dgmdate ( $data [ 'dateline' ], 'Y-m-d H:i:s' );
$data [ 'fsize' ] = formatsize ( $data [ 'size' ]);
$data [ 'ffsize' ] = lang ( 'property_info_size' , array ( 'fsize' => formatsize ( $data [ 'size' ]), 'size' => $data [ 'size' ]));
$data [ 'relativepath' ] = $data [ 'path' ] ? $data [ 'path' ] : '' ;
$data [ 'relpath' ] = dirname ( preg_replace ( '/dzz:(.+?):/' , '' , $data [ 'relativepath' ])) . '/' ;
$data [ 'path' ] = $data [ 'rid' ];
$data [ 'bz' ] = '' ;
$data [ 'collect' ] = C :: t ( 'resources_collect' ) -> fetch_by_rid ( $rid );
if ( $data [ 'remote' ] > 1 ) $data [ 'rbz' ] = io_remote :: getBzByRemoteid ( $data [ 'remote' ]);
//增加安全相关的路径
$data [ 'dpath' ] = dzzencode ( $data [ 'path' ]);
$data [ 'apath' ] = $data [ 'aid' ] ? dzzencode ( 'attach::' . $data [ 'aid' ]) : $data [ 'dpath' ];
if ( ! $data [ 'sperm' ]) $data [ 'sperm' ] = perm_FileSPerm :: typePower ( $data [ 'type' ], $data [ 'ext' ]);
Hook :: listen ( 'filter_resource_rid' , $data ); //数据过滤挂载点
$this -> store_cache ( $cachekey , $data );
return $data ;
}
/* //查询群组id
public function fetch_gid_by_rid ( $rid )
{
return DB :: result_first ( " select gid from %t where rid = %d " , array ( $this -> _table , $rid ));
} */
/* //查询多个文件右侧信息
public function fetch_rightinfo_by_rid ( $rids )
{
if ( ! is_array ( $rids )) $rids = ( array ) $rids ;
$fileinfo = array ();
$contains = array ( 'size' => 0 , 'contain' => array ( 0 , 0 ));
foreach ( DB :: fetch_all ( " select * from %t where rid in(%n) " , array ( $this -> _table , $rids )) as $value ) {
$contains [ 'size' ] += $value [ 'size' ];
if ( $value [ 'type' ] == 'folder' ) {
$contains [ 'contain' ][ 1 ] += 1 ;
$containchild = '' ;
$containchild = $this -> get_contains_by_fid ( $value [ 'oid' ], true );
if ( ! empty ( $containchild )) {
$contains [ 'contain' ][ 1 ] += $containchild [ 'contain' ][ 1 ];
$contains [ 'contain' ][ 0 ] += $containchild [ 'contain' ][ 0 ];
$contains [ 'size' ] += $containchild [ 'size' ];
}
} else {
$contains [ 'contain' ][ 0 ] += 1 ;
}
if ( ! isset ( $fileinfo [ 'path' ])) {
$path = C :: t ( 'resources_path' ) -> fetch_pathby_pfid ( $value [ 'pfid' ]);
$fileinfo [ 'position' ] = preg_replace ( '/dzz:(.+?):/' , '' , $path );
}
}
$fileinfo [ 'ffsize' ] = lang ( 'property_info_size' , array ( 'fsize' => formatsize ( $contains [ 'size' ]), 'size' => $contains [ 'size' ]));
$fileinfo [ 'contain' ] = lang ( 'property_info_contain' , array ( 'filenum' => $contains [ 'contain' ][ 0 ], 'foldernum' => $contains [ 'contain' ][ 1 ]));
$fileinfo [ 'filenum' ] = count ( $rids );
return $fileinfo ;
} */
//查询目录文件数,$getversion =>是否获取版本数据
public function get_contains_by_fid ( $fid , $getversion = true )
{
$contains = array ( 'size' => 0 , 'contain' => array ( 0 , 0 ));
$pfids = C :: t ( 'resources_path' ) -> fetch_folder_containfid_by_pfid ( $fid );
foreach ( DB :: fetch_all ( " select r.rid,r.vid,r.size as primarysize,r.type,r.pfid,v.size from %t r
left join % t v on r . rid = v . rid where r . pfid in ( % n ) and r . isdelete < 1 " , array( $this->_table , 'resources_version', $pfids )) as $v ) {
if ( ! isset ( $resluts [ $v [ 'rid' ]])) {
$resluts [ $v [ 'rid' ]] = $v ;
} else {
$resluts [ $v [ 'rid' ]][ 'size' ] += intval ( $v [ 'size' ]);
}
}
foreach ( $resluts as $value ) {
if ( $getversion ) {
$contains [ 'size' ] += ( $value [ 'size' ] > 0 ) ? $value [ 'size' ] : $value [ 'primarysize' ];
} else {
$contains [ 'size' ] += $value [ 'primarysize' ];
}
if ( $value [ 'type' ] == 'folder' && $fid != $value [ 'oid' ]) {
$contains [ 'contain' ][ 1 ] += 1 ;
} else {
$contains [ 'contain' ][ 0 ] += 1 ;
}
}
return $contains ;
}
//查询文件对应的rid
public function fetch_rid_by_fid ( $fid )
{
return DB :: result_first ( " select rid from %t where oid = %d and `type` = 'folder' " , array ( $this -> _table , $fid ));
}
/* //查询文件夹对应的fid
public function fetch_fid_by_rid ( $rid )
{
return DB :: result_first ( " select oid from %t where rid = %s and `type` = %s " , array ( $this -> _table , $rid , 'folder' ));
} */
//获取文件夹基本信息
public function get_folderinfo_by_fid ( $fid )
{
if ( ! $folderinfo = C :: t ( 'folder' ) -> fetch ( $fid )) return false ;
/* $contaions = self :: get_contains_by_fid ( $fid , true );
$folderinfo [ 'ffsize' ] = lang ( 'property_info_size' , array ( 'fsize' => formatsize ( $contaions [ 'size' ]), 'size' => $contaions [ 'size' ]));
$folderinfo [ 'contain' ] = lang ( 'property_info_contain' , array ( 'filenum' => $contaions [ 'contain' ][ 0 ], 'foldernum' => $contaions [ 'contain' ][ 1 ])); */
$path = C :: t ( 'resources_path' ) -> fetch_pathby_pfid ( $fid );
$folderinfo [ 'position' ] = preg_replace ( '/dzz:(.+?):/' , '' , $path );
$folderinfo [ 'fdateline' ] = dgmdate ( $folderinfo [ 'dateline' ], 'Y-m-d H:i:s' );
$folderinfo [ 'isgroup' ] = ( $folderinfo [ 'flag' ] == 'organization' ) ? true : false ;
return $folderinfo ;
}
//查詢文件夹下文件信息
/* public function fetch_folderinfo_by_pfid ( $fid )
{
global $_G ;
if ( $fid ) {
if ( $folder = C :: t ( 'folder' ) -> fetch ( $fid )) {
$where1 = array ();
if ( $folder [ 'gid' ] > 0 ) {
$folder [ 'perm' ] = perm_check :: getPerm ( $folder [ 'fid' ]);
if ( $folder [ 'perm' ] > 0 ) {
if ( perm_binPerm :: havePower ( 'read2' , $folder [ 'perm' ])) {
$where1 [] = " 1 " ;
} elseif ( perm_binPerm :: havePower ( 'read1' , $folder [ 'perm' ])) {
$where1 [] = " uid=' { $_G [ uid ] } ' " ;
}
}
$where1 = array_filter ( $where1 );
if ( ! empty ( $where1 )) $temp [] = " ( " . implode ( ' OR ' , $where1 ) . " ) " ;
else $temp [] = " 0 " ;
} else {
$temp [] = " uid=' { $_G [ uid ] } ' " ;
}
$where [] = '(' . implode ( ' and ' , $temp ) . ')' ;
unset ( $temp );
}
$wheresql = " " ;
if ( $where ) $wheresql .= implode ( ' AND ' , $where );
return DB :: fetch_all ( " select * from %t where pfid = %d and isdelete = 0 and $wheresql " , array ( $this -> _table , $fid ));
}
} */
public function fetch_all_by_pfid ( $pfid , $conditions = array (), $limit = 0 , $orderby = '' , $order = '' , $start = 0 , $count = false )
{
global $_G ;
$limitsql = $limit ? DB :: limit ( $start , $limit ) : '' ;
$data = array ();
$wheresql = ' 1 ' ;
$where = array ();
$para = array ( $this -> _table );
$where [] = ' isdelete < 1 ' ;
$mustdition = '' ;
//解析搜索条件
if ( $conditions && is_string ( $conditions )) { //字符串条件语句
$wheresql .= $conditions ;
} elseif ( is_array ( $conditions )) {
foreach ( $conditions as $k => $v ) {
if ( ! is_array ( $v )) {
if ( $k == 'mustdition' ) {
$mustdition = $v ;
} else {
$connect = 'and' ;
$wheresql .= $connect . ' `' . $k . " ` = ' " . $v . " ' " ;
}
} else {
$relative = isset ( $v [ 1 ]) ? $v [ 1 ] : '=' ;
$connect = isset ( $v [ 2 ]) ? $v [ 2 ] : 'and' ;
if ( $relative == 'in' ) {
$wheresql .= $connect . " ` " . $k . " ` " . $relative . " ( " . dimplode ( $v [ 0 ]) . " ) " ;
} elseif ( $relative == 'not in' ) {
$wheresql .= $connect . " ` " . $k . " ` " . $relative . " ( " . dimplode ( $v [ 0 ]) . " ) " ;
} elseif ( $relative == 'stringsql' ) {
$wheresql .= $connect . " " . $v [ 0 ] . " " ;
} elseif ( $relative == 'like' ) {
$wheresql .= $connect . " " . $k . " like %s " ;
$para [] = '%' . $v [ 0 ] . '%' ;
} else {
$wheresql .= $connect . " ` " . $k . " ` " . $relative . " ' " . $v [ 0 ] . " ' " ;
}
}
}
}
if ( is_array ( $pfid )) {
$arr = array ();
foreach ( $pfid as $fid ) {
$temp = array ( 'pfid = %d' );
$para [] = $fid ;
if ( $folder = C :: t ( 'folder' ) -> fetch ( $fid )) {
$where1 = array ();
if ( $folder [ 'gid' ] > 0 ) {
$folder [ 'perm' ] = perm_check :: getPerm ( $folder [ 'fid' ]);
if ( $folder [ 'perm' ] > 0 ) {
if ( perm_binPerm :: havePower ( 'read2' , $folder [ 'perm' ])) {
$where1 [] = " 1 " ;
} elseif ( perm_binPerm :: havePower ( 'read1' , $folder [ 'perm' ])) {
$where1 [] = " uid=' { $_G [ uid ] } ' " ;
}
}
$where1 = array_filter ( $where1 );
if ( ! empty ( $where1 )) $temp [] = " ( " . implode ( ' OR ' , $where1 ) . " ) " ;
else $temp [] = " 0 " ;
} else {
$temp [] = " uid=' { $_G [ uid ] } ' " ;
}
}
$arr [] = '(' . implode ( ' and ' , $temp ) . ')' ;
unset ( $temp );
}
if ( $arr ) $where [] = '(' . implode ( ' OR ' , $arr ) . ')' ;
} elseif ( $pfid ) {
$temp = array ( 'pfid= %d' );
$para [] = $pfid ;
if ( $folder = C :: t ( 'folder' ) -> fetch ( $pfid )) {
$where1 = array ();
if ( $folder [ 'gid' ] > 0 ) {
$folder [ 'perm' ] = perm_check :: getPerm ( $folder [ 'fid' ]);
if ( $folder [ 'perm' ] > 0 ) {
if ( perm_binPerm :: havePower ( 'read2' , $folder [ 'perm' ])) {
$where1 [] = " 1 = 1 " ;
} elseif ( perm_binPerm :: havePower ( 'read1' , $folder [ 'perm' ])) {
$where1 [] = " uid=' { $_G [ uid ] } ' " ;
}
}
$where1 = array_filter ( $where1 );
if ( $where1 ) $temp [] = " ( " . implode ( ' OR ' , $where1 ) . " ) " ;
else $temp [] = " 0 " ;
} else {
$temp [] = " uid=' { $_G [ uid ] } ' " ;
}
}
$where [] = '(' . implode ( ' and ' , $temp ) . ')' ;
unset ( $temp );
}
if ( $mustdition ) $wheresql = '(' . $wheresql . $mustdition . ')' ;
if ( $where ) $wheresql .= ' and ' . implode ( ' AND ' , $where );
if ( $count ) return DB :: result_first ( " SELECT COUNT(*) FROM %t $wheresql " , $para );
$ordersql = '' ;
if ( is_array ( $orderby )) {
foreach ( $orderby as $key => $value ) {
$orderby [ $key ] = $value . ' ' . $order ;
}
$ordersql = ' ORDER BY ' . implode ( ',' , $orderby );
} elseif ( $orderby ) {
if ( $orderby == 'name' ) {
$ordersql = " ORDER BY convert(name,UNSIGNED) " . $order .
" ,SUBSTRING_INDEX(name,'-',1) " . $order . " ,convert(replace(replace(SUBSTRING_INDEX(name,'-',2),SUBSTRING_INDEX(name,'-',1),''),'-','') , UNSIGNED) " . $order .
" ,convert(replace(replace(SUBSTRING_INDEX(name,'-',3),SUBSTRING_INDEX(name,'-',2),''),'-','') , UNSIGNED) " . $order ;
} else {
$ordersql = ' ORDER BY ' . $orderby . ' ' . $order ;
}
}
foreach ( DB :: fetch_all ( " SELECT rid FROM %t where $wheresql $ordersql $limitsql " , $para ) as $value ) {
if ( $arr = self :: fetch_by_rid ( $value [ 'rid' ])) $data [ $value [ 'rid' ]] = $arr ;
}
return $data ;
}
//查询群组下的文件、文件夹信息
/* public function fetch_all_by_gid ( $gid )
{
$gid = intval ( $gid );
if ( $folderinfo = C :: t ( 'folder' ) -> fetch_folderinfo_by_gid ( $gid )) {
return self :: fetch_by_pfid ( $folderinfo [ 'fid' ]);
}
} */
//查询目录下所有文件基本信息
public function fetch_basicinfo_by_pfid ( $pfid )
{
$pfid = intval ( $pfid );
return DB :: fetch_all ( " select * from %t where pfid = %d " , array ( $this -> _table , $pfid ));
}
//查询目录下的文件信息
public function fetch_by_pfid ( $pfid , $uid = '' , $checkperm = true )
{
$currentuid = getglobal ( 'uid' );
$pfid = intval ( $pfid );
$where = " pfid = %d " ;
$param = array ( $this -> _table , $pfid );
$datainfo = array ();
if ( $uid ) {
$where .= " and uid = %d " ;
$param [] = $uid ;
}
$path = C :: t ( 'resources_path' ) -> fetch_pathby_pfid ( $pfid );
foreach ( DB :: fetch_all ( " select * from %t where $where and isdelete < 1 order by dateline desc " , $param ) as $k => $value ) {
if ( $value [ 'type' ] == 'folder' ) {
$value [ 'path' ] = $path . $value [ 'name' ] . '/' ; //路径
if ( $checkperm ) {
if ( ! perm_check :: checkperm_Container ( $value [ 'oid' ], 'read2' ) &&
! ( $value [ 'uid' ] == $currentuid && perm_check :: checkperm_Container ( $value [ 'oid' ], 'read1' ))
) {
continue ;
}
}
} else {
if ( $checkperm ) {
$value [ 'path' ] = $path . $value [ 'name' ]; //路径
if ( ! perm_check :: checkperm_Container ( $value [ 'oid' ], 'read2' ) &&
! ( $value [ 'uid' ] == $currentuid ) && perm_check :: checkperm_Container ( $value [ 'oid' ], 'read1' )
) {
continue ;
}
}
}
$data = C :: t ( 'resources_attr' ) -> fetch_by_rid ( $value [ 'rid' ], $value [ 'vid' ]);
$data [ 'collect' ] = C :: t ( 'resources_collect' ) -> fetch_by_rid ( $value [ 'rid' ]);
$datainfo [ $k ] = $value ;
$datainfo [ $k ] = array_merge ( $datainfo [ $k ], $data );
if ( ! isset ( $datainfo [ $k ][ 'img' ])) {
if ( $datainfo [ $k ][ 'type' ] == 'folder' ) {
$datainfo [ $k ][ 'img' ] = './dzz/images/extimg/folder.png' ;
} elseif ( $datainfo [ $k ][ 'type' ] == 'image' ) {
$datainfo [ $k ][ 'img' ] = DZZSCRIPT . '?mod=io&op=thumbnail&size=small&path=' . dzzencode ( 'attach::' . $datainfo [ $k ][ 'aid' ]);
} else {
$datainfo [ $k ][ 'img' ] = './dzz/images/extimg/' . $datainfo [ $k ][ 'ext' ] . '.png' ;
}
}
$datainfo [ $k ][ 'taginfo' ] = C :: t ( 'resources_tag' ) -> fetch_tag_by_rid ( $value [ 'rid' ]);
$datainfo [ $k ][ 'dpath' ] = dzzencode ( $value [ 'rid' ]);
$datainfo [ $k ][ 'fsize' ] = formatsize ( $value [ 'size' ]);
}
return $datainfo ;
}
//通过rid更新数据
public function update_by_rid ( $rid , $setarr )
{
if ( ! is_array ( $rid )) $rid = ( array ) $rid ;
if ( parent :: update ( $rid , $setarr )) {
foreach ( $rid as $v ) {
$cachekey = 'resourcesdata_' . $v ;
$this -> clear_cache ( $cachekey );
}
}
return true ;
}
//查询某目录下的所有文件夹
public function fetch_folder_by_pfid ( $fid , $numselect = false )
{
return DB :: fetch_all ( " select * from %t where pfid = %d and `type` = %s and isdelete < 1 " , array ( $this -> _table , $fid , 'folder' ));
}
public function fetch_folder_num_by_pfid ( $fid )
{
return DB :: result_first ( " select count(*) from %t where pfid = %d and `type` = %s and deldateline < 1 " , array ( $this -> _table , $fid , 'folder' ));
}
//通过rid获取属性信息
public function get_property_by_rid ( $rids , $contains = true )
{
global $_G ;
$uid = $_G [ 'uid' ];
$wheresql = " where r.rid in(%n) " ;
$param = array ( $this -> _table , 'folder' , 'resources_path' , $rids );
if ( ! is_array ( $rids )) $rids = ( array ) $rids ;
if ( count ( $rids ) > 1 ) {
//获取文件基本信息
$fileinfos = DB :: fetch_all ( " select r.*,f.perm_inherit,p.path from %t r left join %t f on r.pfid = f.fid left join %t p on p.fid = r.pfid $wheresql " , $param );
if ( ! $fileinfos ) {
return array ( 'error' => lang ( 'no_privilege' ));
}
$fileinfo = array ();
$tmpinfo = array ();
$infos = array ();
foreach ( $fileinfos as $v ) {
$infos [ $v [ 'rid' ]] = $v ;
$tmpinfo [ 'rids' ][] = $v [ 'rid' ];
$tmpinfo [ 'names' ][] = $v [ 'name' ];
$tmpinfo [ 'pfid' ][] = $v [ 'pfid' ];
$tmpinfo [ 'ext' ][] = ( $v [ 'ext' ]) ? $v [ 'ext' ] : $v [ 'type' ];
$tmpinfo [ 'type' ][] = $v [ 'type' ];
$tmpinfo [ 'username' ][] = $v [ 'username' ];
$tnpinfo [ 'hascontain' ][ $v [ 'rid' ]] = ( $v [ 'type' ] == 'folder' ) ? 1 : 0 ;
$tmpinfo [ 'realpath' ][] = $v [ 'path' ];
}
$fileinfo [ 'ismulti' ] = count ( $rids ); //是否是多选
$fileinfo [ 'name' ] = getstr ( implode ( ',' , array_unique ( $tmpinfo [ 'names' ])), 60 );
//判断文件归属
$fileinfo [ 'username' ] = ( count ( array_unique ( $tmpinfo [ 'username' ])) > 1 ) ? lang ( 'more_member_owner' ) : $tmpinfo [ 'username' ][ 0 ];
//判断是否在同一文件夹下
if ( count ( array_unique ( $tmpinfo [ 'pfid' ])) > 1 ) {
$fileinfo [ 'realpath' ] = lang ( 'more_folder_position' );
$fileinfo [ 'rid' ] = implode ( ',' , $tmpinfo [ 'rids' ]);
} else {
$fileinfo [ 'realpath' ] = lang ( 'all_positioned' ) . preg_replace ( '/dzz:(.+?):/' , '' , $tmpinfo [ 'realpath' ][ 0 ]);
$fileinfo [ 'rid' ] = implode ( ',' , $tmpinfo [ 'rids' ]);
}
//判断文件类型是否相同
$judgesecond = false ;
if ( count ( array_unique ( $tmpinfo [ 'ext' ])) > 1 ) {
$fileinfo [ 'type' ] = lang ( 'more_file_type' );
$judgesecond = true ;
} elseif ( $tmpinfo [ 'ext' ][ 0 ] == 'folder' ) {
$fileinfo [ 'type' ] = lang ( '均为文件夹' );
} else {
$fileinfo [ 'type' ] = lang ( 'louis_vuitton' ) . $tmpinfo [ 'ext' ][ 0 ] . lang ( 'type_of_file' );
}
if ( in_array ( '' , $tmpinfo [ 'ext' ]) || $judgesecond ) {
if ( count ( array_unique ( $tmpinfo [ 'type' ])) > 1 ) {
$fileinfo [ 'type' ] = lang ( 'more_file_type' );
} else {
$fileinfo [ 'type' ] = lang ( 'louis_vuitton' ) . $tmpinfo [ 'type' ][ 0 ] . lang ( 'typename_attach' );
}
}
if ( $contains ) {
//文件大小和文件个数信息
$tmpinfo [ 'contains' ] = array ( 'size' => 0 , 'contain' => array ( 0 , 0 ));
foreach ( $tnpinfo [ 'hascontain' ] as $k => $v ) {
if ( $v ) {
$tmpinfo [ 'contains' ][ 'contain' ][ 1 ] += 1 ;
$childcontains = self :: get_contains_by_fid ( $infos [ $k ][ 'oid' ], true );
$tmpinfo [ 'contains' ][ 'contain' ][ 0 ] += $childcontains [ 'contain' ][ 0 ];
$tmpinfo [ 'contains' ][ 'contain' ][ 1 ] += $childcontains [ 'contain' ][ 1 ];
$tmpinfo [ 'contains' ][ 'size' ] += $childcontains [ 'size' ];
} else {
$tmpinfo [ 'contains' ][ 'contain' ][ 0 ] += 1 ;
$tmpinfo [ 'contains' ][ 'size' ] += $infos [ $k ][ 'size' ];
}
}
$fileinfo [ 'fsize' ] = formatsize ( $tmpinfo [ 'contains' ][ 'size' ]);
$fileinfo [ 'ffsize' ] = lang ( 'property_info_size' , array ( 'fsize' => formatsize ( $tmpinfo [ 'contains' ][ 'size' ]), 'size' => $tmpinfo [ 'contains' ][ 'size' ]));
$fileinfo [ 'contain' ] = lang ( 'property_info_contain' , array ( 'filenum' => $tmpinfo [ 'contains' ][ 'contain' ][ 0 ], 'foldernum' => $tmpinfo [ 'contains' ][ 'contain' ][ 1 ]));
}
$fileinfo [ 'img' ] = self :: get_icosinfo_by_rid ( $fileinfo [ 'rid' ]);
unset ( $tmpinfo );
} else { //单个文件信息
//文件基本信息
$fileinfo = DB :: fetch_first ( " select r.*,f.perm_inherit,p.path from %t r
left join % t f on r . pfid = f . fid left join % t p on r . pfid = p . fid $wheresql " , $param );
if ( ! $fileinfo ) {
return array ( 'error' => lang ( 'no_privilege' ));
}
//文件统计信息
$filestatis = C :: t ( 'resources_statis' ) -> fetch_by_rid ( $rids [ 0 ]);
//位置信息
$fileinfo [ 'realpath' ] = preg_replace ( '/dzz:(.+?):/' , '' , $fileinfo [ 'path' ]);
//统计信息
$fileinfo [ 'opendateline' ] = ( $filestatis [ 'opendateline' ]) ? dgmdate ( $filestatis [ 'opendateline' ], 'Y-m-d H:i:s' ) : dgmdate ( $fileinfo [ 'dateline' ], 'Y-m-d H:i:s' );
$fileinfo [ 'editdateline' ] = ( $filestatis [ 'editdateline' ]) ? dgmdate ( $filestatis [ 'editdateline' ], 'Y-m-d H:i:s' ) : dgmdate ( $fileinfo [ 'dateline' ], 'Y-m-d H:i:s' );
$fileinfo [ 'fdateline' ] = dgmdate ( $fileinfo [ 'dateline' ], 'Y-m-d H:i:s' );
//编辑权限信息
$fileinfo [ 'editperm' ] = 1 ;
if ( $fileinfo [ 'gid' ] > 0 ) {
$powerarr = perm_binPerm :: getPowerArr ();
if ( ! ( C :: t ( 'organization_admin' ) -> chk_memberperm ( $fileinfo [ 'gid' ])) && ! ( $uid == $fileinfo [ 'uid' ] && $fileinfo [ 'perm_inherit' ] & $powerarr [ 'edit1' ]) && ! ( $fileinfo [ 'perm_inherit' ] & $powerarr [ 'edit2' ])) {
$fileinfo [ 'editperm' ] = 0 ;
}
}
//文件图标信息
$fileinfo [ 'img' ] = self :: get_icosinfo_by_rid ( $fileinfo [ 'rid' ]);
if ( $fileinfo [ 'type' ] == 'folder' ) {
$fileinfo [ 'type' ] = '文件夹' ;
if ( $currentfolder = C :: t ( 'folder' ) -> fetch ( $fileinfo [ 'oid' ])) {
$fileinfo [ 'isgroup' ] = ( $currentfolder [ 'flag' ] == 'organization' ) ? true : false ;
}
} elseif ( $fileinfo [ 'ext' ]) {
$fileinfo [ 'type' ] = $fileinfo [ 'ext' ] . lang ( 'typename_attach' );
} else {
$fileinfo [ 'type' ] = lang ( 'undefined_file_type' );
}
if ( $contains ) {
//文件大小信息
if ( $fileinfo [ 'type' ] == 'folder' ) {
$contaions = self :: get_contains_by_fid ( $fileinfo [ 'oid' ], true );
$contaions [ 'contain' ][ 1 ] += 1 ;
$fileinfo [ 'fsize' ] = formatsize ( $contaions [ 'size' ]);
$fileinfo [ 'ffsize' ] = lang ( 'property_info_size' , array ( 'fsize' => formatsize ( $contaions [ 'size' ]), 'size' => $contaions [ 'size' ]));
$fileinfo [ 'contain' ] = lang ( 'property_info_contain' , array ( 'filenum' => $contaions [ 'contain' ][ 0 ], 'foldernum' => $contaions [ 'contain' ][ 1 ]));
} elseif ( $fileinfo [ 'ext' ]) {
$fileinfo [ 'fsize' ] = formatsize ( $fileinfo [ 'size' ]);
} else {
2023-01-14 21:17:15 +08:00
//获取文件基本信息
$fileinfos = DB :: fetch_all ( " select r.*,f.perm_inherit,p.path from %t r left join %t f on r.pfid = f.fid left join %t p on p.fid = r.pfid $wheresql " , $param );
2022-11-02 23:21:46 +08:00
$fileinfo = array ();
$tmpinfo = array ();
$infos = array ();
2023-01-14 21:17:15 +08:00
$fileinfo = DB :: fetch_first ( " select r.*,f.perm_inherit,p.path from %t r left join %t f on r.pfid = f.fid left join %t p on r.pfid = p.fid $wheresql " , $param );
if ( ! $fileinfo ) {
2022-11-02 23:21:46 +08:00
return array ( 'error' => lang ( 'no_privilege' ));
}
//位置信息
$fileinfo [ 'realpath' ] = preg_replace ( '/dzz:(.+?):/' , '' , $fileinfo [ 'path' ]);
2023-01-14 21:17:15 +08:00
//统计信息
2022-11-02 23:21:46 +08:00
$fileinfo [ 'opendateline' ] = ( $filestatis [ 'opendateline' ]) ? dgmdate ( $filestatis [ 'opendateline' ], 'Y-m-d H:i:s' ) : dgmdate ( $fileinfo [ 'dateline' ], 'Y-m-d H:i:s' );
$fileinfo [ 'editdateline' ] = ( $filestatis [ 'editdateline' ]) ? dgmdate ( $filestatis [ 'editdateline' ], 'Y-m-d H:i:s' ) : dgmdate ( $fileinfo [ 'dateline' ], 'Y-m-d H:i:s' );
$fileinfo [ 'fdateline' ] = dgmdate ( $fileinfo [ 'dateline' ], 'Y-m-d H:i:s' );
2023-01-14 21:17:15 +08:00
//编辑权限信息
2022-11-02 23:21:46 +08:00
$fileinfo [ 'editperm' ] = 1 ;
if ( $fileinfo [ 'gid' ] > 0 ) {
$powerarr = perm_binPerm :: getPowerArr ();
if ( ! ( C :: t ( 'organization_admin' ) -> chk_memberperm ( $fileinfo [ 'gid' ])) && ! ( $uid == $fileinfo [ 'uid' ] && $fileinfo [ 'perm_inherit' ] & $powerarr [ 'edit1' ]) && ! ( $fileinfo [ 'perm_inherit' ] & $powerarr [ 'edit2' ])) {
$fileinfo [ 'editperm' ] = 0 ;
}
}
foreach ( $fileinfos as $v ) {
$infos [ $v [ 'rid' ]] = $v ;
$tmpinfo [ 'rids' ][] = $v [ 'rid' ];
$tmpinfo [ 'names' ][] = $v [ 'name' ];
$tmpinfo [ 'pfid' ][] = $v [ 'pfid' ];
$tmpinfo [ 'ext' ][] = ( $v [ 'ext' ]) ? $v [ 'ext' ] : $v [ 'type' ];
$tmpinfo [ 'type' ][] = $v [ 'type' ];
$tmpinfo [ 'username' ][] = $v [ 'username' ];
$tnpinfo [ 'hascontain' ][ $v [ 'rid' ]] = ( $v [ 'type' ] == 'folder' ) ? 1 : 0 ;
$tmpinfo [ 'realpath' ][] = $v [ 'path' ];
}
$fileinfo [ 'name' ] = getstr ( implode ( ',' , array_unique ( $tmpinfo [ 'names' ])), 60 );
//判断文件归属
$fileinfo [ 'username' ] = ( count ( array_unique ( $tmpinfo [ 'username' ])) > 1 ) ? lang ( 'more_member_owner' ) : $tmpinfo [ 'username' ][ 0 ];
$fileinfo [ 'type' ] = lang ( 'type_folder' );
//文件大小和文件个数信息
$tmpinfo [ 'contains' ] = array ( 'size' => 0 , 'contain' => array ( 0 , 0 ));
foreach ( $tnpinfo [ 'hascontain' ] as $k => $v ) {
if ( $v ) {
$tmpinfo [ 'contains' ][ 'contain' ][ 1 ] += 1 ;
$childcontains = self :: get_contains_by_fid ( $infos [ $k ][ 'oid' ], true );
$tmpinfo [ 'contains' ][ 'contain' ][ 0 ] += $childcontains [ 'contain' ][ 0 ];
$tmpinfo [ 'contains' ][ 'contain' ][ 1 ] += $childcontains [ 'contain' ][ 1 ];
$tmpinfo [ 'contains' ][ 'size' ] += $childcontains [ 'size' ];
} else {
$tmpinfo [ 'contains' ][ 'contain' ][ 0 ] += 1 ;
$tmpinfo [ 'contains' ][ 'size' ] += $infos [ $k ][ 'size' ];
}
}
$fileinfo [ 'fsize' ] = formatsize ( $tmpinfo [ 'contains' ][ 'size' ]);
2023-01-14 21:17:15 +08:00
$fileinfo [ 'ffsize' ] = lang ( 'property_info_size' , array ( 'fsize' => formatsize ( $tmpinfo [ 'contains' ][ 'size' ]), 'size' => $tmpinfo [ 'contains' ][ 'size' ]));
2022-11-02 23:21:46 +08:00
$fileinfo [ 'contain' ] = lang ( 'property_info_contain' , array ( 'filenum' => $tmpinfo [ 'contains' ][ 'contain' ][ 0 ], 'foldernum' => $tmpinfo [ 'contains' ][ 'contain' ][ 1 ]));
2023-01-14 21:17:15 +08:00
$fileinfo [ 'img' ] = self :: get_icosinfo_by_rid ( $fileinfo [ 'rid' ]);
2022-11-02 23:21:46 +08:00
}
}
}
return $fileinfo ;
}
public function get_containsdata_by_rid ( $rids )
{
$fileinfo = array ();
if ( ! is_array ( $rids )) $rids = ( array ) $rids ;
if ( count ( $rids ) > 1 ) {
$fileinfos = DB :: fetch_all ( " select `type`,oid,rid,size from %t where rid in(%n) " , array ( $this -> _table , $rids ));
$fileinfo = array ();
$tmpinfo = array ();
$infos = array ();
foreach ( $fileinfos as $v ) {
$infos [ $v [ 'rid' ]] = $v ;
$tnpinfo [ 'hascontain' ][ $v [ 'rid' ]] = ( $v [ 'type' ] == 'folder' ) ? 1 : 0 ;
}
$tmpinfo [ 'contains' ] = array ( 'size' => 0 , 'contain' => array ( 0 , 0 ));
foreach ( $tnpinfo [ 'hascontain' ] as $k => $v ) {
if ( $v ) {
$tmpinfo [ 'contains' ][ 'contain' ][ 1 ] += 1 ;
$childcontains = self :: get_contains_by_fid ( $infos [ $k ][ 'oid' ], true );
$tmpinfo [ 'contains' ][ 'contain' ][ 0 ] += $childcontains [ 'contain' ][ 0 ];
$tmpinfo [ 'contains' ][ 'contain' ][ 1 ] += $childcontains [ 'contain' ][ 1 ];
$tmpinfo [ 'contains' ][ 'size' ] += $childcontains [ 'size' ];
} else {
$tmpinfo [ 'contains' ][ 'contain' ][ 0 ] += 1 ;
$tmpinfo [ 'contains' ][ 'size' ] += $infos [ $k ][ 'size' ];
}
}
$fileinfo [ 'fsize' ] = formatsize ( $tmpinfo [ 'contains' ][ 'size' ]);
$fileinfo [ 'ffsize' ] = lang ( 'property_info_size' , array ( 'fsize' => formatsize ( $tmpinfo [ 'contains' ][ 'size' ]), 'size' => $tmpinfo [ 'contains' ][ 'size' ]));
$fileinfo [ 'contain' ] = lang ( 'property_info_contain' , array ( 'filenum' => $tmpinfo [ 'contains' ][ 'contain' ][ 0 ], 'foldernum' => $tmpinfo [ 'contains' ][ 'contain' ][ 1 ]));
} else {
$fileinfo = $this -> fetch ( $rids [ 0 ]);
//文件类型和大小信息
if ( $fileinfo [ 'type' ] == 'folder' ) {
$contaions = self :: get_contains_by_fid ( $fileinfo [ 'oid' ], true );
$contaions [ 'contain' ][ 1 ] += 1 ;
$fileinfo [ 'fsize' ] = formatsize ( $contaions [ 'size' ]);
$fileinfo [ 'ffsize' ] = lang ( 'property_info_size' , array ( 'fsize' => formatsize ( $contaions [ 'size' ]), 'size' => $contaions [ 'size' ]));
$fileinfo [ 'contain' ] = lang ( 'property_info_contain' , array ( 'filenum' => $contaions [ 'contain' ][ 0 ], 'foldernum' => $contaions [ 'contain' ][ 1 ]));
} elseif ( $fileinfo [ 'ext' ]) {
$fileinfo [ 'fsize' ] = formatsize ( $fileinfo [ 'size' ]);
$fileinfo [ 'contain' ] = lang ( 'property_info_contain' , array ( 'filenum' => 1 , 'foldernum' => 0 ));
} else {
$fileinfo [ 'fsize' ] = formatsize ( $fileinfo [ 'size' ]);
$fileinfo [ 'contain' ] = lang ( 'property_info_contain' , array ( 'filenum' => 1 , 'foldernum' => 0 ));
}
}
return $fileinfo ;
}
public function get_containsdata_by_fid ( $fid ){
$fileinfo = array ();
if ( $fid ){
$contaions = self :: get_contains_by_fid ( $fid , true );
$fileinfo [ 'fsize' ] = lang ( 'property_info_size' , array ( 'fsize' => formatsize ( $contaions [ 'size' ]), 'size' => $contaions [ 'size' ]));
$fileinfo [ 'contain' ] = lang ( 'property_info_contain' , array ( 'filenum' => $contaions [ 'contain' ][ 0 ], 'foldernum' => $contaions [ 'contain' ][ 1 ]));
}
return $fileinfo ;
}
//根据fid获取属性信息
public function get_property_by_fid ( $fid , $contains = true )
{
global $_G ;
$uid = $_G [ 'uid' ];
$fileinfo = array ();
$param = array ( 'folder' , 'resources_path' , $fid );
$folders = DB :: fetch_first ( " select f.*,p.path from %t f left join %t p on f.fid = p.fid where f.fid = %d " , $param );
if ( ! $folders ) {
return array ( 'error' => lang ( 'no_privilege' ));
}
$fileinfo [ 'realpath' ] = preg_replace ( '/dzz:(.+?):/' , '' , $folders [ 'path' ]);
$fileinfo [ 'name' ] = $folders [ 'fname' ];
$fileinfo [ 'username' ] = $folders [ 'username' ];
if ( $folders [ 'gid' ] > 0 && $folders [ 'pfid' ] == 0 ) {
$fileinfo [ 'type' ] = lang ( 'org_or_group' );
} else {
$fileinfo [ 'type' ] = lang ( 'type_folder' );
}
if ( $contains ) {
$contaions = self :: get_contains_by_fid ( $fid , true );
$fileinfo [ 'fsize' ] = lang ( 'property_info_size' , array ( 'fsize' => formatsize ( $contaions [ 'size' ]), 'size' => $contaions [ 'size' ]));
$fileinfo [ 'contain' ] = lang ( 'property_info_contain' , array ( 'filenum' => $contaions [ 'contain' ][ 0 ], 'foldernum' => $contaions [ 'contain' ][ 1 ]));
}
//编辑权限信息
if ( $folders [ 'gid' ] > 0 ) {
$powerarr = perm_binPerm :: getPowerArr ();
if ( ! ( $uid == $folders [ 'uid' ] && $folders [ 'perm_inherit' ] & $powerarr [ 'edit1' ]) && ! ( $folders [ 'perm_inherit' ] & $powerarr [ 'edit2' ])) {
$fileinfo [ 'editperm' ] = 0 ;
} else {
$fileinfo [ 'editperm' ] = 1 ;
}
} else {
$fileinfo [ 'editperm' ] = 1 ;
}
$statis = C :: t ( 'resources_statis' ) -> fetch_by_fid ( $fid );
$fileinfo [ 'opendateline' ] = ( $statis [ 'opendateline' ]) ? dgmdate ( $statis [ 'opendateline' ], 'Y-m-d H:i:s' ) : '' ;
$fileinfo [ 'editdateline' ] = ( $statis [ 'editdateline' ]) ? dgmdate ( $statis [ 'editdateline' ], 'Y-m-d H:i:s' ) : '' ;
$fileinfo [ 'fdateline' ] = ( $folders [ 'dateline' ]) ? dgmdate ( $folders [ 'dateline' ], 'Y-m-d H:i:s' ) : '' ;
return $fileinfo ;
}
public
function get_icosinfo_by_rid ( $rid )
{
$resourcedata = parent :: fetch ( $rid );
$attrdata = C :: t ( 'resources_attr' ) -> fetch_by_rid ( $rid , $resourcedata [ 'vid' ]);
$data = array_merge ( $resourcedata , $attrdata );
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' ] == 'shortcut' ) {
$data [ 'img' ] = isset ( $data [ 'tdata' ][ 'img' ]) ? $data [ 'tdata' ][ 'img' ] : geticonfromext ( $data [ 'tdata' ][ 'ext' ], $data [ 'tdata' ][ 'type' ]);
} elseif ( $data [ 'type' ] == 'dzzdoc' ) {
$data [ 'img' ] = isset ( $data [ 'img' ]) ? $data [ 'img' ] : geticonfromext ( $data [ 'ext' ], $data [ 'type' ]);
} elseif ( $data [ 'type' ] == 'folder' ) {
$data [ 'img' ] = $data [ 'img' ] ? $data [ 'img' ] : 'dzz/images/default/system/' . $data [ 'flag' ] . '.png' ;
} else {
$data [ 'img' ] = isset ( $data [ 'img' ]) ? $data [ 'img' ] : geticonfromext ( $data [ 'ext' ], $data [ 'type' ]);
}
$img = $data [ 'img' ];
unset ( $data );
return $img ;
}
//文件名获取文件信息
public
function get_resources_by_pfid_name ( $pfid , $name )
{
return DB :: fetch_first ( " select * from %t where pfid=%d and name = %s and `type` = 'folder' " , array ( $this -> _table , $pfid , $name ));
}
//文件id获取文件信息
public
function get_resources_info_by_fid ( $fid )
{
return DB :: fetch_first ( " select * from %t where oid = %d and `type` = 'folder' " , array ( $this -> _table , $fid ));
}
}