<?php
namespace imcat;

// Static相关
class vopStatic{

    
//生成一个广告类别的缓存
    
static function advType($mod,$type=''){
        
$cfg glbConfig::read($mod);
        
$dtpl = array(
            
'1'=> "<a href='{url}' target='_blank'>{title}</a>",
            
'2'=> "<a href='{url}' target='_blank'><img src='{mpic}' name='{title}' alt='{title}' /></a>",
            
'3'=> "{detail}",
        );
        
$tpl = empty($cfg['i'][$type]['cfgs']) ? $dtpl[$cfg['etab']] : $cfg['i'][$type]['cfgs']; 
        if(!
strpos($tpl,'target')) $tpl str_replace('<a',"<a target='_blank'",$tpl);
        
$data ''$rep = array('title','color','url','urlorg','mpic','detail');
        
$list glbDBObj::dbObj()->table("advs_$mod")->where("catid='$type' AND `show`='1'")->select();
        if(
$list){
            foreach(
$list as $r){
                
$istr $tpl;
                
$r['urlorg'] = $r['url'];
                if(
in_array($cfg['etab'],array(1,2))){ 
                    
$r['url'] = PATH_ROOT."/plus/api/redir.php?advs:".comConvert::sysBase64("$mod,$r[aid],$r[url]");
                }
                foreach(
$rep as $key){
                    
$istr str_replace('{'.$key.'}',$r[$key],$istr);
                }
                
$istr str_replace(array('{root}','{$root}'),PATH_ROOT,$istr);
                if(
$cfg['etab']==&& !empty($r['url'])){
                    
$_arep explode('[=]',$r['url']); 
                    
$istr str_replace($_arep[0],$_arep[1],$istr);
                }
                
$data .= "$istr\r\n";
            }
        }
        
$data comStore::revSaveDir($data);
        
$file tagCache::caPath($mod,$type,0);
        
comFiles::chkDirs($file,'ctpl'); 
        
comFiles::put(DIR_CTPL."/$file",$data);
        return 
$data;
    }

    
//广告Static(按类别)
    
static function advMod($mod,$aids=array()){
        
$cfg glbConfig::read($mod);
        if(
$cfg['etab']==4) return;
        if(
$mod=='adpush') return;
        
$ids '';
        if(
is_array($aids)){
            foreach(
$aids as $id=>$v){ 
                if(empty(
$id)) continue;
                
$ids .= (empty($ids) ? '' ',')."'$id'";            
            }
        }else{
            
$ids "'$aids'";    
        }
        if(!
$ids) return;
        
$whr $ids=="'(all)'" '1=1' "aid IN($ids)";
        
$types = array(); $data '';
        
$list glbDBObj::dbObj()->field('DISTINCT catid')->table("advs_$mod")->where($whr)->select(); //frame=0 AND 
        
if($list){
            foreach(
$list as $r){
                
$caid $r['catid'];
                if(!isset(
$cfg['i'][$caid])) break;
                
$ditm self::advType($mod,$caid);
                
$data .= "[$caid]-{$cfg['i'][$caid]['title']}:::<br>$ditm <hr class='ma10 cF0F'> ";
            }
        }
        return 
$data;
    }

    
// showRes
    
static function showRes($res){
        
$msg basLang::show('core.vops_batres')."<br><br>\n";
        
$msg .= $res['msg'] ? $res['msg']."<br>" basLang::show('core.vops_dores',"[{$res['ok']}/{$res['cnt']}]")."<br>\n";
        
$msg .= "[".date('Y-m-d H:i:s')."]<br>\n";
        if(
$res['next']){ 
            
$msg .= "<br>\n".basLang::show('core.vops_3secnext')."<br>\n";
            
$js "setTimeout(\"location.href='{$res['url']}';\",3000);"
            
$js basJscss::jscode($js);
        }else{
            
$msg .= "<br>\n".basLang::show('core.vops_end')."<br>\n";
            
$js '';    
        }
        
glbHtml::page(basLang::show('core.vops_res'));
        
glbHtml::page('body');
        echo 
"\n<p>$msg</p>\n<hr>\n$js";
        unset(
$res['msg']); basDebug::varShow($res);
        
glbHtml::page('end');
    }
    
