"));
    最近接手一个web 产品,用php写的,发现里面使用了模板引擎从uchome 这类产品中抽取出来的。这个模板引擎的特点非常让我喜欢,简洁不冗余,原理简单明了。在以后的项目中真的可以考虑使用此类小巧而精致的模板引擎。

1). 调用模板(记得先引入2的文件)

include_once template("test"); // 模板的名字 test

2). 模板调用逻辑

//模板调用
function template($name) {
    global $_sconfig$_sglobal$_sc;

    if ($_sglobal['mobile']) {
        $objfile = s_root . './api/mobile/tpl_' . $name . '.php';
        if (!file_exists($objfile)) {
            showmessage('m_function_is_disable_on_wap');
        }
    } else {
        if (strexists($name, '/')) {
            $tpl = $name;
        } else {
            $tpl = "template/$_sconfig[template]/$name";
        }
        
        $objfile = s_root . './data/tpl_cache/' . str_replace('/', '_', $tpl) . '.php';
        
        if ('1' === $_sc['debug']) {
            include_once(s_root . './core/function_template.php');
            parse_template($tpl);
        } else {
            if (!file_exists($objfile)) {
                include_once(s_root . './core/function_template.php');
                parse_template($tpl);
            }
        }
    }
    return $objfile;
}

//子模板更新检查
function subtplcheck($subfiles$mktime$tpl) {
    global $_sc$_sconfig;

    if ($_sc['tplrefresh'] && ($_sc['tplrefresh'] == 1 || mt_rand(1, $_sc['tplrefresh']) == 1)) {
        $subfiles = explode('|', $subfiles);
        foreach ($subfiles as $subfile) {
            $tplfile = s_root . './' . $subfile . '.htm';
            if (!file_exists($tplfile)) {
                $tplfile = str_replace('/' . $_sconfig['template'] . '/', '/default/', $tplfile);
            }
            @$submktime = filemtime($tplfile);
            if ($submktime > $mktime) {
                include_once(s_root . './source/function_template.php');
                parse_template($tpl);
                break;
            }
        }
    }
}

3).模板解析函数
 
if(!defined('in_uchome')) {
    exit('access denied');
}
$_sglobal['i'] = 0;
$_sglobal['block_search'] = $_sglobal['block_replace'] = array();
function parse_template($tpl) {
    global $_sglobal$_sc$_sconfig;
    //yoho:用配置变量替换默认模板
    $newtpl = empty($_sconfig['yoho_'.$tpl.'_template']) ? $tpl : $_sconfig['yoho_'.$tpl.'_template'];

    //包含模板
    $_sglobal['sub_tpls'] = array($newtpl);

    $tplfile = s_root.'./'.$newtpl.'.htm';
    $objfile = s_root.'./data/tpl_cache/'.str_replace('/','_',$newtpl).'.php';
    
    //read
    if(!file_exists($tplfile)) {
        $tplfile = str_replace('/'.$_sconfig['template'].'/', '/default/', $tplfile);
    }
    $template = sreadfile($tplfile);
    if(empty($template)) {
        exit("template file : $tplfile not found or have no access!");
    }

    //模板
    $template = preg_replace("/\<\!\-\-\{template\s ([a-z0-9_\/] )\}\-\-\>/ie", "readtemplate('\\1')", $template);
    //处理子页面中的代码
    $template = preg_replace("/\<\!\-\-\{template\s ([a-z0-9_\/] )\}\-\-\>/ie", "readtemplate('\\1')", $template);
    //解析模块调用
    $template = preg_replace("/\<\!\-\-\{block\/(. ?)\}\-\-\>/ie", "blocktags('\\1')", $template);
    //解析广告
    $template = preg_replace("/\<\!\-\-\{ad\/(. ?)\}\-\-\>/ie", "adtags('\\1')", $template);
    //时间处理
    $template = preg_replace("/\<\!\-\-\{date\((. ?)\)\}\-\-\>/ie", "datetags('\\1')", $template);
    //头像处理
    $template = preg_replace("/\<\!\-\-\{avatar\((. ?)\)\}\-\-\>/ie", "avatartags('\\1')", $template);
    //php代码
    $template = preg_replace("/\<\!\-\-\{eval\s (. ?)\s*\}\-\-\>/ies", "evaltags('\\1')", $template);

    //开始处理
    //变量

    $var_regexp = "((\\\$[a-za-z_\x7f-\xff][a-za-z0-9_\x7f-\xff]*)(\[[a-za-z0-9_\-\.\"\'\[\]\$\x7f-\xff] \])*)";
    $template = preg_replace("/\<\!\-\-\{(. ?)\}\-\-\>/s", "{\\1}", $template);
    $template = preg_replace("/([\n\r] )\t /s", "\\1", $template);
    $template = preg_replace("/(\\\$[a-za-z0-9_\[\]\'\"\$\x7f-\xff] )\.([a-za-z_\x7f-\xff][a-za-z0-9_\x7f-\xff]*)/s", "\\1['\\2']", $template);
    $template = preg_replace("/\{(\\\$[a-za-z0-9_\[\]\'\"\$\.\x7f-\xff] )\}/s", "", $template);
    $template = preg_replace("/$var_regexp/es", "addquote('')", $template);
    $template = preg_replace("/\<\?\=\<\?\=$var_regexp\?\>\?\>/es", "addquote('')", $template);
    //逻辑
    $template = preg_replace("/\{elseif\s (. ?)\}/ies", "stripvtags('','')", $template);
    $template = preg_replace("/\{else\}/is", "else { ?>", $template);
    //循环
    for($i = 0; $i < 6; $i ) {
        $template = preg_replace("/\{loop\s (\s )\s (\s )\}(. ?)\{\/loop\}/ies", "stripvtags('','\\3')", $template);
        $template = preg_replace("/\{loop\s (\s )\s (\s )\s (\s )\}(. ?)\{\/loop\}/ies", "stripvtags(' \\3) { ?>','\\4')", $template);
        $template = preg_replace("/\{if\s (. ?)\}(. ?)\{\/if\}/ies", "stripvtags('','\\2')", $template);
    }
    //常量
    $template = preg_replace("/\{([a-za-z_\x7f-\xff][a-za-z0-9_\x7f-\xff]*)\}/s", "", $template);
    
    //替换
    if(!empty($_sglobal['block_search'])) {
        $template = str_replace($_sglobal['block_search'], $_sglobal['block_replace'], $template);
    }
    
    //换行
    $template = preg_replace("/ \?\>[\n\r]*\<\? /s", " ", $template);
    
    //附加处理
    $template = $template."//  echo debuginfo(); ?>";
    $template = "implode('|', $_sglobal['sub_tpls'])."', '$_sglobal[timestamp]', '$tpl');?>$template";
    
    //write
    if(!swritefile($objfile$template)) {
        exit("file: $objfile can not be write!");
    }
}

