zoukankan      html  css  js  c++  java
  • CI框架中自定义view文件夹位置

    要想自定义view文件夹的位置,首先要了解CI框架时如何加载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.php,然后在MY_Loader.php中修改$this->_ci_view_paths;

    这里用一个小例子来说明:

    我现在有一个网站,分为前台和后台,前台使用新的自定义view目录,定义在网站根目录下,命名为:D:/www/citest/view;

    后台的view目录就使用默认的view目录,位置:/application/view 。

    我们先在/application/core目录下新建一个MY_Loader.php文件:

    <?php
    defined('BASEPATH') OR exit('No direct script access allowed');
    class MY_Loader extends CI_Loader{ //开启新的视图目录 public function switch_view_on() { $this->_ci_view_paths = array(FCPATH . 'view/' =>true); //print_r($this->_ci_view_paths); } //关闭新的视图目录 public function switch_view_off() { #just do nothing } }

    然后在/application/core 目录下新建一个MY_Controller.php的 文件,然后写入两个类:

    <?php
    defined('BASEPATH') OR exit('No direct script access allowed');
    
    //定义前台总控制器
    class Home_Controller extends CI_Controller
    {
        public function __construct() {
            parent::__construct();
            #所有前台控制器都默认使用新的自定义视图目录
            $this->load->switch_view_on();
        }
    }
    
    //定义后台总控制器
    class Admin_Controller extends CI_Controller
    {
        public function __construct() {
            parent::__construct();
            #所有后台控制器都使用默认的视图目录
            $this->load->switch_view_off();
        }
    }
    

    疑点:为什么上述代码可以在Controller里面调用Loader类的方法呢?

    答:因为CI中的CI_Controller控制器有一个特殊的名字,叫做超级控制器,这个超级控制器里面集中了很多类库,其中就包括Loader类,所以可以在控制器中直接调用Loader类的方法。关于这个超级控制器,这里不再赘述,只是做一个抛砖引玉,有兴趣的童鞋,可以自己研究研究。

    ---------到这里修改完成--------。

    这样我们再写代码的时候,前台控制器就继承Home_Controller,当你使用$this->load->view()方法的时候,CI就会自动去加载你自定义的view目录下的视图文件。

    后台控制器就继承Admin_Contoller,当你使用$this->load->view()方法的时候,CI就会加载默认的view目录下的视图文件。

    并且前后台都有自己的父类控制器,以后可以在父类控制器里做一些权限控制的设置,也非常方便。

  • 相关阅读:
    SQL每日一题(20200512)
    SQL每日一题(20200506)
    SQL每日一题(20200509)
    sql每日一题(20200423)
    Oracle内存全面分析
    dbms_output.put与put_line
    oracle xml操作
    超级强大的破解极验滑动验证码--讲解非常详细
    python开发---目录
    Flask大全
  • 原文地址:https://www.cnblogs.com/superfat/p/5299064.html
Copyright © 2011-2022 走看看