你想自定義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;
案例如下:
有一個網(wǎng)站咙俩,分前后臺耿戚,前臺的目錄使用自定義的目錄,后臺使用默認的application/views/下的文件阿趁。
首先在/application/core/下定義一個MY_Loader.php文件:
class MY_Loader extends CI_Loader
{
protected $_theme = 'default/';
#開啟新的視圖目錄膜蛔,調(diào)用$this->load->view()時,則調(diào)用themes/default/下的view文件
public function switch_themes_on()
{
$this->_ci_view_paths = array(FCPATH . THEMES_DIR . $this->_theme => true);
}
#關(guān)閉新的試圖目錄脖阵,調(diào)用$this->load->view()時皂股,則調(diào)用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();
#關(guān)閉新視圖文件
$this->load->switch_themes_off();
}
}
最后呜呐,當你編寫前臺代碼時,控制器繼承Home_Controller悍募,則加載視圖時會自動加載application/themes/default中的view文件蘑辑。 后臺控制器則繼承Admin_Controller,當你使用$this->load->view()方法的時候搜立,CI就會加載默認的view目錄下的視圖文件以躯。