<?
if (!defined('KERNEL_PATH')) exit('Fatal error: incorrect call.');
require_once(KERNEL_PATH."Model.php");
require_once(KERNEL_PATH."FileControl.php");
//FileManager Output Module View
class FileManagerModel extends Model{
var $noscan = array('.', '..');
function FileManagerModel($varcon) {
$this->varcon=$varcon;
}
function Init() {
parent::InitPointers();
return true;
}
function getParentFolderId($folder_id) {
$pref = $this->getPrefix();
$cnt = $this->getRow($this->query('select parent_id from '.$pref.'filemanager_folders where id='.$folder_id));
return $cnt['parent_id'];
}
function isUserHasFolder($folder_id) {
$pref = $this->getPrefix();
$cnt = $this->getRow($this->query('select count(*) as cnt from '.$pref.'filemanager_folders where id='.$folder_id));
return $cnt['cnt'];
}
function getUserFiles($user_id, $folder_id=-1, $with_folders=false) {
$pref = $this->getPrefix();
$rows = array();
$query = $this->query('select id, title, filename, filepath, filetype, size from '.$pref.'filemanager_files where user_id='.$user_id.' and folder_id='.$folder_id.' order by order_pos');
while($row = $this->getRow($query)) {
if($row['size'] > (1 << 20)) { //MBs
$row['size_str'] = round($row['size'] / (1 << 20), 2).' Мб';
} elseif($row['size'] > (1 << 10)) { //KBs
$row['size_str'] = round($row['size'] / (1 << 10), 2).' Кб';
} else { //Bytes
$row['size_str'] = $row['size'].' байт';
}
$row['ico'] = $this->getFileIco($row['filetype']);
$rows[$row['id']] = $row;
}
return $rows;
}
function getUserDirectories($user_id) {
$pref = $this->getPrefix();
$rows = $this->getRows($this->query('select id, parent_id, title, directory, filecount from '.$pref.'filemanager_folders where user_id='.$user_id.' order by order_pos'));
$rows = $this->sortDirs($rows);
return $rows;
}
//Unlike comments, dirs tree starts from parent -1
function sortDirs($dirs, $id=-1, $level=0) {
$res = array();
foreach($dirs as $k=>$v) {
if($v['parent_id'] == $id) {
unset($dirs[$k]);
$v['level'] = $level;
$v['subdirs'] = 0;
$res[$v['id']] = $v;
$arr = $this->sortDirs($dirs, $v['id'], $level+1);
if(count($arr)) {
foreach($arr as $v2) {
$res[$v2['id']]=$v2;
$res[$v['id']]['subdirs']++;
}
}
}
}
return $res;
}
//Not for regular use
function updateFileManager($user_id, $path='') {
if(!$path) $path = $this->getUserPath($user_id);
$basepath = '/uploads/users/';
$result = $this->fullScanDir('.'.$basepath.$path);
$this->storeFileManager($result, $user_id, $basepath.$path);
$set = array('order_pos'=>array('id'));
$where = array('user_id'=>$user_id);
$this->simpleUpdate($set, $where, 'filemanager_folders');
$this->simpleUpdate($set, $where, 'filemanager_files');
}
//$path if without '.' at beginning
function storeFileManager($tree, $user_id, $path, $folder_id=-1, $innerpath='') {
$pref = $this->getPrefix();
foreach(array_keys($tree) as $k) {
if(is_array($tree[$k])) {
$folder = array(
'user_id'=>$user_id,
'parent_id'=>$folder_id,
'title'=>$k,
'directory'=>$innerpath.'/'.$k,
'date_time'=>$this->timeNow(),
);
$id = $this->simpleInsert($folder, 'filemanager_folders');
$this->storeFileManager($tree[$k], $user_id, $path, $id, $innerpath.'/'.$k);
} elseif ($tree[$k] === true) {
$stat = stat('.'.$path.$innerpath.'/'.$k);
$file = array(
'title'=>$k,
'user_id'=>$user_id,
'folder_id'=>$folder_id,
'filename'=>$k,
'filepath'=>$innerpath,
'filetype'=>$this->getFiletype($k),
'size'=>$stat[7],
'date_time'=>$this->timeNow(),
);
$id = $this->simpleInsert($file, 'filemanager_files');
}
}
return true;
}
function fullScanDir($path) {
$dir = dir($path);
if(!$dir->handle) return 'No handle';
$result = array();
while(($item = readdir($dir->handle)) !== false) {
if(in_array($item, $this->noscan)) continue;
if(is_dir($basepath.$path.'/'.$item)) {
$result[$item] = $this->fullScanDir($path.'/'.$item);
} else {
$result[$item] = true;
}
}
return $result;
}
function getFileDesc($filetype) {
switch($filetype) {
case 'image': return 'графика';
case 'text': return 'документ';
}
return 'файл';
}
function getFileIco($filetype) {
switch($filetype) {
case 'image':
case 'text': return 'txt.png';
}
return 'txt.png';
}
function getFiletype($filename) {
$arr = explode('.', $filename);
$ext = array_pop($arr);
switch($ext) {
//Text
case 'txt': case 'rtf': case'doc': case'docx':
return 'text';
//Graphics
case 'jpg': case 'png': case 'gif': case 'bmp': case 'jpeg':
return 'image';
}
return 'file';
}
}
?>