<?php
namespace imcat;

// Store存储类
class comStore{    

    public static 
$objs = array();
    public static 
$cfgs = array();

    static function 
storeCfgs(){
        if(empty(
self::$cfgs)){
            
$scfg glbConfig::read('store''ex');
            
self::$cfgs $scfg;
        }
    }

    
// 移动:从临时文件到正式附件地址 $cls::method(); 在php5.2下报错
    
static function moveUres($org$obj$fmove=1){
        
self::storeCfgs();
        
$clsName self::rsType($obj);
        
$cfg self::$cfgs['types'][$clsName];
        if(
$fmove){
            
$rsObj self::rsCobj($clsName);
            
$re0 $rsObj->moveUres($org$obj$fmove); 
        }
        return 
$cfg['spre'].$obj.$cfg['sfix'];
    }
    
// 删除:删除id下的附件资源
    
static function delFiles($mod$kid){
        if(empty(
$kid)){ return; }
        
$dir comStore::getResDir($mod$kid0); 
        
$re comFiles::delDir(DIR_URES.'/'.$dir1);
        
$tabs self::rsType($dir); 
        foreach(
$tabs as $cls=>$cfg) {
            
$rsObj self::rsCobj($cls);
            
$re $rsObj->delFiles($dir);
        } 
        return 
$re;
    } 
    static function 
rsType($fpdir){
        
// news/2018/9k-dj1t/2018-9k-dj41.jpg 
        // news/2018/9k-dj1t/2018-9k-dj41
        
self::storeCfgs();
        
$clsName 'rsLocal'// default
        
$tmp explode('/'$fpdir);
        
$dfix $tmp[0].'/';
        if(
strpos($fpdir,'.')>0){
            
$ticon comFiles::getTIcon($fpdir); // type,icon
            
$ftype $ticon['type'];
            foreach(
self::$cfgs['types'] as $cls=>$cfg) {
                
$indir = empty($cfg['mdirs']) || in_array($dfix,$cfg['mdirs']);
                
$intype = empty($cfg['ftypes']) || in_array($ftype,$cfg['ftypes']);
                if(
$indir && $intype){
                    return 
$cls;
                }
            }
            return 
$clsName;
        }else{
            
$res = array();
            foreach(
self::$cfgs['types'] as $cls=>$cfg) {
                if(empty(
$cfg['mdirs']) || in_array($dfix,$cfg['mdirs'])){
                    
$res[$cls] = $cfg;
                }
            }
            return empty(
$res) ? $clsName $res;
        }
    }
    static function 
rsCobj($fname){
        if(empty(
self::$objs[$fname])){
            require_once 
DIR_IMCAT."/adpt/store/$fname.php";
            
$class "\\imcat\\$fname";
            
self::$objs[$fname] = new $class();
        }
        return 
self::$objs[$fname];
    }

    
/**
     * 上传到的临时目录,后续再移动到正式目录
     * @return string
     */
    
static function getTmpDir($isfull=1){
        
$user usrBase::userObj();
        
$sid = empty($user->sinit['sid']) ? usrPerm::getUniqueid('Cook','sip') : $user->sinit['sid'];
        
$path "@udoc/$sid"//$modFix-
        
comFiles::chkDirs($path'dtmp'0);
        return (
$isfull DIR_DTMP.'/' '')."$path"//PATH_ROOT
    
}
    
