這篇原本的標題是:[ Day 4 ] 找不到頁面網址?靠URL輔助函式(URL Helper Functions)就對了!
但,URL輔助函式的重點本來就是site_url() & base_url()這兩者,初學者如我,非常非常容易混淆,所以就改了標。
會出這篇是有這樣子的故事:
因為不小心把根目錄的偽靜態寫的亂七八糟,所以在「靜態頁面」的實作練習中~出現了未知的錯誤。
簡述當時發生的問題點:
welcome(預設頁面)成功讀取,修改的內容也成功重現,改掉載入的view也是okay,唯獨建立新的controller始終無法正確顯示,永遠404。
如前一篇所說,CI的網址會長這樣:
http://example.com/[控制器類別]/[控制器方法]/[參數們]
所以當網址被改動時,CI也會判讀錯誤的類別、方法,因此controller找不到檔案顯示404。
結論:受到.htaccess的影響,無法正確導向網頁。修改.htaccess檔案即能解決。
URL輔助函式能顯示「網站預設」及「指定頁面」的url,此時就能驗證「輸入的URL是否正確」。以便分辨是keyin錯誤,還是url錯誤。因為利用了這函式排除錯誤,在此想分享給大家。
CI為了做到輕量化,語法以及提供的功能都是精簡再精簡,並不會一開始就把所有函數載入,有需求時再載入。
載入URL輔助函數代碼:
$this->load->helper('url');
順帶一提,輔助函式並不只有URL一種,到底有哪些?輔助函式清單傳送門。有遇到會再提及的!
**但~我還是覺得,這樣超不方便,我每次都要用這個拉,他不能自己load好嗎?不管不管!這不是我要的肯德基!**聰明的CI開發者,怎麼可能沒考慮到這點呢?CI是有提供自動載入功能的!
編輯自動載入設定檔:
application/config/autoload.php
修改helper的設定
$autoload['helper'] = array();
範例:
$autoload['helper'] = array('url', 'file');
沒錯~除了自動載入可以用array載入,那單頁載入也可以,請見下方範例:
//單行載入
$this->load->helper('url');
$this->load->helper('file');
//陣列載入
$this->load->helper( array('url', 'file') );
這兩個函數讓我混淆很久,很榮幸可以在筆記一下這兩者的區別,這就是鐵人自我挑戰的意義吧(?)
首先,在CI的config中有兩個設定如下,說明及假設情形如下:
設定網站網址
$config['base_url'] = 'http://it-example.com/';
設定網站預設頁面
$config['index_page'] = 'index.php';
此時,site_url("page/func/params")和base_url("page/func/params")得到的結果是不同的!
site_url("page/func/params")
顧名思義指網站的網址,這個函式可以輸出指定「頁面」,不傳參數時顯示「預設頁面」的網址,例如:一開始的welcome page。
http://it-example.com/index.php/page/func/params
base_url("page/func/params")
這個函數也是輸出網站的網址,不同的是,他不會將index.php帶入,也就是不會帶出「預設頁面」,此函式著重使用在網址路徑得部分,常用於「引入」檔案,例如:引入CSS、javaScript至網站。
http://it-example.com/page/func/params
http://example.com/index.php/news/local/123
以user guide為例子,呈現尚方結果的方法有兩種:
echo site_url("news/local/123");
$segments = array('news','local','123');
echo site_url($segments);
當然,base_url()也能用array的方法傳入,就不特別說明囉!
##結語
終於敲完這篇了,外出整天又要出文章,真是搞死我了,學習無止盡,這也是鐵人需要連續不斷賽的意義,要撐住。