一.CI(Codeigniter)框架自定義檢視檔案位置

weixin_33728268發表於2017-08-24

你想自定義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;

案例如下:
有一個網站,分前後臺,前臺的目錄使用自定義的目錄,後臺使用預設的application/views/下的檔案。
首先在/application/core/下定義一個MY_Loader.php檔案:

class MY_Loader extends CI_Loader
{
    protected $_theme = 'default/';

    #開啟新的檢視目錄,呼叫$this->load->view()時,則呼叫themes/default/下的view檔案
    public function switch_themes_on()
    {
        $this->_ci_view_paths = array(FCPATH . THEMES_DIR . $this->_theme => true);
    }

    #關閉新的試圖目錄,呼叫$this->load->view()時,則呼叫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();
        #關閉新檢視檔案
        $this->load->switch_themes_off();
    }
}

最後,當你編寫前臺程式碼時,控制器繼承Home_Controller,則載入檢視時會自動載入application/themes/default中的view檔案。 後臺控制器則繼承Admin_Controller,當你使用$this->load->view()方法的時候,CI就會載入預設的view目錄下的檢視檔案。

相關文章