function addquote($var) {
    return str_replace("\\\"", "\"", preg_replace("/\[([a-za-z0-9_\-\.\x7f-\xff] )\]/s", "['\\1']", $var));
}

function striptagquotes($expr) {
    $expr = preg_replace("/\<\?\=(\\\$. ?)\?\>/s", "\\1", $expr);
    $expr = str_replace("\\\"", "\"", preg_replace("/\[\'([a-za-z0-9_\-\.\x7f-\xff] )\'\]/s", "[\\1]", $expr));
    return $expr;
}

function evaltags($php) {
    global $_sglobal;

    $_sglobal['i'] ;
    $search = "";
    $_sglobal['block_search'][$_sglobal['i']] = $search;
    $_sglobal['block_replace'][$_sglobal['i']] = "$php)." ?>";
    
    return $search;
}

function blocktags($parameter) {
    global $_sglobal;

    $_sglobal['i'] ;
    $search = "";
    $_sglobal['block_search'][$_sglobal['i']] = $search;
    $_sglobal['block_replace'][$_sglobal['i']] = "$parameter\"); ?>";
    return $search;
}

function adtags($pagetype) {
    global $_sglobal;

    $_sglobal['i'] ;
    $search = "";
    $_sglobal['block_search'][$_sglobal['i']] = $search;
    $_sglobal['block_replace'][$_sglobal['i']] = "";
    return $search;
}

function datetags($parameter) {
    global $_sglobal;

    $_sglobal['i'] ;
    $search = "";
    $_sglobal['block_search'][$_sglobal['i']] = $search;
    $_sglobal['block_replace'][$_sglobal['i']] = "";
    return $search;
}

function avatartags($parameter) {
    global $_sglobal;

    $_sglobal['i'] ;
    $search = "";
    $_sglobal['block_search'][$_sglobal['i']] = $search;
    $_sglobal['block_replace'][$_sglobal['i']] = "";
    return $search;
}

function stripvtags($expr$statement='') {
    $expr = str_replace("\\\"", "\"", preg_replace("/\<\?\=(\\\$. ?)\?\>/s", "\\1", $expr));
    $statement = str_replace("\\\"", "\"", $statement);
    return $expr.$statement;
}

function readtemplate($name) {
    global $_sglobal$_sconfig;
    
    $tpl = strexists($name,'/')?$name:"template/$_sconfig[template]/$name";
    $tplfile = s_root.'./'.$tpl.'.htm';
    
    $_sglobal['sub_tpls'][] = $tpl;
    
    if(!file_exists($tplfile)) {
        $tplfile = str_replace('/'.$_sconfig['template'].'/', '/default/', $tplfile);
    }
    $content = sreadfile($tplfile);
    return $content;
}

4).模板语法

在模板里面,是可以直接显示php的变量的,也可以使用if,else,循环等,模板解析函数会将这些变量替换成实际的变量值。
1.设置变量的值

表示将$_tpl['titles']变量设置为array(’日志’, ‘随便看看’);

2.变量的显示
直接写变量的名字 $_get[aa]

3.调用另外一个模板文件进来[模板里面再调用模板]
实际上相当于php中的
相当于template(”header”) 即解析/template/default/header.htm文件
4.条件判断
相当于php的if,else,但一定要结束一个if语句
5.循环

  

相当于php的foreach($list $key=>$value)

6.在模板写php代码
   
posted on 2011-11-28 23:20 -274°c 阅读(3460) 评论(0)  编辑  收藏 所属分类: php
网站地图