<?php
namespace imcat;
// 模版相关
class vopTpls{
### 主要方法 ~~~~~~~~~~~
// 显示解析后的模板内容
static function show($_file, $_ext='', $_data=array()){
global $_cbase;
$fpath = self::cinc($_file, $_ext);
extract($_data, EXTR_OVERWRITE);
ob_start();
include $fpath;
$res = ob_get_contents();
ob_end_clean();
return $res;
}
// 包含html区块(通过模板解析)
// vopTpls::cinc('base:home/home', 1);
// include vopTpls::cinc('base:home/home');
static function cinc($file, $inc=0){
global $_cbase;
$cac = '/'.str_replace(':', '/', $file);
$tplfull = DIR_CTPL.$cac.$_cbase['tpl']['tpc_ext'];
if(!file_exists($tplfull) || !$_cbase['tpl']['tpc_on']){
$template = vopTpls::tinc("$file.htm",0);
$template = comFiles::get($template);
$btpl = new vopComp();
$template = $btpl->bcore($template);
comFiles::chkDirs($cac,'ctpl',1);
comFiles::put($tplfull, "<?php \n".NSP_INIT." \n?>\n".$template); //写入缓存
}
$_cbase['run']['tplname'] = $file;
if($inc){
include $tplfull;
}else{
return $tplfull;
}
}
// tinc('comm:_config/top_book'); -=> include-tpl
// tinc('dir/modtpl.htm', 0); -=> tpl-path
static function tinc($fp, $inc=1, $refull=1){
global $_cbase;
$ext = strpos($fp,'.') ? '' : '.php';
if(!strpos($fp,'/')) { $fp = "_config/$fp"; }
if(!strpos($fp,':')){
$fp = "/{$_cbase['tpl']['vdir']}/$fp";
}else{ // tpl:dir/file
$fp = '/'.str_replace(':', '/', $fp);
}
$vbase = empty($_cbase['tpl']['vbase']) ? DIR_VIEWS : $_cbase['tpl']['vbase'];
if($inc){
include_once $vbase."$fp$ext";
return;
}else{
return ($refull ? $vbase : '')."$fp$ext";
}
}
//获得模版或缓存路径:type=tpl,tpc;
static function path($type='', $root=1){
global $_cbase;
$tpl = empty($_cbase['tpl']['vdir']) ? '/(null-tpl)' : '/'.$_cbase['tpl']['vdir'];
$vbase = empty($_cbase['tpl']['vbase']) ? DIR_VIEWS : $_cbase['tpl']['vbase'];
return ($root ? ($type=='tpc' ? DIR_CTPL : $vbase) : '').$tpl;
}
//设置当前tpl:set tpl path
static function set($vdir=''){
global $_cbase;
$_cbase['tpl']['vdir'] = $vdir;
self::check($vdir);
return $vdir;
}
//获得默认模板
static function def($type='adm'){
global $_cbase;
$tpldir = $_cbase['tpl']['vdir'];
if(!empty($tpldir)){
return $tpldir;
}else{
$vcfg = vopTpls::etr1('show');
return $vcfg['_deadmin_'];
}
}
### 相关方法 ~~~~~~~~~~~
static function check($vdir, $die=0){
global $_cbase;
static $tplchks;
if(empty($tplchks[$vdir])){
$vcfg = glbConfig::read('vopcfg','sy');
if(!empty($vcfg['tpl'][$vdir])){ //无tpl配置
$_cbase['run']['tplcfg'] = $tplchks[$vdir] = $vcfg['tpl'][$vdir];
}else{
$_cbase['run']['tplcfg'] = $tplchks[$vdir] = ['', ''];
} // tplcfg 处理伪静态使用
}else{
$_cbase['run']['tplcfg'] = $tplchks[$vdir];
}
if($die && empty($tplchks[$vdir][1])){
vopApp::msg("Config Error! <br>[cfgs/sycfg/sy_vopcfg.php] : _sy_vopcfg['tpl'][$vdir]");
} //dump($tplchks[$vdir]); dump($vdir);
return $tplchks[$vdir];
}
static function impCtrl($mod){
global $_cbase;
$hcfg = $_cbase['mkv']['hcfg'];
$tpdir = DIR_VIEWS.'/'.$_cbase['tpl']['vdir'];
$arr = array();
$arr[] = $mod.'Ctrl';
if(!empty($hcfg['_defCtrl'])) $arr[] = $hcfg['_defCtrl'];
foreach ($arr as $class) {
$fp = $tpdir."/_ctrls/$class.php";
if(file_exists($fp)){
include_once $fp;
return "\\imcat\\{$_cbase['tpl']['vdir']}\\$class";
}
}
return 0;
}
### 入口相关 ~~~~~~~~~~~
//type=all,show,tpl;title;0,1,
static function etr1($type=0, $dir=''){
global $_cbase;
$vcfg = glbConfig::read('vopcfg', 'sy');
if(strlen($type)<3){ // 0,1,''
$etr = empty($_cbase['run']['tplcfg'][1]) ? '#' : PATH_PROJ.$_cbase['run']['tplcfg'][1];
return $type ? $_cbase['run']['rsite'].$etr : $etr; //type=1 > full
}elseif(in_array($type,array('show','tpl'))){
return $vcfg[$type];
}elseif($type=='title'){
return $_cbase['run']['tplcfg'][0];
}else{ //all
return $vcfg;
}
}
// entry
// $cb=enmkv/ehlist
static function entry($dir='', $cb='enmkv', $mode=''){
global $_cbase;
$dir = $dir ? $dir : $_cbase['tpl']['vdir'];
$dir = DIR_VIEWS."/$dir/_config";
$list = comFiles::listDir($dir);
$re = array();
foreach($list['file'] as $file=>$v){
if(strpos($file,'.maobak')) continue;
$key = str_replace('.php','',$file);
$kc = "_$key"; $km = substr($key,3);
if(!in_array($km,array('va_','ve_','vc_')) || !isset($$kc)) return $re;
include "$dir/$file"; $cfg[$km] = $$kc;
if(!in_array($key,array('va_docs'))){ //,'va_home'
$re = $re + self::$cb($cfg[$km],$km,$mode);
} }
if(!empty($cfg['c']['close'])){
foreach($cfg['c']['close'] as $km){
unset($re[$km]);
}
}
if(!empty($cfg['c']['imcfg'])){
foreach($cfg['c']['imcfg'] as $km=>$from){
$re = $re + self::$cb($cfg[$from],$km,$mode);
}
}
return $re;
}
// enmkv // 针对:会员中心/管理后台-菜单权限
static function enmkv($cfg, $km, $mode){
$re = array();
foreach(array('c','v','u') as $k) unset($cfg[$k]); //'d','m','t','first'
foreach($cfg as $ki=>$kv){
$kv = (is_array($kv) && isset($kv[0])) ? $kv[0] : $kv;
$re["$km-$ki"] = $kv;
}
return $re;
}
// enflow // 针对:管理后台-菜单权限
static function enflow(){
global $_cbase;
$re = array('dops-m'=>'','dops-a'=>'');
if(!empty($_cbase['mkv']['hcfg']['pmods'])){
foreach($_cbase['mkv']['hcfg']['pmods'] as $mod){
$re["$mod-m"] = '';
$fps = comFiles::listDir(DIR_IMCAT.'/flow/'.$mod);
foreach($fps['file'] as $fp=>$itm){
if($fp=='index.php') continue;
$key = "$mod-".str_replace('.php','',$fp);
$re[$key] = '';
}
}
}
return $re;
}
// $mode=dynamic/static/both/all/
static function ehlist($cfg, $km, $mode){
if(in_array($mode,array('static','dynamic')) && $cfg['c']['vmode']!=$mode) return array();
if($mode=='both' && !in_array($cfg['c']['vmode'],array('static','dynamic'))) return array();
$re[$km] = array();
// 展开:types
if(!empty($cfg['t'])){
$mcfg = glbConfig::read($km);
foreach($mcfg['i'] as $ki=>$kv){
if(!isset($cfg[$ki])) $cfg[$ki] = $cfg['t'];
}
}
foreach($cfg as $ki=>$kv){
if(empty($kv) || $km=='home' && $ki!='m') continue;
if($ki=='m'){
$re[$km]['m'] = (is_array($kv) && isset($kv[0])) ? $kv[0] : $kv;
}elseif(strlen($ki)==1){
continue;
}else{
if(is_array($kv)){
foreach($kv as $i=>$v){
$kn = empty($i) ? $ki : "$ki-$i";
$re[$km][$kn] = $v;
}
}else{
$re[$km][$ki] = $kv;
}
}
}
return $re;
}
}