uchome的模板处理方法

admin 撰写  

uchome的模板处理主要调用/source目录下的function_template.php文件中的parse_template函数实现(比起smarty可真是超轻量级了).
解析过程并不复杂,主要是读取模板文件(.htm),用规则表达式替换标记为PHP标准语法,最终生成一个标准的PHP文件,保存到缓存目录

1:读入模板文件,模板文件一般在template/default下面
Php代码
//read
if(!file_exists($tplfile)) {

$tplfile = str_replace(‘/’.$_SCONFIG['template'].’/', ‘/default/’, $tplfile);

}
$template = sreadfile($tplfile);
if(emptyempty($template)) {
exit(“Template file : $tplfile Not found or have no access!”);
}

//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!”);
}

2:对模板标记解析
变量:
Php代码
$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);

$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);
逻辑解析:

Php代码
//逻辑
$template = preg_replace(“/\{elseif\s+(.+?)\}/ies”, “stripvtags(‘‘,”)”, $template);
$template = preg_replace(“/\{else\}/is”, ““, $template);

//逻辑
$template = preg_replace(“/\{elseif\s+(.+?)\}/ies”, “stripvtags(‘‘,”)”, $template);
$template = preg_replace(“/\{else\}/is”, ““, $template);
循环和常量
//循环
Php代码
for($i = 0; $i < 5; $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);

for($i = 0; $i < 5; $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);
3:最后写入到/data/tpl_cache/目录下
Php代码
//write
if(!swritefile($objfile, $template)) {
exit(“File: $objfile can not be write!”);
}


条评论

  1. fsfsf
    发表了 2009年07月9日 在 10:17 上午 | 永久链接

    这样处理有什么好处吗

发表评论

Your email is never shared. 标记为 * 的为必填项目

*
*