    static function 
batList($mod,$tpl){ 
        
$re = array('msg'=>'','cnt'=>0,'ok'=>0,'next'=>'','min'=>'','max'=>'',);
        
$lists vopTpls::entry($tpl,'ehlist','static');
        
$listn $lists[$mod]; $msg '';
        foreach(
$listn as $key=>$v){ 
            if(!
strpos($v,'/')) continue; //first,close
            
$key $key=='m' "" "-$key";
            
$msg .= vopStatic::toFile("$mod$key")."<br>\n";     
        }
        
$re['msg'] = $msg;
        return 
$re;
    }
    static function 
batDetail($mod,$tpl){ 
        
$re = array('msg'=>'','cnt'=>0,'ok'=>0,'next'=>'','min'=>'','max'=>'',);
        
$data self::batKids($mod); $msg ''
        
$vcfg glbConfig::vcfg($mod);
        if(!empty(
$data)){
            foreach(
$data as $key=>$row){ 
                
$oid $key;
                if(empty(
$re['min']) || $oid<$re['min']) $re['min'] = $oid;
                if(empty(
$re['max']) || $oid>$re['max']) $re['max'] = $oid;
                if(empty(
$vcfg['c']['stypes']) || in_array($row['type'],$vcfg['c']['stypes'])){ 
                    
$da is_array($vcfg['d']) ? $vcfg['d'] : array('0'=>1); 
                    foreach (
$da as $ka => $va) {
                        
$msg .= vopStatic::toFile("$mod.$key".(empty($ka)?'':".$ka"))."<br>\n";
                    }
                    
$re['cnt']++;
                }else{
                    
$msg .= "[$mod.$key][{$row['type']}] Skip...<br>\n";
                }
            }
            
$re['next'] = 1
        }else{
            
$re['msg'] = 'No Data';
            
$re['next'] = 0;    
        } 
        
$re['msg'] = $msg;
        if(
$re['next']){
            
$offset basReq::val('order')=='ASC' $re['max'] : $re['min'];
            
$re['url'] = basReq::getURep(0,'offset',$offset);
        }
        return 
$re
    }
    
// mod,limit(1-500),order(did:ASC),stype,offset
    
static function batKids($mod){
        
$mcfg glbConfig::read($mod); $whrstr '';
        
$stype basReq::val('stype'); $offset basReq::val('offset');
        
$limit basReq::val('limit',10,'N'); if($limit<1$limit 10;
        
$order basReq::val('order','DESC');
        if(
in_array($mcfg['pid'],array('docs','advs'))){ 
            
$stype && $whrstr .= basSql::whrTree($mcfg['i'],'catid',$stype);
            
$ftype ',catid';    
            
$tabid "docs_$mod";
        }elseif(
in_array($mcfg['pid'],array('users'))){
            
$stype && $whrstr .= " AND grade='$stype'";
            
$ftype ',grade';    
            
$tabid "users_$mod";
        }else{
            
$ftype '';    
        }
        
$kname substr($mcfg['pid'],0,1).'id';
        
$omod in_array(strtoupper($order),array('ASC','DESC','EQ')) ? strtoupper($order) : 'DESC';
        
$offset basReq::val('offset');
        if(
$offset){
            if(
strstr($omod,'DESC')){
                
$op '<';
            }elseif(
strstr($omod,'ASC')){
                
$op '>';
            }else{ 
// EQ
                
$op '=';
            }
            
$whrstr .= " AND $kname$op'$offset'";
        } 
        
$whrstr $whrstr substr($whrstr,5) : '1=1'
        
$data glbDBObj::dbObj()->field("$kname$ftype,`show`")->table($tabid)->where($whrstr)->order("$kname $omod")->limit($limit)->select(); 
        
$re = array();
        if(!empty(
$data)){
            foreach(
$data as $row){ 
                
$type $ftype $row[substr($ftype,1)] : $ftype;
                
$re[$row[$kname]] = array('show'=>$row['show'],'type'=>$type);
            }
        }
        return 
$re;
    }
    
    static function 
delList($mod,$tpl){ 
        
$re = array('msg'=>'','cnt'=>0,'ok'=>0,'next'=>'','min'=>'','max'=>'',);
        
$lists vopTpls::entry($tpl,'ehlist','static');
        
$listn $lists[$mod]; $msg '';
        foreach(
$listn as $key=>$v){
            
$key $key=='m' "" $key;
            
$file self::getPath($mod,$key,0);
            
$res = @unlink(DIR_HTML.'/'.$file); $res var_export($res,1);
            
$msg .= "{$res}:".$file."<br>\n";
        }
        
$re['msg'] = $msg;
        return 
$re;
    }
    static function 
delDetail($mod,$sub=''){ 
        static 
$fext$msg;
        if(empty(
$fext)){
            
$mcfg glbConfig::vcfg($mod); 
            
$fext $mcfg['c']['stext'];
            
$msg '';
        } 
        
$dfix basReq::val('offset');
        
$elen strlen($fext);
        
$ndir DIR_HTML."/$mod$sub";
        if(!
is_dir("$ndir")){ return false; };
        
$handle opendir("$ndir");
        while((
$file readdir($handle)) !== false){
            if(
$file != "." && $file != ".."){
                if(
in_array($file,array('index.htm','index.html'))) continue;
                if(
is_dir("$ndir/$file")){
                    if(empty(
$sub) && $file=='home'){ continue; }
                    if(empty(
$sub) && $dfix && strstr($file,$dfix)){ continue; }
                    
self::delDetail($mod,"$sub/$file");
                }else{
                    if(
substr($file,-$elen,$elen)==$fext){
                        
$res = @unlink("$ndir/$file"); $res var_export($res,1);
                        
$msg .= "{$res}:$sub/$file<br>\n";
                    }
                }
            }
        }
        
$re = array('cnt'=>substr_count($msg,'<br>'),'ok'=>substr_count($msg,'true:'),'next'=>'',);
        
$re['msg'] = $msg;
        return 
$re;
    }
    
//生成Static文件(当前模板)
    
static function toFile($q=''){ 
        
basEnv::runCbase(); //重置参数
        
defined('RUN_STATIC') || define('RUN_STATIC',1);
        static 
$vop; if(empty($vop)) $vop = new vopApp(0);
        
ob_start(); 
        
$err $vop->run($q); 
        if(empty(
$vop->ucfg)){ 
            return 
$vop->err $vop->err "($q)Error! Has NO set tpl!"
        }
        
$re ob_get_contents();
        
$kid $vop->mod=='home' 'home' $vop->key;
        
$vext = empty($vop->view) ? '' ".$vop->view";
        
$file self::getPath($vop->mod,$kid.$vext,0); 
        
$msg $file.' : '.basStr::showNumber(strlen($re),'Byte').'';
        
comFiles::chkDirs($file,'html');
        
comFiles::put(DIR_HTML.'/'.$file,"$re\n<!--$msg-->");
        
ob_end_clean(); 
        return 
$msg;
    }
    
    
//获得Static文件路径(当前模板):
    
static function getPath($mod,$kid,$isfull=1){
        
$kid || $kid 'home';
        
$dir comStore::getResDir($mod,$kid,$isfull);
        if(
$isfull){
            
$dir DIR_HTML.substr($dir,strlen(DIR_URES));     
        }
        
$mcfg glbConfig::vcfg($mod);
        return 
$dir.(empty($mcfg['c']['stext']) ? '.htm' $mcfg['c']['stext']);
    }
    
    
//updKid:更新(add,del,edit)一个Kid的静态
    
static function updKid($mod,$kid,$act='upd',$itype=''){
        global 
$_cbase;
        
$tplbak $_cbase['tpl']['vdir'];
        
$vcfg vopTpls::etr1('tpl'); 
        
$re = array(); 
        foreach(
$vcfg as $tpl=>$suit){
            if(
strpos($_cbase['tpl']['no_static'],$tpl)) continue;
            
$file DIR_VIEWS."/$tpl/_config/vc_$mod.php";
            if(
file_exists($file)){
                include 
$file
                
$kc "_vc_$mod"$cfg = $$kc;
                if(
$itype && !empty($cfg['c']['stypes']) && !in_array($itype,$cfg['c']['stypes'])){ 
                    continue; 
// 忽略不需要生成静态的页面
                

                if(
$cfg['c']['vmode']=='static'){
                    if(
$act=='del'){
                        
$_cbase['tpl']['vdir'] = $tpl
                        
$re[$tpl] = self::getPath($mod,$kid,1);
                    }else{
                        
$re[$tpl] = "$mod.$kid";
                    }
                }
            }
        }
        
$_cbase['tpl']['vdir'] = $tplbak;
        return 
$re
    }
    
    
//是否需要生成静态
    
static function chkNeed($mkv=''){ 
        
$moda vopUrl::imkv(array('mkv'=>$mkv),'a');
        
$kid $moda[0]=='home' 'home' $moda[1]; 
        
$vcfg glbConfig::vcfg($moda[0]); 
        if(@
$vcfg['c']['vmode']!='static') return 0;
        
$vext = empty($moda[2]) ? '' ".$moda[2]";
        
$file self::getPath($moda[0],$kid.$vext,0); 
        
$flag = !extCache::cfGet("/$file",$vcfg['c']['stexp'],'html');
        return 
$flag;    
    }

}