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