<?php
namespace imcat;

// Cache - 读写
class glbConfig{    

    public static 
$_CACHES_YS = array(); // 将读取过的缓存暂存可重用
    
public static $_CACHES_VC = array(); // views/_confg/_* 缓存


    // 获取关联信息: 
    // part.key ('relpb','a0208');
    
static function relids($part, $key='', $rea=1){
        
$fp = DIR_DTMP."/modex/_$part.cfg_php";
        
$res = [];
        if(
is_file($fp)){
            
$data = file_get_contents($fp);
            
$res = json_decode($data, 1); 
        } 
        if(
$key){
            
$res = isset($res[$key]) ? $res[$key] : '';
            if(
$rea){ $res = array_filter(explode(',', $res)); }
            return 
$res;
        }else{
            return 
$res;
        }
    }

    
// 获取自由参数: 
    // part.item.key ('parnav.group_a.title');
    
static function parex($keys=''){
        
$arr = explode('.',$keys); 
        if(empty(
$arr[0])) return '';
        
$res = self::read("parex_{$arr[0]}",'dset');
        if(!empty(
$arr[2])){
            return isset(
$res[$arr[1]][$arr[2]]) ? $res[$arr[1]][$arr[2]] : '';
        }elseif(!empty(
$arr[1])){
            return isset(
$res[$arr[1]]) ? $res[$arr[1]] : '';
        }else{
            return 
$res;
        }
    }

    
// read config
    // $_demo = read('demo');
    // $_sy_keepid = read('keepid','sy');
    
static function read($file,$dir='modcm'){ 
        global 
$_cbase;
        
$modid = $file; $base = DIR_DTMP; 
        if(
in_array($dir,array('modcm','dset'))){
            
$key = "_$file";
            
$file = "/$dir/".$key.".cfg.php";
        }elseif(
$dir=='modex'){
            return 
self::tmpItems($file); 
        }elseif(
in_array($dir,array('_c'))){ //栏目配置
            
$key = "_c_$file"; 
            
$file = "/modex/$key.cfg.php";
            if(!
file_exists(DIR_DTMP.$file)) return array();
        }elseif(
in_array($dir,array('sy','ex'))){
            
$key = "_{$dir}_$file";
            
$file = "/cfgs".($dir=='sy' ? "/sycfg" : "/excfg")."/".substr($key,1).".php";
            
$base = DIR_ROOT;
        }
        
$file = "$base$file"; 
        
$ck = "{$dir}_$key";
        if(!isset(
self::$_CACHES_YS[$ck])){
            if(
file_exists($file)){ // inc大文件,其实很占时间
                
require $file; 
                
$tmp = self::$_CACHES_YS[$ck] = isset($kk) ? $$kk : $$key;
                if(
is_array($tmp) && (!empty($tmp['i'])) && is_string($tmp['i'])){
                    
self::$_CACHES_YS[$ck]['i'] = self::tmpItems($modid);
                }
                if(isset(
$_cbase['tpl']['bdpart'])){
                    
$bdpart = $_cbase['tpl']['bdpart'];
                    if(isset(
$_cbase['lang'][$bdpart]["i_$modid"]) && isset($tmp['i'])){
                        
self::$_CACHES_YS[$ck]['i'] = basArray::Merge($tmp['i'], $_cbase['lang'][$bdpart]["i_$modid"]);
                    }
                    if(isset(
$_cbase['lang'][$bdpart]["f_$modid"]) && isset($tmp['f'])){
                        
self::$_CACHES_YS[$ck]['f'] = basArray::Merge($tmp['f'], $_cbase['lang'][$bdpart]["f_$modid"]);
                    }
                }
            }else{ 
                
self::$_CACHES_YS[$ck] = array();
            }
        }
        return 
self::$_CACHES_YS[$ck];
    }

    
// save config
    
static function save($data,$file,$dir='modcm',$type='php'){
        
$key = "_$file";
        
$file = "$dir/_$file.cfg";
        
comFiles::chkDirs($file,'dtmp'); 
        
$file = "/$file";
        if(
$type=='php'){
            if(
is_array($data)){
                
$data = var_export($data,1);
                
$data = "\$$key = $data;";
            }
            
$data = "<?php\n$data\n?>"; 
            
$file .= ".php";
        }else{
            
$file .= $type;
        } 
        
comFiles::put(DIR_DTMP."$file",$data);
    }
    
    
// ~tmp items
    
static function tmpItems($mod,$itms=array()){
        
$file = "modex/_$mod.cfg_php";
        
comFiles::chkDirs($file,'dtmp'); 
        
$file = DIR_DTMP."/$file";
        if(!empty(
$itms)){ //save
            
$data = is_array($itms) ? comParse::jsonEncode($itms) : $itms; 
            
comFiles::put($file,$data); 
        }else{ 
//get
            
$data = comFiles::get($file); 
            
$itms = comParse::jsonDecode($data); 
            return 
$itms;
        }
    }
    
    
//返回模型中cfg的数组
    
static function mcfg($mod,$re='array'){ 
        
$mcfg = self::read($mod);
        if(
$re=='text') return @$mcfg['cfgs'];
        
$cfgs = basElm::text2arr(@$mcfg['cfgs']);
        if(
$re!='array'){
            return @
$cfgs[$re];
        }else{
            return 
$cfgs;    
        }
    }
    
    static function 
vinc($dir, $mkey='', $mex=''){
        if(
$mkey=='home' && !file_exists(DIR_VIEWS."/$dir/_config/va_home.php")){
            
$cfgs = self::read('home','sy'); 
        }else{
            
$file = DIR_VIEWS."/$dir/_config/{$mex}_$mkey.php";
            require 
$file; 
            
$kk = "_{$mex}_$mkey"; 
            
$cfgs = $$kk;
        }
        if(
$mkey=='home'){
            
$cfgs['null'] = array('c'=>array('vmode'=>'dynamic'),'m'=>'');
        }
        
$cfgs['c']['etr'] = vopTpls::etr1(0, $dir);
        return 
$cfgs;
    }

    
//$_vc = vcfg('home'); //'news'
    
static function vcfg($mod){
        global 
$_cbase;
        
$dir = $_cbase['tpl']['vdir'];
        
$key = "{$dir}/$mod"; //检查缓存
        
if(isset(self::$_CACHES_VC[$key])) return self::$_CACHES_VC[$key];
        
$_groups = self::read('groups'); 
        
$hcfgs = self::vinc($dir, 'home', 'va'); 
        
$hc = $hcfgs['c']; $re = $hcfgs['null']; // 默认动态
        
if($mod=='home'){ //首页
            
self::$_CACHES_VC[$key] = $hcfgs;
            return 
$hcfgs;
        }elseif(isset(
$hc['imcfg'][$mod])){ 
            
$re = self::vinc($dir, $hc['imcfg'][$mod],'vc'); //导入模块
        
}elseif(isset($hc['extra']) && in_array($mod,$hc['extra'])){ //扩展模块
            
$re = self::vinc($dir, $mod,'ve');             
        }elseif(
file_exists(vopTpls::tinc("vc_$mod",0))){ //常规模块
            
$re = self::vinc($dir, $mod,'vc');   
        }
        
$a = array('vmode','stext','stexp');
        foreach (
$a as $k) { // 模块未设置,则继承home的设置
            
if(!isset($re['c'][$k]) && isset($hc[$k])){
                
$re['c'][$k] = $hc[$k];
            }
        }
        
self::$_CACHES_VC[$key] = $re;
        return 
$re;
    }

}