phpcms源码解析之模板编译函数

阅读更多

上节讲到了模板调用函数,其中调用了模板编译函数。该函数在template.caches.class.php类中定义的。下面讲解一下模板编译函数

/**
	 * 编译模板
	 *
	 * @param $module	模块名称
	 * @param $template	模板文件名
	 * @param $istag	是否为标签模板
	 * @return unknown
	 */
	
	public function template_compile($module, $template, $style = 'default') {
		if(strpos($module, '/')=== false) { 
		$tplfile = $_tpl = PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html';
		} elseif (strpos($module, 'yp/') !== false) { //黄页模块
			$module = str_replace('/', DIRECTORY_SEPARATOR, $module);
			$tplfile = $_tpl = PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html';
		} else {
			$plugin = str_replace('plugin/', '', $module); //插件模板
			$module = str_replace('/', DIRECTORY_SEPARATOR, $module);
			$tplfile = $_tpl = PC_PATH.'plugin'.DIRECTORY_SEPARATOR.$plugin.DIRECTORY_SEPARATOR.'templates'.DIRECTORY_SEPARATOR.$template.'.html';
		}
		
		if ($style != 'default' && !file_exists ( $tplfile )) {
			//模板风格不是default,模板文件未指定
			//则设置风格为default ,并制定模板文件
			$style = 'default';
			$tplfile = PC_PATH.'templates'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html';
		}
		
		//模板文件不存在
		if (! file_exists ( $tplfile )) {
			showmessage ( "templates".DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.".html is not exists!" );
		}
		
		//将模板文件读入到字符串$content中
		$content = @file_get_contents ( $tplfile );
		
		
		//新建缓存文件路径
		/*
		 * 缓存文件路径
		 * /caches/caches_template/default/$module/
		 * */
		$filepath = CACHE_PATH.'caches_template'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR;
	    //新建文件目录
		if(!is_dir($filepath)) {
			mkdir($filepath, 0777, true);
	    }
		$compiledtplfile = $filepath.$template.'.php'; //编译的缓存文件
		//调用模板解析函数
		$content = $this->template_parse($content);
		//将字符串$content中的数据写入到文件$compiledtplfile
		$strlen = file_put_contents ( $compiledtplfile, $content ); //将获取的内容写到缓存文件
		chmod ( $compiledtplfile, 0777 ); //改变文件权限
		return $strlen;
	}


上面调用到了模板解析函数template_parse(str)

	/**
	 * 解析模板
	 *
	 * @param $str	模板内容
	 * @return ture
	 */
	public function template_parse($str) {
		$str = preg_replace ( "/\{template\s+(.+)\}/", "", $str );
		$str = preg_replace ( "/\{include\s+(.+)\}/", "", $str );
		$str = preg_replace ( "/\{php\s+(.+)\}/", "", $str );
		$str = preg_replace ( "/\{if\s+(.+?)\}/", "", $str );
		$str = preg_replace ( "/\{else\}/", "", $str );
		$str = preg_replace ( "/\{elseif\s+(.+?)\}/", "", $str );
		$str = preg_replace ( "/\{\/if\}/", "", $str );
		//for 循环
		$str = preg_replace("/\{for\s+(.+?)\}/","",$str);
		$str = preg_replace("/\{\/for\}/","",$str);
		//++ --
		$str = preg_replace("/\{\+\+(.+?)\}/","",$str);
		$str = preg_replace("/\{\-\-(.+?)\}/","",$str);
		$str = preg_replace("/\{(.+?)\+\+\}/","",$str);
		$str = preg_replace("/\{(.+?)\-\-\}/","",$str);
		$str = preg_replace ( "/\{loop\s+(\S+)\s+(\S+)\}/", "", $str );
		$str = preg_replace ( "/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}/", " \\3) { ?>", $str );
		$str = preg_replace ( "/\{\/loop\}/", "", $str );
		$str = preg_replace ( "/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/", "", $str );
		$str = preg_replace ( "/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/", "", $str );
		$str = preg_replace ( "/\{(\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/", "", $str );
		$str = preg_replace("/\{(\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\}/es", "\$this->addquote('')",$str);
		$str = preg_replace ( "/\{([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)\}/s", "", $str );
		$str = preg_replace("/\{pc:(\w+)\s+([^}]+)\}/ie", "self::pc_tag('$1','$2', '$0')", $str);
		$str = preg_replace("/\{\/pc\}/ie", "self::end_pc_tag()", $str);
		$str = "" . $str;
		return $str;
	}

 

另外在附上模板缓存更新函数

/**
	 * 更新模板缓存
	 *
	 * @param $tplfile	模板原文件路径
	 * @param $compiledtplfile	编译完成后,写入文件名
	 * @return $strlen 长度
	 */
	public function template_refresh($tplfile, $compiledtplfile) {
		$str = @file_get_contents ($tplfile);
		$str = $this->template_parse ($str);
		$strlen = file_put_contents ($compiledtplfile, $str );
		chmod ($compiledtplfile, 0777);
		return $strlen;
	}
	

 

改函数使用了大量的正则表达式,主要是用来处理模板文件中使用到的标签,将之转换为php代码。

你可能感兴趣的:(php,phpcms,phpcms源码)