码迷,mamicode.com
首页 > 其他好文 > 详细

CI框架中自定义view文件夹位置

时间:2016-03-20 19:21:43      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

要想自定义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目录下的视图文件。

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

 

CI框架中自定义view文件夹位置

标签:

原文地址:http://www.cnblogs.com/superfat/p/5299064.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!