$this->load->view() 第二參數必須是陣列或物件CI 內部將第二參數陣列的「鍵」提取為視圖中的「變量名」。直接傳遞非陣列(如 result() 返回的物件陣列)會導致視圖無法訪問預期變量。
// 錯誤:直接傳遞 result() 物件陣列
$query = $this->db->query("SELECT id, name, url FROM cg_link");
$links = $query->result();
$this->load->view('link', $links); // View 中無 $links 變量,會報錯
// 正確:封裝為關聯陣列
$data['links'] = $links;
$this->load->view('link', $data); // View 中可直接用 $links
row() vs row_array()$sql = "SELECT id, name, url FROM cg_link WHERE id = 21 LIMIT 1";
$query = $this->db->query($sql);
// 物件風格
$row = $query->row(); // 返回 stdClass 物件
echo $row->name; // View 中同樣需 $data['row'] = $row;
// 陣列風格(推薦,視圖直接用 $row['name'])
$row = $query->row_array();
$data['row'] = $row;
$this->load->view('link', $data);
// 1. 多視圖拼接(第三參數 TRUE 返回字串而非輸出)
$header = $this->load->view('templates/header', $data, TRUE);
$body = $this->load->view('link', $data, TRUE);
$footer = $this->load->view('templates/footer', $data, TRUE);
echo $header . $body . $footer;
// 2. 視圖片段緩存(需配合輸出緩存或第三方庫)
if (! $cached = $this->cache->get('link_view_' . $cache_key)) {
$cached = $this->load->view('link', $data, TRUE);
$this->cache->save('link_view_' . $cache_key, $cached, 3600);
}
echo $cached;
| 誤區 | 正確認知 |
|---|---|
以為 $this->db->result() 可直接給 View | 必須 $data['var'] = $result |
以為 row() 返回陣列 | 返回物件,需 row_array() 或視圖用 $row->field |
| 視圖中變量未定義卻不報錯 | PHP 錯誤等級未含 E_NOTICE,建議開發環境 error_reporting(E_ALL) |
render()class MY_Controller extends CI_Controller {
protected function render($view, $data = [], $return = FALSE) {
// 自動注入通用變量:當前用戶、CSRF、配置等
$data = array_merge($this->common_view_data(), $data);
$this->load->view('templates/header', $data);
$this->load->view($view, $data);
$this->load->view('templates/footer', $data);
}
}
統一入口減少重複代碼,確保每個視圖都能預期到所需變量。