<?php
namespace imcat;

// 标签解析,显示 总控类
class vopApp{
    
    public 
$vars = array(); //存放变量信息
    
    
public $tplCfg = array(); //模板配置
    
public $ucfg = array(); //url-Configs
    
public $err ''
    
    public 
$pgflag = array();
    public 
$pgbar = array(); //分页信息
    
public $mkv$mod$key$view$type;
    public 
$tplname$tplorg$tplnull
    
    function 
__construct($do='run'){
        global 
$_cbase;
        
$this->tplCfg $_cbase['tpl'];
        
vopTpls::check($_cbase['tpl']['vdir'], 1);
        if(!
$do){ return; } 
        
$mode $do=='api' 'api' 'run';
        
$this->$mode();
    }

    
// api输出(控制器模式)
    
function api(){
        global 
$_cbase;
        
# $vop = new vopApp(0);
        
$ucfg vopUrl::iget();
        
$this->ucfg vopUrl::imkv($ucfg); //dump($this->ucfg);
        
$_cbase['mkv'] = $this->ucfg;
        foreach(array(
'mkv','mod','key','view','type') as $k){
            
$this->$k $this->ucfg[$k];
        }
        
$this->extActs(); // 控制器接管
    
}
    
// js标签解析
    
function js($data=''){
        global 
$_cbase;
        
$data || $data basReq::val($data,'','');
        
$temp vopCTag::tagParas($data,'arr'); 
        
# 2019-08-31:安全修正
        
foreach($temp[2] as $tk=>$tv){
            if(
in_array($tv[0],['order','where'])){
                die(
"Error `{$tv[0]}`");
            }
        }
        
$tagfile = @$temp[0]; 
        
$tagname = @$temp[1]; $varid 'T_'.$tagname;
        
$tagpath "/$tagfile.$tagname.comjs.php";
        if(!
file_exists(vopTpls::path('tpc').$tagpath)){
            
vopComp::main($tagfile);
        } 
        
$temp = @$temp[2];
        
$tagtype = @$temp[0][0];
        
$tagre = @$temp[0][1]; $tagre || $tagre 'v';
        unset(
$temp[0]);
        
$tagparas $temp
        
$unv in_array($tagtype,array('One')) ? $tagre $varid;
        $
$unv $this->tagParse($tagname,$tagtype,$temp);
        
//显示模板  
        
$_groups glbConfig::read('groups');
        include 
vopTpls::path('tpc').$tagpath;
    }
    
// 常规模板解析
    
function run(){ 
        global 
$_cbase
        
$this->vars = array(); // 重新清空(初始化),连续生成静态需要
        
$this->ucfg vopUrl::init(); 
        
$_cbase['mkv'] = $this->ucfg;
        foreach(array(
'mkv','mod','key','view','type','tplname',) as $k){
            
$this->$k $this->ucfg[$k];
        }
        
$this->homeStatic(); // 首页静态
        
$this->getVars(); // 读取数据
        
$this->extActs(); // 操作扩展(vars,tpls)
        
$tplfull $this->chkTpl(); // 检查模板,编译
        
if(!$tplfull){
            
$this->ucfg = array(); // 生成静态判断
            
return;
        }
        
extract($this->varsEXTR_OVERWRITE); 
        
$_cbase['run']['tplname'] = $this->tplname;
        include 
$tplfull;
    }
    
    
// 检查模板,编译
    
function chkTpl() {
        global 
$_cbase;
        if(!empty(
$this->tplnull)){
            return 
''// 不要后续模板显示-直接返回
        
}
        if(empty(
$this->tplname) || is_string($this->vars) || $this->ucfg['vcfg']['vmode']=='close'){
            
$msgk $this->ucfg['vcfg']['vmode']=='close' 'closemod' 'parerr';
            
$ermsg is_string($this->vars) ? $this->vars "$this->mkv:".basLang::show("core.vop_$msgk");
            
$this->msg($ermsg);
            return 
''// 返回空,终止操作
        
}
        if(!empty(
$this->tplorg)){
            
$tplorg vopTpls::tinc("{$this->tplorg}.htm",0);
        }else{
            
$tplorg vopTpls::tinc("{$this->tplname}.htm",0);
        }
        if(!
file_exists($tplorg)){ // 原始模板是否存在
            
$this->msg("$tplorg NOT Exists!");
            return 
''// 返回空,终止操作
        
}
        if(!empty(
$this->tplorg)){
            
$tplfull $tplorg// 原始包含,不要解析判断
        
}else{ // 编译
            
$dtpl strpos($this->tplname,':') ? str_replace(':','/',$this->tplname) : $_cbase['tpl']['vdir']."/$this->tplname";
            
$tplfull DIR_CTPL'/'$dtpl.$this->tplCfg['tpc_ext'];
            if(empty(
$_cbase['tpl']['tpc_on']) || !file_exists($tplfull)){
                
vopComp::main($this->tplname);
            }   
        }
        
$tplfull = empty($_cbase['tpl']['fixmkv']) ? $tplfull $tplfull.'.'.$_cbase['tpl']['fixmkv'];
        return 
$tplfull;
    }
    
// 扩展操作
    
function extActs() {
        if(
$class=vopTpls::impCtrl($this->mod)){
            
$aex = new $class($this->ucfg,$this->vars);
            
$method = empty($this->key) ? 'homeAct' : ($this->type=='detail' '_detailAct' $this->key.'Act');
            if(
method_exists($aex,$method)){
                
//$method = $method;
            
}elseif($this->type=='mtype' && method_exists($aex,'_defAct')){
                
$method '_defAct';
            }else{
                
$method '';
            }
            if(
$method){
                
//$exact = $method.'Before'; // 预处理数据
                //if(method_exists($aex,$exact)) $aex->$exact();
                
$res $aex->$method();
                
//$exact = $method.'After'; // 后续数据调整
                //if(method_exists($aex,$exact)) $aex->$exact();
            
}
        }
        if(!empty(
$res['vars']) && is_array($this->vars)){ 
            
$this->vars array_merge($this->vars,$res['vars']);
        }
        if(!empty(
$res['tplnull'])){
            
$this->tplnull $res['tplnull'];
        }elseif(!empty(
$res['newtpl'])){
            
// newtpl = [mod/]act
            
if(!strpos($res['newtpl'],'/')){ $res['newtpl'] = $this->ucfg['mod'].'/'.$res['newtpl']; }
            
$this->tplname $res['newtpl'];
        }elseif(!empty(
$res['tplorg'])){
            
$this->tplname $this->tplorg $res['tplorg']; 
        }else{ 
// extActs/extTpl:取其一扩展模板
            
$this->extTpl();
        }
    }
    
// 扩展模板
    
function extTpl() {
        global 
$_cbase
        
$vars $this->vars;
        
$tplname = &$this->tplname
        
// 处理:detail 设置的模板 
        
if(!empty($vars['tplname'.$this->view])){ 
            
$tplname $vars['tplname'.$this->view];
        }elseif(
$this->type=='detail'){ 
            
$cfgs = array();
            if(isset(
$vars['grade'])){
                
$mcfgs glbConfig::read('grade','dset');
                
$cfgs = isset($mcfgs[$vars['grade']]) ? $mcfgs[$vars['grade']] : '';
            }elseif(isset(
$vars['catid'])){
                
$mcfgs glbConfig::read($this->mod);
                
$cfgs = isset($mcfgs['i'][$vars['catid']]) ? $mcfgs['i'][$vars['catid']] : array();
            }
            
$cfgs = empty($cfgs['cfgs']) ? array() : basElm::text2arr($cfgs['cfgs']); 
            if(!empty(
$cfgs['tplname'.$this->view])){
                
$tplname $cfgs['tplname'.$this->view];
            } 
        }
        if(!empty(
$this->ucfg['vcfg']['tmfix']) && basEnv::isMobile()){
            
$tmfix $this->ucfg['vcfg']['tmfix']; 
            
$_cbase['run']['tmfix'] = $tmfix// -mob标记用于css,js后缀
            
$tplname .= $tmfix;
        }
    }
    
//GetVars
    
function getVars() { 
        
$_groups glbConfig::read('groups');
        if(!(
$this->type=='detail') || !isset($_groups[$this->mod])) return array();
        
$pid $_groups[$this->mod]['pid'];
        
$key in_array($pid,array('types')) ? "kid" substr($pid,0,1).'id';
        
$data $dext = array();
        if(
in_array($pid,array('docs','users','coms','advs','types'))){
            
$data glbData::getRow($this->mod$this->key$pid);
            if(empty(
$data)){ return $this->vars "[{$this->key}]".basLang::show('core.vshow_uncheck'); }
        }
        
$this->vars $data;
    }
    
// 首页静态
    
function homeStatic() {
        if(
$this->mod=='home' && !defined('RUN_STATIC') && $this->ucfg['hcfg']['vmode']=='static'){
            
$file vopStatic::getPath('home','home',0);
            if(
$data=extCache::cfGet("/$file",$this->ucfg['hcfg']['stexp'],'html','str')){ 
                echo 
$data;
                echo 
"\n<!--".basDebug::runInfo()."-->";
                die(); 
// 可以终止,生成静态不走这里
            
}
        }
    }    
    
// 分页标签
    
function chkPage($tagname) {
        global 
$_cbase
        
$nowtpl $_cbase['run']['tplnow'];
        if(empty(
$this->pgflag)){
            
$this->pgflag = array('tpl'=>$nowtpl,'tag'=>$tagname,);
        }else{
            
$msg0 "<b>".basLang::show('core.vshow_1pagetag')."</b>";
            
$msg1 '<br>tpl:'.$this->pgflag['tpl'].', tag:'.$this->pgflag['tag'];
            
$msg2 '<br>tpl:'.$nowtpl.', tag:'.$tagname;
            
$this->msg("$msg0$msg1$msg2");
        }
    }
    
// 解析
    
function tagParse($tagname$type$paras=array()){
        global 
$_cbase
        
$res tagCache::comTag($type$this->mkv$paras);
        if(!empty(
$res[1])){ //缓存
            
$data $res[1];
            if(isset(
$data['page_bar'])){
                
$_cbase['page']['bar'] = $data['page_bar'];
                unset(
$data['page_bar']);
            }
        }else{
            if(
$type=='Page'$this->chkPage($tagname);
            
$this->tagRun('tagnow',$tagname);
            
$class "\\imcat\\tag$type";
            
$_1tag = new $class($paras);
            
$data $_1tag->getData();
            if(
$res[0]){
                
tagCache::setCache($res[0],$data,1,$type=='Page');
            }    
        }
        return 
$data;
    }
    
// setRun
    
function tagRun($key,$val='',$ext=''){
        global 
$_cbase;
        
$_cbase['run'][$key] = $val
        if(
$ext$_cbase['run'][substr($key,0,3).$ext][] = $val;
        
$tpldir $this->tplCfg['vdir']; 
    }
    
// unset
    
function tagEnd($tname=''){}
    
//模板赋值
    
function set($name$value=''){}

    
// msg分析
    
static function msg($msg=''){
        if(!
defined('RUN_STATIC')){
            
glbError::show($msg0);
        }else{
            return 
$msg;    
        }
    }
    
// page-meta
    
function pmeta($title='',$keywd='',$desc=''){
        global 
$_cbase
        
$mcfg glbConfig::read($this->mod);
        if(
$this->type=='detail'){
            if(empty(
$title) && !empty($this->vars['title'])) $title $this->vars['title'];
            if(empty(
$keywd) && !empty($this->vars['seo_key'])) $keywd $this->vars['seo_key'];
            if(empty(
$desc) && !empty($this->vars['seo_des'])) $desc $this->vars['seo_des'];
        }elseif(
in_array($this->type,array('mhome','mext'))){
            if(empty(
$title)) $title = @$mcfg['title'];
            if(isset(
$mcfg['i']) && empty($keywd)){ 
                
$a comTypes::getSubs($mcfg['i'],'0','1'); $gap ''
                foreach(
$a as $k=>$v){
                    
$keywd .= "$gap$v[title]"$gap ',';
                } 
//公司新闻,客户新闻,行业新闻
            
}
        }elseif(
$this->type=='mtype'){ 
            if(empty(
$title) && !empty($mcfg['i'][$this->key]['title'])){ 
                
$title $mcfg['i'][$this->key]['title']; 
                if(!empty(
$mcfg['i'][$this->key]['pid'])){
                    
$title .= '-'.$mcfg['i'][$mcfg['i'][$this->key]['pid']]['title'];
                } 
//子类3-栏目四
            
}
        } 
        if(
$title){
            
$title str_replace('(sys_name)',$_cbase['sys_name'],$title);
            if(!
strstr($title,$_cbase['sys_name'])) $title .= " - ".$_cbase['sys_name'];
        }
        
$ua $this->ucfg['ua']; $up = empty($ua['page']) ? $ua['page']; //??? 
        
$ext count($ua)>|| $up>5;
        
glbHtml::page('init',$ext);
        if(
$title) echo "<title>".basStr::filTitle($title)."</title>\n";
        if(
$keywd) echo "<meta name='keywords' content='".basStr::filTitle($keywd)."' />\n";
        if(
$desc) echo "<meta name='description' content='".basStr::filTitle($desc)."' />\n";
    }

}