ecmall语言文件的加载使用流程

来源:互联网 发布:中文房间 知乎 编辑:程序博客网 时间:2024/05/21 15:46

1,ECMall startup函数启动,定义APP常量


        $app    = isset($_REQUEST['app']) ? preg_replace('/(\W+)/','', $_REQUEST['app']) : $default_app;

        define('APP', $app);


2,frontend.base.php或者backend.base.php构造函数加载语言文件

        Lang::load(lang_file('common'));

        Lang::load(lang_file(APP));


3,Lang类的加载定义实现


    function load($lang_file)

    {

        static $loaded = array();

        $old_lang = $new_lang = array();

        $file_md5 = md5($lang_file);

        if (!isset($loaded[$file_md5]))

        {

            $new_lang = Lang::fetch($lang_file);

            $loaded[$file_md5] = $lang_file;

        }

        else

        {

            return;

        }

        $old_lang =& $GLOBALS['__ECLANG__'];

        if (is_array($old_lang))

        {

            $new_lang = array_merge($old_lang, $new_lang);

        }


        $GLOBALS['__ECLANG__'] = $new_lang;

    }


加载文件内容数组

    function fetch($lang_file)

    {

        return is_file($lang_file) ? include($lang_file) : array();

    }


构建语言文件名称

function lang_file($file)

{

    return ROOT_PATH . '/languages/'. LANG . '/' . $file . '.lang.php';

}


file变量即为请求的app名称,在ecmall启动函数中被设置


4,获取加载好的语言数据

app在display数据时使用基类ecapp.base.php的display

里面调用 

        /* 语言项 */

        $this->assign('lang', Lang::get());

设置语言数据


 Lang::get 获取预研key值

    function &get($key = '')

    {

        if (Lang::_valid_key($key) == false)

        {

            return $key;

        }

        $vkey = $key ? strtokey("{$key}",'$GLOBALS[\'__ECLANG__\']') : '$GLOBALS[\'__ECLANG__\']';

        $tmp = eval('if(isset('. $vkey . '))return ' . $vkey . ';else{ return $key; }');


        return $tmp;

    }


ecapp.base.php使用基类的app.base.phpassign函数给视图传递变量。

    function assign($k, $v = null)

    {

        $this->_init_view();

        if (is_array($k))

        {

            $args  = func_get_args();

            foreach ($args as $arg)     //遍历参数

            {

                foreach ($arg as $key => $value)    //遍历数据并传给视图

                {

                    $this->_view->assign($key, $value);

                }

            }

        }

        else

        {

            $this->_view->assign($k, $v);

        }

    }


app.base.phpassign调用_view既是template.php的assign函数为视图添加变量。

    function assign($tpl_var, $value = '')

    {

        if (is_array($tpl_var))

        {

            foreach ($tpl_var AS $key => $val)

            {

                if ($key != '')

                {

                    $this->_var[$key] = $val;

                }

            }

        }

        else

        {

            if ($tpl_var != '')

            {

                $this->_var[$tpl_var] = $value;

            }

        }

    }


5,在视图类中设置模板后,既可以使用了。

ecapp.base.php 的display函数

        parent::display($f);

调用父类app.base.php的display函数

    function display($n)

    {

        $this->_init_view();

        $this->_view->display($n);

    }

既调用了template.php的display函数。