# 讀取新聞條目
在上一節中,我們通過寫出一個包含靜態頁面的類了解了一些框架的基本概念, 我們也根據自定義路由規則來重定向 URI 。現在是時候向大家介紹動態內容 和如何使用數據庫了。
# 創建你的數據模型
數據庫的查詢操作應該放在模型里,而不是寫在控制器里,這樣可以很方便的重用它。 模型正是用于從數據庫或者其他存儲中獲取、新增、更新數據的地方。它就代表你的數據。
打開 application/models/ 目錄,新建一個文件 News_model.php ,然后寫入下面的代碼。 確保你的 數據庫配置 正確。
~~~
<?php
class News_model extends CI_Model {
public function __construct()
{
$this->load->database();
}
}
~~~
這個代碼和之前的控制器的代碼有點類似,它通過繼承 CI_Model 創建了一個新模型, 并加載了數據庫類。數據庫類可以通過 $this->db 對象訪問。
在查詢數據庫之前,我們要先創建一個數據庫表。連接你的數據庫,運行下面的 SQL 語句(MySQL),并添加一些測試數據。
~~~
CREATE TABLE news (
id int(11) NOT NULL AUTO_INCREMENT,
title varchar(128) NOT NULL,
slug varchar(128) NOT NULL,
text text NOT NULL,
PRIMARY KEY (id),
KEY slug (slug)
);
~~~
現在,數據庫和模型都準備好了,你需要一個方法來從數據庫中獲取所有的新聞文章。 為實現這點,我們使用了 CodeIgniter 的數據庫抽象層 查詢構造器 , 通過它你可以編寫你的查詢代碼,并在 所有支持的數據庫平臺 上運行。 向你的模型中添加如下代碼。
~~~
public function get_news($slug = FALSE)
{
if ($slug === FALSE)
{
$query = $this->db->get('news');
return $query->result_array();
}
$query = $this->db->get_where('news', array('slug' => $slug));
return $query->row_array();
}
~~~
通過這個代碼,你可以執行兩種不同的查詢,一種是獲取所有的新聞條目,另一種 是根據它的 slug 來獲取新聞條目。你應該注意到,$slug 變量在執行查詢之前 并沒有做檢查, 查詢構造器 會自動幫你檢查的。
# 顯示新聞
現在,查詢已經寫好了,接下來我們需要將模型綁定到視圖上,向用戶顯示新聞條目了。 這可以在之前寫的 Pages 控制器里來做,但為了更清楚的闡述,我們定義了一個新的 News 控制器,創建在 application/controllers/News.php 文件中。
~~~
<?php
class News extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->model('news_model');
$this->load->helper('url_helper');
}
public function index()
{
$data['news'] = $this->news_model->get_news();
}
public function view($slug = NULL)
{
$data['news_item'] = $this->news_model->get_news($slug);
}
}
~~~
閱讀上面的代碼你會發現,這和之前寫的代碼有些相似之處。首先是 __construct() 方法,它調用父類(CI_Controller)中的構造函數,并加載模型。這樣模型就可以 在這個控制器的其他方法中使用了。另外它還加載了 URL 輔助函數 , 因為我們在后面的視圖中會用到它。
其次,有兩個方法用來顯示新聞條目,一個顯示所有的,另一個顯示特定的。 你可以看到第二個方法中調用模型方法時傳入了 $slug 參數,模型根據這個 slug 返回特定的新聞條目。
現在,通過模型,控制器已經獲取到數據了,但還沒有顯示。下一步要做的就是, 將數據傳遞給視圖。
~~~
public function index()
{
$data['news'] = $this->news_model->get_news();
$data['title'] = 'News archive';
$this->load->view('templates/header', $data);
$this->load->view('news/index', $data);
$this->load->view('templates/footer');
}
~~~上面的代碼從模型中獲取所有的新聞條目,并賦值給一個變量,另外頁面的標題賦值給了 $data['title'] 元素,然后所有的數據被傳遞給視圖。現在你需要創建一個視圖文件來 顯示新聞條目了,新建 application/views/news/index.php 文件并添加如下代碼。
~~~
<h2><?php echo $title; ?></h2>
<?php foreach ($news as $news_item): ?>
<h3><?php echo $news_item['title']; ?></h3>
<div class="main">
<?php echo $news_item['text']; ?>
</div>
<p><a href="<?php echo site_url('news/'.$news_item['slug']); ?>">View article</a></p>
<?php endforeach; ?>
~~~
這里,通過一個循環將所有的新聞條目顯示給用戶,你可以看到我們在 HTML 模板中混用了 PHP , 如果你希望使用一種模板語言,你可以使用 CodeIgniter 的 模板解析類 , 或其他的第三方解析器。
新聞的列表頁就做好了,但是還缺了顯示特定新聞條目的頁面,之前創建的模型可以很容易的 實現該功能,你只需要向控制器中添加一些代碼,然后再新建一個視圖就可以了。回到 News 控制器,使用下面的代碼替換掉 view() 方法:
~~~
public function view($slug = NULL)
{
$data['news_item'] = $this->news_model->get_news($slug);
if (empty($data['news_item']))
{
show_404();
}
$data['title'] = $data['news_item']['title'];
$this->load->view('templates/header', $data);
$this->load->view('news/view', $data);
$this->load->view('templates/footer');
}
~~~
我們并沒有直接調用 get_news() 方法,而是傳入了一個 $slug 參數, 所以它會返回相應的新聞條目。最后剩下的事是創建視圖文件 application/views/news/view.php 并添加如下代碼 。
<?php
echo '<h2>'.$news_item['title'].'</h2>';
echo $news_item['text'];
~~~
# 路由
由于之前創建的通配符路由規則,你需要新增一條路由來顯示你剛剛創建的控制器, 修改你的路由配置文件(application/config/routes.php)添加類似下面的代碼。 該規則可以讓請求訪問 News 控制器而不是 Pages 控制器,第一行可以讓 帶 slug 的 URI 重定向到 News 控制器的 view() 方法。
~~~
$route['news/(:any)'] = 'news/view/$1';
$route['news'] = 'news';
$route['(:any)'] = 'pages/view/$1';
$route['default_controller'] = 'pages/view';
~~~
把瀏覽器的地址改回根目錄,在后面加上 index.php/news 來看看你的新聞頁面吧。
- 空白目錄
- 歡迎使用 CodeIgniter
- 安裝說明
- 下載CodeIgniter
- 安裝說明
- 從老版本升級
- 疑難解答
- CodeIgniter 概覽
- 開始
- CodeIgniter 是什么?
- 支持特性
- 應用程序流程圖
- 模型-視圖-控制器
- 架構目標
- 教程 - 內容提要
- 加載靜態內容
- 讀取新聞條目
- 創建新聞條目
- 結束語
- 向 CodeIgniter 貢獻你的力量
- 編寫 CodeIgniter 的文檔
- Developer's Certificate of Origin 1.1
- 常規主題
- CodeIgniter URL
- 控制器
- 保留名稱
- 視圖
- 模型
- 輔助函數
- 使用 CodeIgniter 類庫
- 創建類庫
- 使用 CodeIgniter 驅動器
- 創建驅動器
- 創建核心系統類
- 創建附屬類
- 鉤子 - 擴展框架核心
- 自動加載資源
- 公共函數
- 兼容性函數
- URI 路由
- 錯誤處理
- 網頁緩存
- 程序分析
- 以 CLI 方式運行
- 管理你的應用程序
- 處理多環境
- 在視圖文件中使用 PHP 替代語法
- 安全
- PHP 開發規范
- 類庫參考
- 基準測試類
- 緩存驅動器
- 日歷類
- 購物車類
- 配置類
- Email 類
- 加密類
- 加密類(新版)
- 文件上傳類
- 表單驗證類
- FTP 類
- 圖像處理類
- 輸入類
- Javascript 類
- 語言類
- 加載器類