要想自定義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目錄下的視圖文件。
並且前后台都有自己的父類控制器,以后可以在父類控制器里做一些權限控制的設置,也非常方便。
