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目錄下的視圖文件。

並且前后台都有自己的父類控制器,以后可以在父類控制器里做一些權限控制的設置,也非常方便。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM