CodeIgniter 預設視圖目錄為 application/views/。若需支援多主題、多皮膚、多租戶架構,須動態修改視圖搜尋路徑。本文解析 Loader::add_package_path() 實現原理、正確用法、目錄結構要求、常見坑點。
// 在 Controller 建構子或基類 Controller 中
$this->load->add_package_path(FCPATH . 'skins/' . $this->config->item('base_skins') . '/');
// system/core/Loader.php
public function add_package_path($path, $view_cascade = TRUE) {
$path = rtrim($path, '/') . '/';
// 1. 加入 library/model/helper 搜尋路徑 (前插,優先級最高)
array_unshift($this->_ci_library_paths, $path);
array_unshift($this->_ci_model_paths, $path);
array_unshift($this->_ci_helper_paths, $path);
// 2. 關鍵:視圖路徑陣列 (鍵=路徑, 值=是否級聯)
$this->_ci_view_paths = array(
$path . 'views/' => $view_cascade
) + $this->_ci_view_paths;
// 3. 配置檔路徑
$config =& $this->_ci_get_component('config');
array_unshift($config->_config_paths, $path);
}
# 專案根目錄 / ├── application/ ├── skins/ # 自訂皮膚根目錄 │ ├── default/ # 主題 1 │ │ ├── views/ # ← 必須有 views 子目錄! │ │ │ ├── header.php │ │ │ └── footer.php │ │ ├── config/ │ │ └── libraries/ │ ├── blue/ # 主題 2 │ │ └── views/ │ └── mobile/ # 主題 3 │ └── views/ └── system/
⚠️ 必須在皮膚目錄下建立views/子目錄,所有視圖檔放在此處。add_package_path會自動拼接views/。
session->userdata('theme')
?? $this->config->item('default_theme')
?? 'default';
// 2. 註冊主題包路徑
$themePath = FCPATH . 'skins/' . $theme . '/';
if (is_dir($themePath)) {
$this->load->add_package_path($themePath);
} else {
log_message('error', "Theme not found: $themePath");
}
// 3. 可選:共用視圖資料
$this->data['current_theme'] = $theme;
}
}
// 使用範例
class Welcome extends MY_Controller {
public function index() {
// 載入順序:skins/current/views/welcome_message.php → application/views/welcome_message.php
$this->load->view('welcome_message', $this->data);
}
}
add_package_path($path, $view_cascade) 第二參數控制級聯行為:
| 值 | 行為 |
|---|---|
| TRUE (預設) | 若主題無此視圖,繼續搜尋下一個路徑 (如 application/views/) |
| FALSE | 找不到直接報錯,不繼續搜尋 |
建議保持 TRUE,實現「主題覆蓋核心,缺失回退核心」的繼承機制。
skins/主題/views/ 目錄存在add_package_path 路徑以 / 結尾 (方法內已處理)$this->load->view('name') 不含 .php 副檔名MyLib.php → class MyLibskins/主題/libraries/ 或 models/$this->load->_ci_view_paths = [] 重置 (需繼承 Loader)| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| add_package_path | 官方 API、支援繼承、零侵入 | 需遵循目錄結構 | 多主題、多租戶、插件系統 |
| 修改 VIEWPATH 常數 | 全域生效、簡單 | 單一路徑、無繼承、影響全站 | 單一主題部署 |
| 自定義 View Loader | 完全控制邏輯 | 維護成本高、升級風險 | 極度客製化需求 |
| 模板引擎 (Blade/Twig) | 繼承區塊、語法優雅 | 引入依賴、學習成本 | 複雜前端模板 |
掌握 add_package_path + views/ 目錄約定,即可在 CodeIgniter 中實現優雅、可維護的多主題架構。