php-codeigniter新聞模組介紹
設定模型
打開 application/models 資料夾,新增一個檔案名為 news_model.php 並加上下列程式碼。 確認你正確的設定了你的資料庫。application\models\news_model.php
<?php class News_model extends CI_Model { public function __construct() { $this->load->database();//載入資料庫程式庫 } }這段程式碼看起來與先前使用的控制器程式很像。它建立了一個新的模型,繼承自 CI_Model ,並載入了資料庫程式庫。 這使得我們可以使用 $this->db 這個物件來存取資料庫類別。
在你存取資料庫之前,需要先建立資料庫結構。連線到你的資料庫並執行下列 SQL 命令。順便增加一些種子資料。
這裡以ci_sample為例
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 內建的資料庫抽象層 — Active Record — 來做這件事。 這使你可以只寫一次查詢,就能夠在所有支援的資料庫執行。請將以下程式碼加進你的模型。
news_model.php
public function get_news($slug = FALSE) //$slug為要查詢的關鍵字 { if ($slug === FALSE) { $query = $this->db->get('news');//自news table回傳全部資料 return $query->result_array();//自news table回傳符合關鍵字的資料 } $query = $this->db->get_where('news', array('slug' => $slug)); return $query->row_array(); }這段程式碼讓你可以進行兩種不同的查詢。你可以取得所有的新聞資料,也可以根據新聞的 slug 來查詢。 你可能注意到 $slug 變數在使用前沒有被消毒,因為 Active Record 會幫你做這件事。
顯示新聞
我們已經寫好查詢,現在模型應該要連結到用來顯示新聞給使用者的檢視。這可以在我們之前做的控制器中完成,但為了清楚起見,我們來定義一個新的 "news" 控制器。 在 application/controllers/news.php 建立新的控制器。news.php
<?php class News extends CI_Controller { public function __construct() { parent::__construct(); $this->load->model('news_model'); } public function index() { $data['news'] = $this->news_model->get_news(); } public function view($slug) { $data['news'] = $this->news_model->get_news($slug); } }在這程式中,你可能會看到一些與先前建立的檔案相似的部份。首先是 "__construct" 方法:它呼叫父類別 (CI_Controller) 的建構子,並且載入模型, 讓它可以在這個控制器的其它方法中被使用。
接下來這邊有兩個方法,一個用來檢視所有的新聞,一個用來看特定的新聞。你可以看到在第二個方法中, $slug 變數被傳入到模型的方法裡。 模型就使用這個參數來找出所要的新聞。
現在控制器已經從模型中取回了資料。但還沒有東西被顯示出來。下一步要將資料傳給檢視。
請在news.php中的public function index()增加下列程式碼
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 並加入下一段程式碼。
<?php foreach ($news as $news_item): ?> <h2><?php echo $news_item['title'] ?></h2> <div id="main"> <?php echo $news_item['text'] ?> </div> <p><a href="view/<?php echo $news_item['slug'] ?>">View article</a></p> <?php endforeach ?>
這邊我們輪詢每個新聞項目並顯示給使用者。你可以看到我們用 PHP 混合了 HTML 做成模板。 如果你喜歡使用模板語言,你可以使用 CodeIgniter 的模板解析器或其它第三方解析器。
新聞總覽頁面現在已經完成了,但是還缺了一個頁面用來顯示個別的新聞。剛剛建立的模型設計成可以輕易的達成這個功能。 你只需要在控制器增加一些程式並新增一個檢視。
回到 news 控制器並加入下列程式碼。
application\controllers\news.php
在中public function view($slug) 增加下列程式碼
public function view($slug)//有關鍵字時,所做的處理 { $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 建立對應的檢視檔案,並輸入下列代碼。
application\views\news\view.php
<?php echo '<h2>'.$news_item['title'].'</h2>'; echo $news_item['text'];
修改資料庫application\config\database.php檔案
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = '你的密碼';
$db['default']['database'] = 'ci_sample';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = FALSE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
路由
因為我們之前在路由規則中使用了萬用字串,你必須增加額外的路由規則才能檢視你剛剛建立的控制器。 打開你的路由檔案 (application/config/routes.php) 並修改成像下面的代碼那樣。 這將確保請求可以到達 news 控制器而不是直接送給 pages 控制器。第一行的規則將含有 slug 的 URI 導向 news 控制器的 view 方法。application\config\routes.php
$route['news/(:any)'] = 'news/view/$1'; $route['news'] = 'news'; $route['(:any)'] = 'pages/view/$1'; $route['default_controller'] = 'pages/view';打開你的瀏覽器,輸入你的根目錄網址並加上 index.php/news 來看看你的新聞頁面。
留言
張貼留言