文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>我的完全面向对象的简单模板引擎

我的完全面向对象的简单模板引擎

时间:2007-07-28  来源:lib

我的完全面向对象的简单模板引擎
以前写的一个模板引擎,思路源于discuz
现在有空整理出来与大家交流交流

示例文件下载
http://www.phpchina.com/bbs/attachment.php?aid=11316


?php
/**
* 简单模板类
*
* 流水孟春 [email protected]
* 大家给给意见和建议
*
*/
class View {
    /**#@+
     * View Configuration Section
     */
    public $template_dir = 'templates/default/';
    public $template_suffix = '.htm'; // 模板的后缀
    public $compiled_dir = 'templates/compiled/';
    public $compiled_suffix = '.tpl.php'; // 编译后模板的后缀
    public $compile_check = true; // 在这个模板引擎中作用不大,
    public $force_compile = true;
    public $left_delimiter = '{';
    public $right_delimiter = '}';
    const VERSION = 0.1;
    /**#@+
     * END View Configuration Section
     * There should be no need to touch anything below this line.
     * @access private
     */
    private $_tpl_vars = array();
    private $_resource_name = null;
    private $_compiled_id = '';
    private $_resource_file = null;
    private $_compiled_file = null;
    /**#@-*/
    /**
     * 调用模板
     * @param string $resource_name 输入框名称
     * @param string $compiled_id 模板编译id
     */
    public function display($resource_name, $compiled_id = null){
        if (isset($compiled_id)) {
            $this->_compiled_id = $compiled_id; // 设置模板
        }
        $this->_resource_name = $resource_name; // 设置模板名
        $this->_resource_file = $this->template_dir . $this->_resource_name; // 模板路径
        $this->_compiled_file = $this->compiled_dir . $this->_compiled_id . '^'
             . $this->_resource_name . $this->compiled_suffix; // 模板编译成的文件
        if(($this->force_compile) || !file_exists($this->_compiled_file)) {// 如果编译后的文件不存在
            $this->_parse($this->_resource_file, $this->_compiled_file);
        } elseif ($this->compile_check){
            if (filemtime($this->_resource_file) >= filemtime($this->_compiled_file)) { // 如果文件被更改过则更新
                $this->_parse($this->_resource_file, $this->_compiled_file);
            }
        }
        require $this->_compiled_file;
    }
    /**
     * 模板变量赋值
     *
     * @param mixed $tpl_var 变量名
     * @param mixed $value 变量的值
     */
    public function assign($tpl_var, $value = null) {
        if (is_array($tpl_var)){
            foreach ($tpl_var as $key => $val) {
                if ($key != '') {
                    $this->_tpl_vars[$key] = $val;
                }
            }
        } else {
            if ($tpl_var != '')
                $this->_tpl_vars[$tpl_var] = $value;
        }
    }
    /**
     * 编译模板
     *
     */
    private function _parse($resource, $compiled) {
        if(!@$fp = fopen($resource, 'r')) {
            die("Current template file '" . str_replace('\\', '/', getcwd()) . "/$resource' not found or have no access!");
        }
     $template = fread($fp, filesize($resource));
        fclose($fp);
        $var_regexp = "((\\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)(\[[a-zA-Z0-9_\-\.\"\'\[\]\$\x7f-\xff]+\])*)";
        $const_regexp = "([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)";
     $template = preg_replace("/[\n\r\t]*\{import\s+([a-z0-9_]+)\}[\n\r\t]*/ies","trim(self::_import('$this->template_dir\\1$this->template_suffix'))", $template);
        $template = preg_replace("/[\n\r\t]*\{import\s+(.+?)\}[\n\r\t]*/ies", "trim(self::_import('$this->template_dir\\1$this->template_suffix'))", $template);
        $template = preg_replace("/([\n\r]+)\t+/s", "\\1", $template); // 每行前面的空格都去掉
        $template = preg_replace("/\/s", "{\\1}", $template); // 把 中的去掉
        $template = preg_replace("/\{(if.+?)\}/s", "{\\1 }", $template); // 把 {if $xx} => {if $xx } 为了使$xx可以是$xx['xx']
file_put_contents('xx3.php',$template);
        $template = preg_replace("/\{\\\$$const_regexp\.$const_regexp\}/s", "_tpl_vars['\\1']['\\2']?>", $template); // 把 {$xx.xx} => ?=$this->_tpl_vars['xx']['xx'] ? >
        $template = preg_replace("/\{\\\$$const_regexp\.$const_regexp\.$const_regexp\}/s", "_tpl_vars['\\1']['\\2']['\\3']?>", $template); // 把 {$xx.xx.xx} => ?=$this->_tpl_vars['xx']['xx']['xx'] ? >
        $template = preg_replace("/\{\\\$([a-zA-Z0-9_\[\]\'\"\$\.\x7f-\xff]+)\}/s", "_tpl_vars['\\1']?>", $template); // {$var} => ?=$this->_tpl_vars['var'] ? >
        $template = preg_replace("/\\?\>/es", "self::_add_quote('')", $template); // ?=?=string ? >? > => ?=string ? >
        $template = preg_replace("/[\n\r\t]*\{elseif\s+\\\$$const_regexp(.+?)\}[\n\r\t]*/ies", "self::_strip_tags('\n_tpl_vars[\'\\1\']\\2) : ?>\n','')", $template); // ...
        $template = preg_replace("/[\n\r\t]*\{else\}[\n\r\t]*/is", "\n\n", $template); // ...
        for($i = 0; $i  5; $i++) {
            $template = preg_replace("/[\n\r\t]*\{loop\s+\\\$(\S+)\s+\\\$(\S+)\}[\n\r]*(.+?)[\n\r]*\{\/loop\}[\n\r\t]*/ies", "self::_strip_tags('\n_tpl_vars[\'\\1\']) ) : \n foreach($this->_tpl_vars[\'\\1\'] as $this->_tpl_vars[\'\\2\']) : ?>','\n\\3\n\n')", $template); // loop => foreach
            $template = preg_replace("/[\n\r\t]*\{loop\s+\\\$(\S+)\s+\\\$(\S+)\s+\\\$(\S+)\}[\n\r\t]*(.+?)[\n\r\t]*\{\/loop\}[\n\r\t]*/ies", "self::_strip_tags('\n_tpl_vars[\'\\1\'])) : \n foreach($this->_tpl_vars[\'\\1\'] as $this->_tpl_vars[\'\\2\'] => $this->_tpl_vars[\'\\3\']) : ?>','\n\\4\n')", $template); // loop => foreach too
            $template = preg_replace("/[\n\r\t]*\{if\s+(.?)\\\$$const_regexp(.+?)\}[\n\r]*(.+?)[\n\r]*\{\/if\}[\n\r\t]*/ies", "self::_strip_tags('\n_tpl_vars[\'\\2\']\\3) : ?>','\n\\4\n\n')", $template); //  => ?php if($cat) { ? >
        }
        $template = preg_replace("/\{$const_regexp\}/s", "", $template); //{CONST} => ?=CONST ? >
        $template = preg_replace("/ \?\>[\n\r]*\, " ", $template); // ? > ""
        $template = preg_replace("/[\n\r\t]*\{attr\s+([a-z0-9_]+)\}[\n\r\t]*/is","\\1) ?>", $template); // 输出模板变量 {attr left_delimiter} => {
        if(!@$fp = fopen($compiled, 'w')) {
            die("Directory '" . str_replace('\\', '/', getcwd()) . "/$this->_compiled_file' not found or have no access!");
        }
        $template = preg_replace("/\"(http)?[\w\.\/:]+\?[^\"]+?&[^\"]+?\"/e", "self::_trans_amp('\\0')", $template);
        $template = preg_replace("/\]*?src=\"(.+?)\".*?\>\s*\/ise", "_strip_script_amp('\\1')", $template);
        $template = "\n$template";
        $template = str_replace('$this->_tpl_vars', '$this->_tpl_vars', $template);
        flock($fp, 2);
        fwrite($fp, $template);
        fclose($fp);
    }
    private static function _trans_amp($str) {
        $str = str_replace('&', '&', $str);
        $str = str_replace('&', '&', $str);
        $str = str_replace('\"', '"', $str);
        return $str;
    }
    private static function _add_quote($var) {
        return str_replace("\\\"", "\"", preg_replace("/\[([a-zA-Z0-9_\-\.\x7f-\xff]+)\]/s", "['\\1']", $var));
    }
    private static function _strip_tags($expr, $statement) {
        $expr = str_replace("\\\"", "\"", preg_replace("/\/s", "\\1", $expr));
        $statement = str_replace("\\\"", "\"", $statement);
        return $expr.$statement;
    }
    private static function _strip_script_amp($s) {
        $s = str_replace('&', '&', $s);
        return "";
    }
    /**
     *
     */
    private static function _import($resource){
        if(!@$fp = fopen($resource, 'r')) {
            die("Current template file '$resource' not found or have no access when import it!");
        }
     $content = fread($fp, filesize($resource));
        fclose($fp);
        return $content;
    }
    public function __get($att) {
        return $this->$att;
    }
}
?>

相关阅读 更多 +
排行榜 更多 +
下载oe

下载oe

金融理财 下载
易欧app官方下载安装

易欧app官方下载安装

金融理财 下载
易欧app官方免费下载

易欧app官方免费下载

金融理财 下载