    static function 
fixTmpDir($path){
        
$pos strpos($path,"/@udoc/");
        
$path PATH_DTMP.substr($path$pos);
        return 
$path;
    }
    
    
/**
     * 上传资源目录
     * @return string
     */
    
static function getResDir($mod$kid$isfull=1$chkdir=0){
        
$grs glbConfig::read('groups'); 
        
$mcfgs = empty($grs[$mod]) ? array() : $grs[$mod];
        if(empty(
$kid)){
            die(
__FUNCTION__);
        }
        
$kpath $kid
        
$fmts glbConfig::read('frame.resfmt''sy'); // docs,users; types; advs,coms 
        
$fmt = (!empty($mcfgs['pid']) && in_array($mcfgs['pid'],array('docs','users'))) ? 0;
        foreach(
$fmts as $k=>$v){ // 默认:fmt=1 : yyyy/md-noid
            
if(in_array($mod,$v)){ $fmt=$k; break; }
        }
        if(!empty(
$fmt) && strpos($kid,'-')>0){ 
            
$ka explode('-',$kid);
            if(
$fmt==1$kpath $ka[0].'/'.$ka[1].(empty($ka[2])?'':'-'.$ka[2]);
            if(
$fmt==2$kpath $ka[0].'-'.$ka[1].(empty($ka[2])?'':'/'.$ka[2]);
            if(
$fmt==3$kpath $ka[0].'/'.$ka[1].(empty($ka[2])?'':'/'.$ka[2]);
            if(
$fmt==6){ // /html/news-16/ab-8899.html
                
$repath "$mod-".substr($kpath,2,2)."/".substr($kpath,5);
            }else{
                
$repath "$mod/$kpath"
            }
        }else{
            
$repath "$mod/$kpath"//empty($kpath);
        
}
        
$chkdir && comFiles::chkDirs($repath'ures'0);
        return (
$isfull DIR_URES.'/' '').$repath;
    }
    
// 移动一个字段的附件文件:comStore::moveTmpField($dop,'exp_t01');
    
static function moveTmpField(&$dop$fid$mod$did$ishtml=0){
        if(!
strpos($dop->fmv[$fid],'/@udoc/')){ return; }
        
$dop->fmv[$fid] = self::moveTmpDir($dop->fmv[$fid], $mod$did$ishtml); 
    }
    
//移动临时文件夹中的文件
    
static function moveTmpDir($str$mod$kid$ishtml=0){
        
self::storeCfgs();
        
$ar2 self::moveTmpFmt($str$ishtml); 
        if(empty(
$ar2)) return $str;
        foreach(
$ar2 as $v){
            if(
self::moveTmpOne($str$v$mod$kid)) continue;
            
$cfg = array(
                array(
'ures'"/$mod"), 
                array(
'html'"/$mod"),
                array(
'static'"/"), 
                array(
'root'"/"),
            );
            foreach(
$cfg as $cv){
                
$str self::moveRepRoot($str$v$cv[0], $cv[1]);
            }
        }
        foreach(
self::$cfgs['types'] as $tk=>$row){
            if(!empty(
$row['vpre']) && !empty($row['spre']) && strpos($str,$row['vpre'])>=0){
                
$str str_replace($row['vpre'], $row['spre'], $str);
            } 
        }
        return 
$str;
    }
    
// deel:@udoc
    
static function moveTmpOne(&$str$v$mod$kid){
        global 
$_cbase;
        
$fix PATH_DTMP."/@udoc/";
        
$flag 0;
        if(
$org=strstr($v,$fix)){
            
$orgfile DIR_DTMP.substr($orgstrlen(PATH_DTMP));
            
$obj self::getResDir($mod,$kid,0,1)."/".basename($org);
            
// 可能:mpic,content:有同一个图片,第一次移动后,第二次就不存在了,所以也要替换
            
$fmove is_file($orgfile);
            
$rmove self::moveUres($orgfile$obj$fmove);
            
$str str_replace($v$rmove$str);
            
$flag 1
            
/*
            if(in_array($org,$_cbase['run']['tmpFile'])){
                $str = str_replace($v, '{uresroot}/'.$obj, $str);
                $flag = 1; 
            }elseif(is_file($orgfile)){ 
                if($re=self::moveUres($orgfile,$obj)){
                    $str = str_replace($v, '{uresroot}/'.$obj, $str);
                    $_cbase['run']['tmpFile'][] = $org;
                    $flag = 1; 
                }
            }*/
        
}
        return 
$flag;
    }
    
// str2arr
    
static function moveTmpFmt($str$ishtml=0){
        if(
$ishtml){ //a,img,embed,value?,
            
preg_match_all("/\s+(src|href|value)=(\S+)[\s|>]+/i"$str$arr); //3
            
$ar2 = empty($arr[2]) ? array() : str_replace(array("\\",'"',"'"), array(), $arr[2]); 
        }else{
            if(
strpos($str,';')){ //pics
                
$ar2 explode(';'$str);
                foreach(
$ar2 as $k=>$v){
                    
$art explode(','$v);
                    if(empty(
$art[0])) unset($ar2[$k]);
                    else 
$ar2[$k] = str_replace(array("\r","\n",' '), array('','',''), $ar2[$k]);
                }
            }else{
                
$ar2 = array($str);
            }
        } 
        
$ar2 array_unique(array_filter($ar2));
        return 
$ar2;
    }
    
    
//替换root路径
    
static function moveRepRoot($str$v$key$fix=''){
        global 
$_cbase;
        
$rmain $_cbase['run']['rmain'];
        
$cfg self::cfgDirPath($key'arr');
        
$res $v;
        if(
strpos($res,$cfg[1].$fix)===&& !empty($cfg[1])){
            
$res '{'.$key.'root}'.substr($resstrlen($cfg[1]));
            
//echo "$key, ($v, $res, $str)<br>";
            
$str str_replace($v$res$str); 
        }
        
$reps glbConfig::read('repath''sy');
        foreach (array(
'att','tpl') as $k0) {
            if(!empty(
$reps[$k0])){
                
$str str_replace(array_values($reps[$k0]), array_keys($reps[$k0]), $str);
            }
        }
        
//$str = self::revSaveDir($str); # 2009-02之前就有这行代码???
        
return $str;
    }
    
    
//part:dir,arr,else
    
static function cfgDirPath($key$part='dir'){
        
$cfg = array(
            
'root'   => array(DIR_ROOT,    PATH_ROOT),
            
'imcat'  => array(DIR_IMCAT,   PATH_IMCAT),
            
'views'  => array(DIR_VIEWS,   PATH_VIEWS),
            
'ctpl'   => array(DIR_CTPL,    ''),
            
'dtmp'   => array(DIR_DTMP,    PATH_DTMP),
            
'vars'   => array(DIR_VARS,    PATH_VARS),
            
'ures'   => array(DIR_URES,    PATH_URES),
            
'html'   => array(DIR_HTML,    PATH_HTML),
            
'vendor' => array(DIR_VENDOR,  PATH_VENDOR),
            
'vendui' => array(DIR_VENDUI,  PATH_VENDUI),
            
'static' => array(DIR_STATIC,  PATH_STATIC),
            
'tpl'    => array(vopTpls::path('tpl'), ''), //可能没有定义
            
'tpc'    => array(vopTpls::path('tpc'), ''),
        );
        
$re = isset($cfg[$key]) ? $cfg[$key] : $cfg;
        if(
$part=='arr') return $re;
        
$id $part=='dir' 1;
        return empty(
$re[$id]) ? $key $re[$id];
    }
    
    
//还原保存的路径
    
static function revSaveDir($str$part=''){
        
self::storeCfgs();
        
$paths self::cfgDirPath(0'arr');
        foreach(
$paths as $ck=>$itm){
            if(
in_array($ck,array('tpl','tpc','ctpl','code'))) continue;
            
$path $part=='dir' $itm[0] : $itm[1];
            
$str str_replace(array('{'.$ck.'root}','{$'.$ck.'root}'), $path$str); 
        }
        
$reps glbConfig::read('repath''sy');
        foreach (array(
'att','tpl') as $k0) {
            if(!empty(
$reps[$k0])){
                
$str str_replace(array_keys($reps[$k0]), array_values($reps[$k0]), $str);
            }
        }
        foreach(
self::$cfgs['types'] as $tk=>$row){ // && strpos($str,$row['spre'])>=0
            
if(!empty($row['vpre']) && !empty($row['spre'])){
                
$str str_replace($row['spre'], $row['vpre'], $str); 
            }
        }
        return 
$str;
    }
    
// 图片集转数组: dext:del-ext
    
static function picsTab($exfile$dext=1){ 
        if(empty(
$exfile)) return [];
        
$exfile str_replace(["\r\n","\r"], ["\n","\n"], $exfile);
        
$exfps explode("\n"self::revSaveDir($exfile));
        if(empty(
$exfps)){ return []; }
        foreach(
$exfps as $fk=>$fp){
            
$fp trim(str_replace(';','',$fp));
            if(!
$fp){ unset($exfps[$fk]); }
            else{ 
                
$msg '';
                if(
strpos($fp,',')>0){ 
                    
$tmp explode(','$fp);
                    
$fp $tmp[0]; //substr($fp,0,strpos($fp,',')); 
                    
$msg $tmp[1];
                }
                
$exfps[$fk] = $dext $fp : [$fp,$msg]; 
            }
        }
        return 
$exfps;
    }
    
}