在上一節(jié)中,我們通過如何寫出一個(gè)包含靜態(tài)頁面的類來了解了一些這個(gè)框架的基本概念。我們也根據(jù)自定義路由規(guī)則重新梳理了URI。現(xiàn)在是時(shí)候向大家介紹動態(tài)內(nèi)容和如何使用數(shù)據(jù)庫了。
數(shù)據(jù)庫的運(yùn)算并不是在控制類中進(jìn)行的,而是在數(shù)據(jù)模型中,這樣他們就可以在后面很容易地被反復(fù)使用。數(shù)據(jù)模型就是對你的數(shù)據(jù)庫或其他數(shù)據(jù)存儲方式進(jìn)行取回、插入和更新的地方,它們的功能是展示你的數(shù)據(jù)(They represent your data)。
打開 application/models 文件夾新建一個(gè)文件 news_model.php ,代碼如下。確保你已經(jīng)按照 這里的說明配置了自己的數(shù)據(jù)庫并且數(shù)據(jù)庫服務(wù)器與PHP.ini有相應(yīng)配置。
這段代碼和早前寫過的控制器的代碼類似。它創(chuàng)建了一個(gè)繼承 CI_Model 的數(shù)據(jù)模型,并用來載入數(shù)據(jù)庫。通過 $this->db 對象就可以使用數(shù)據(jù)庫類了。
在對數(shù)據(jù)庫進(jìn)行查詢前,我們要先建一個(gè)數(shù)據(jù)表。連接你的數(shù)據(jù)庫并執(zhí)行下面的 SQL 命令,并在里面加些內(nèi)容。
現(xiàn)在數(shù)據(jù)庫和數(shù)據(jù)模型都設(shè)置好了,我們需要一個(gè)方法來把我們的文章從數(shù)據(jù)庫中讀取出來。數(shù)據(jù)庫抽象層已經(jīng)包含在CodeIgniter的 Active Record模式 中了。這樣可以確保只寫一次查詢就可以應(yīng)用到 所有的數(shù)據(jù)庫系統(tǒng)上。在你的數(shù)據(jù)庫模型中添加如下代碼。
通過上面的代碼可以實(shí)現(xiàn)兩個(gè)不同的查詢,你可以得到所有的新聞紀(jì)錄,也可以通過 slug得到某一篇新聞。你可能注意到了 $slug 變量在查詢前并沒有被檢驗(yàn)過(sanitized),因?yàn)锳ctive Record類已經(jīng)把這個(gè)工作做完啦。
既然查詢已經(jīng)寫完了,我們就要把這個(gè)數(shù)據(jù)模型和用來顯示新聞內(nèi)容的視圖聯(lián)系起來了。其實(shí)這個(gè)工作在我們之前寫的pages控制類中就可以實(shí)現(xiàn),但為了更清楚地向大家說明,我們來定義一個(gè)新的news控制類 application/controllers/news.php,代碼如下。
看看上面的代碼就會發(fā)現(xiàn)和我們之前寫過的文件相似。首先,__construct方法是父級類 (CI_Controller) 的構(gòu)造函數(shù),并調(diào)用了數(shù)據(jù)模型,這樣這個(gè)控制器中的其他方法就能使用那個(gè)數(shù)據(jù)模型了。
其次,這里有兩個(gè)方法分別用來顯示所有的新聞和某一條。在第二個(gè)方法中可以看到 $slug 變量被傳遞給了數(shù)據(jù)模型中的方法。數(shù)據(jù)模型就是用這個(gè)slug來確定需要返回哪一篇文章的。
現(xiàn)在通過數(shù)據(jù)模型,數(shù)據(jù)已經(jīng)被控制器獲得了,但還無法顯示出來。下面我們就要把數(shù)據(jù)傳遞給視圖了。
上面的代碼從數(shù)據(jù)模型中獲得了所有新聞的記錄,并把它們賦值給了一個(gè)變量。頁面的標(biāo)題也賦給了 $data['title'] ,這些所有的數(shù)據(jù)都會傳遞給視圖。現(xiàn)在你需要創(chuàng)建一個(gè)視圖來顯示這些新聞。新建 application/views/news/index.php 代碼如下。
在這里,每條新聞都被循環(huán)出來展示給讀者了。你可以看到我們的模板是用PHP和HTML混著寫的,如果你更喜歡用模板語言的話,你可以用CodeIgniter的 模板解析器類 或者第三方模板解析器(模板引擎)。
新聞概述頁面已經(jīng)做好了,現(xiàn)在還缺少每一篇文章的頁面。之前寫好的數(shù)據(jù)模型現(xiàn)在就可以非常簡單地用來實(shí)現(xiàn)這個(gè)功能啦。你只需要添加一些代碼到控制器并且創(chuàng)建一個(gè)視圖。把下面的代碼添加到news控制器中。
這里,$slug 變量作為參數(shù)傳遞給了 get_news() 方法,這樣就可以返回特定的某一篇文章了。現(xiàn)在剩下的一件事就是創(chuàng)建視圖application/views/news/view.php了,代碼如下。
因?yàn)橹霸O(shè)置了通配符路由規(guī)則,現(xiàn)在你需要額外的路由來顯示剛剛寫的控制器。按照下面的代碼修改你的路由文件 (application/config/routes.php) ,這樣就確保了請求調(diào)用的是news控制器而不是之前設(shè)置的pages控制器。第一行代碼表示的是控制器中通過slug讀取的那條新聞。
把瀏覽器的地址改回根目錄,在后面加上 index.php/news 來看看你的新聞頁面吧。