• CI(Codeigniter)框架自定义视图文件位置


    你想自定义view的文件位置,则需要了解CI框架如何加载view视图文件的。

    $this->load->view(); 这行代码的原理是什么?
    

    我们打开application/core/Loader.php,里面有一个这样的方法:

    
        public function add_package_path($path, $view_cascade = TRUE)
        {
            $path = rtrim($path, '/').'/';
    
            array_unshift($this->_ci_library_paths, $path);
            array_unshift($this->_ci_model_paths, $path);
            array_unshift($this->_ci_helper_paths, $path);
                    //这一行代码就是加载view的操作,你想自定义则修改即可。
            $this->_ci_view_paths = array($path.'views/' => $view_cascade) + $this->_ci_view_paths;
    
            // Add config file path
            $config =& $this->_ci_get_component('config');
            $config->_config_paths[] = $path;
    
            return $this;
        }
    

    但本着可扩展性的原则,我们不去修改源代码,而是使用继承的原则来解决这个问题:

    方法:自定义一个MY_Loader.php类继承自Loader,然后在方法中修改$this->_ci_view_paths;

    案例如下:
    有一个网站,分前后台,前台的目录使用自定义的目录,后台使用默认的application/views/下的文件。
    首先在/application/core/下定义一个MY_Loader.php文件:

    class MY_Loader extends CI_Loader
    {
        protected $_theme = 'default/';
    
        #开启新的视图目录,调用$this->load->view()时,则调用themes/default/下的view文件
        public function switch_themes_on()
        {
            $this->_ci_view_paths = array(FCPATH . THEMES_DIR . $this->_theme => true);
        }
    
        #关闭新的试图目录,调用$this->load->view()时,则调用application/views/下的view文件
        public function switch_themes_off()
        {
            //just do nothing
        }
    }
    

    其次,在/application/core/中自定义一个控制类MY_Controller.php继承自CI_Controller类,

    //前台控制器
    class Home_Controller extends CI_Controller{
        public function __construct()
        {
            parent::__construct();
            #开启新视图文件
            $this->load->switch_themes_on();
        }
    }
    //后台控制器
    class Admin_Controller extends CI_Controller{
        public function __construct()
        {
            parent::__construct();
            #关闭新视图文件
            $this->load->switch_themes_off();
        }
    }
    
    

    最后,当你编写前台代码时,控制器继承Home_Controller,则加载视图时会自动加载application/themes/default中的view文件。 后台控制器则继承Admin_Controller,当你使用$this->load->view()方法的时候,CI就会加载默认的view目录下的视图文件。



    作者:于阗
    链接:https://www.jianshu.com/p/0dbe866fbef5
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    vivim (十一):文本重排
    vivim (十):接出(复制)
    python的函数
    从oracle11g向oracle9i导数据遇到的一些问题
    vivim (十二):中介字元正则表达式
    DataList如何实现横向排列数据交替行变色!
    跳出率对百度排名的影响越来越大
    asp.net 服务器端控件使用服务器端变量
    .net .用户控件和页面的加载顺序、生命周期
    网站如何让被DOMZ收录
  • 原文地址:https://www.cnblogs.com/gaogaoxingxing/p/10845673.html
Copyright © 2020-2023  润新知