zoukankan      html  css  js  c++  java
  • smarty编译过程

    (基于V2.6.20)

    1,Smarty.class.php

    //构造函数
    function Smarty()
    {
    $this->assign('SCRIPT_NAME', ...);
    }

    //assign函数
    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;
    }
    }
    重要:$this->_tpl_vars是保存模板变量的

    //display方法
    function display($resource_name, $cache_id = null, $compile_id = null)
    {
    $this->fetch($resource_name, $cache_id, $compile_id, true);
    }

    //这个方法的逻辑还没有完全梳理清楚
    function fetch($resource_name, $cache_id = null, $compile_id = null, $display = false)
    {
    //debug....
    //cache....
    //调用方法_compile_resource来编译
    }


    //
    function _compile_resource($resource_name, $compile_path)
    {
    //调用方法_compile_source
    }

    /**
    * 编译给出的模板文件
    *
    * @param string $resource_name
    * @param string $source_content
    * @param string $compiled_content
    * @return boolean
    */
    function _compile_source($resource_name, &$source_content, &$compiled_content, $cache_include_path=null)
    {
    if (file_exists(SMARTY_DIR . $this->compiler_file)) {
    require_once(SMARTY_DIR . $this->compiler_file);
    } else {
    // use include_path
    require_once($this->compiler_file);
    }

    //实例化编译对象
    $smarty_compiler = new $this->compiler_class; //Smarty_Compiler

    //初始化编译对象(传递相关的变量,包括上面的模板变量)
    $smarty_compiler->template_dir = $this->template_dir;
    $smarty_compiler->compile_dir = $this->compile_dir;
    $smarty_compiler->plugins_dir = $this->plugins_dir;
    $smarty_compiler->config_dir = $this->config_dir;
    $smarty_compiler->force_compile = $this->force_compile;
    $smarty_compiler->caching = $this->caching;
    $smarty_compiler->php_handling = $this->php_handling;
    $smarty_compiler->left_delimiter = $this->left_delimiter;
    $smarty_compiler->right_delimiter = $this->right_delimiter;
    $smarty_compiler->_version = $this->_version;
    $smarty_compiler->security = $this->security;
    $smarty_compiler->secure_dir = $this->secure_dir;
    $smarty_compiler->security_settings = $this->security_settings;
    $smarty_compiler->trusted_dir = $this->trusted_dir;
    $smarty_compiler->use_sub_dirs = $this->use_sub_dirs;
    $smarty_compiler->_reg_objects = &$this->_reg_objects;
    $smarty_compiler->_plugins = &$this->_plugins;
    $smarty_compiler->_tpl_vars = &$this->_tpl_vars; //模板变量
    $smarty_compiler->default_modifiers = $this->default_modifiers;
    $smarty_compiler->compile_id = $this->_compile_id;
    $smarty_compiler->_config = $this->_config;
    $smarty_compiler->request_use_auto_globals = $this->request_use_auto_globals;

    if (isset($cache_include_path) && isset($this->_cache_serials[$cache_include_path])) {
    $smarty_compiler->_cache_serial = $this->_cache_serials[$cache_include_path];
    }
    $smarty_compiler->_cache_include = $cache_include_path;


    //编译
    $_results = $smarty_compiler->_compile_file($resource_name, $source_content, $compiled_content);

    if ($smarty_compiler->_cache_serial) {
    $this->_cache_include_info = array(
    'cache_serial'=>$smarty_compiler->_cache_serial
    ,'plugins_code'=>$smarty_compiler->_plugins_code
    ,'include_file_path' => $cache_include_path);

    } else {
    $this->_cache_include_info = null;

    }

    return $_results;
    }



    2,Smarty_Compiler.class.php

    //构造函数
    function Smarty_Compiler(){
    //初始化各种匹配用的正则表达式,例如匹配函数的:$this->_func_regexp = '[a-zA-Z_]\w*';
    }


    //编译,使用$compiled_content返回编译好的php代码
    /*
    返回的代码包括两部分:
    1,头部,如下:
    <?php //Smarty version 2.6.20, created on 2009-12-21 10:38:57 compiled from index.tpl
    ?>
    <?php
    require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
    //加载自定义插件,如load_data
    smarty_core_load_plugins(array('plugins' => array(array('function', 'load_data', 'index.tpl', 20, false),)), $this); ?>
    <?php $_smarty_tpl_vars = $this->_tpl_vars; //模板变量赋值
    //加载头部模板
    $this->_smarty_include(array('smarty_include_tpl_file' => 'header.tpl', 'smarty_include_vars' => array()));
    $this->_tpl_vars = $_smarty_tpl_vars;
    unset($_smarty_tpl_vars);
    ?>

    2,模板主体
    */
    function _compile_file($resource_name, $source_content, &$compiled_content){
    //处理文本块
    //编译所有标签,调用_compile_tag方法(重要)
    }
    注:
    1,literal标签内的数据smarty不会去分析(可用于显示有可能包含大括号等字符信息的 javascript脚本)
    2,可以使用php标签来嵌套php代码

    参考:http://code.google.com/p/cyy0523xc/source/browse/trunk/php/Smarty%E7%BC%96%E8%AF%91%E8%BF%87%E7%A8%8B.txt

  • 相关阅读:
    异常处理(五)
    抽象与接口(七)
    MYSQL创建数据库时候直接指定编码和排序规则
    C#基本语法(一)
    C#中字符串处理(三)
    Ajax实例化(五)
    C#函数(二)
    MemberCache学习摘要
    ORACLE 根据日期范围自动日期table
    动态执行SQL语句,并输出参数
  • 原文地址:https://www.cnblogs.com/zcy_soft/p/1999062.html
Copyright © 2011-2022 走看看