iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 4
2
自我挑戰組

自學CodeIgniter跌跌撞撞30天系列 第 4

[ Day 4 ] 找不到頁面網址?用URL輔助函式卻site_url() & base_url()傻傻分不清楚?

題外話

這篇原本的標題是:[ 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,此時就能驗證「輸入的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') );

site_url() & base_url()

這兩個函數讓我混淆很久,很榮幸可以在筆記一下這兩者的區別,這就是鐵人自我挑戰的意義吧(?)
首先,在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

最後,找出網址錯誤,當然是使用site_url()囉!

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的方法傳入,就不特別說明囉!

##結語
終於敲完這篇了,外出整天又要出文章,真是搞死我了,學習無止盡,這也是鐵人需要連續不斷賽的意義,要撐住。


上一篇
[ Day 3 ] CodeIgniter 靜態頁面:萬年老梗Hello World !
下一篇
[ Day 5 ] CodeIgniter第二個手作:新聞列表 (1):設定連線 & 前置作業。
系列文
自學CodeIgniter跌跌撞撞30天12

尚未有邦友留言

立即登入留言