XEM MỤC LỤC CÁC BÀI VIẾT VỀ CODEIGNITER
Trong bài hướng dẫn trước, chúng ta đã làm qua 01
số ví dụ hết sức cơ bản của framework bằng cách viết 01 lớp bao gồm các trang
tĩnh. Chúng ta rút gọn URI bằng cách sửa vài qui tắc định tuyến. Bây giờ, trong
bài này mình sẽ giới thiệu việc tải nội dung động từ cơ sở dữ liệu.
Thiết lập model
Các câu lệnh thao tác cơ sở dữ liệu không được viết
trong controller mà là trong model, nhằm mục đích tái sử dụng sau này.
Các Models là nơi bạn nhận dữ liệu, chèn, và cập nhật thông tin cơ sở dữ liệu hoặc các hình thức lưu trữ dữ liệu khác.
Chúng đại diện cho dữ liệu của bạn.
Các Models là nơi bạn nhận dữ liệu, chèn, và cập nhật thông tin cơ sở dữ liệu hoặc các hình thức lưu trữ dữ liệu khác.
Chúng đại diện cho dữ liệu của bạn.
Ta mở thư mục application/models/ tạo 01 tập
tin tên là: News_model.php và thêm đoạn mã sau.
Trước đó bạn phải cấu hình cơ sở dữ liệu của bạn trong tập tin application/config/database.php
Trước đó bạn phải cấu hình cơ sở dữ liệu của bạn trong tập tin application/config/database.php
<?php
class
News_model extends
CI_Model {
public function __construct()
{
$this->load->database();
}
}
Đoạn mã này trông giống đoạn mã đã dùng trước đây
khi tạo controller Pages.
Nó tạo 01 model bằng cách thừa kế lớp CI_Model và tải xuống thư viện cơ sở dữ liệu.
Điều này sẽ làm cho lớp xử lý cơ sở dữ liệu có sẵn trong đối tượng $this->db
Nó tạo 01 model bằng cách thừa kế lớp CI_Model và tải xuống thư viện cơ sở dữ liệu.
Điều này sẽ làm cho lớp xử lý cơ sở dữ liệu có sẵn trong đối tượng $this->db
Trước khi truy vấn đến cơ sở dữ liệu, ta tạo 01 cơ
sở dữ liệu(tên: mydb) và cấu trúc của nó bằng câu lệnh mySQL hay phpmyadmin như
sau:
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)
);
Sau đó các bạn vào phpmyadmin tạo vài bản ghi mới
(với phần collation của 03 cột title, slug, text là utf8_general_ci)
INSERT INTO `news` (`id`, `title`, `slug`, `text`) VALUES (NULL, 'hot girl xinh đẹp 1', 'hot-girl-1',
'Jeans xanh áo trắng thể thao,\r\nLung linh nắng sớm em
khoe dáng ngà.\r\n#tiensim'), (NULL, 'hot girl xinh đẹp 2', 'hot-girl-2',
'Nắng đùa mái tóc với nàng,\r\nBảo ta say nắng hay người
trong tranh?\r\n#tiensim')
Bây giờ ta sẽ thiết lập 01 model và 01 cơ sở dữ
liệu , bạn sẽ cần 01 phương thức để lấy tất cả các dòng tin từ cơ sở dữ liệu .
Để làm được điều này, ta dùng lớp xử lý cơ sở dữ liệu của CodeIgniter — Query Builder.
Dùng lớp này sẽ giúp bạn chỉ cần viết câu truy vấn 01 lần và có thể được hỗ trợ hầu như tất cả các hệ cơ sở dữ liệu thông dụng.
Ta thêm đoạn mã sau vào model khi nãy.
Để làm được điều này, ta dùng lớp xử lý cơ sở dữ liệu của CodeIgniter — Query Builder.
Dùng lớp này sẽ giúp bạn chỉ cần viết câu truy vấn 01 lần và có thể được hỗ trợ hầu như tất cả các hệ cơ sở dữ liệu thông dụng.
Ta thêm đoạn mã sau vào model khi nãy.
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();
}
Đoạn mã này có thể làm 02 truy vấn khác nhau.
Bạn có thể lấy tất cả dòng tin, hoặc lấy 01 dòng tin dựa vào biến slug (slug là phần URL sau dấu / không có chứa tên miền).
Bạn chú ý là biến $slug chưa được “làm sạch” trước khi chạy câu truy vấn; Query Builder sẽ làm điều này cho bạn.
Bạn có thể lấy tất cả dòng tin, hoặc lấy 01 dòng tin dựa vào biến slug (slug là phần URL sau dấu / không có chứa tên miền).
Bạn chú ý là biến $slug chưa được “làm sạch” trước khi chạy câu truy vấn; Query Builder sẽ làm điều này cho bạn.
Hiển thị Tin Tức
Bây giờ câu truy vấn đã được viết , model cần phải
được đưa lên views để hiển thị các dòng tin cho người dùng xem.
Ta cũng có thể xài lại controller Pages đã tạo trong bài trước , nhưng để cho hợp lý chúng ta sẽ tạo mới 01 controller News .
Ta tạo tập tin controller: application/controllers/News.php
Ta cũng có thể xài lại controller Pages đã tạo trong bài trước , nhưng để cho hợp lý chúng ta sẽ tạo mới 01 controller News .
Ta tạo tập tin controller: 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);
}
}
Nhìn vào mã, bạn thấy có vài chỗ giống với các tập
tin chúng ta đã tạo trước đây.
Đầu tiên , phương thức __construct() : gọi phương thức khởi tạo từ lớp cha (CI_Controller) và tải model, ta có thể dùng model này trong tất cả các phương thức khác trong controller này.
Nó cũng đồng thời tải 01 bộ các hàm URL Helper , bởi vì chúng ta sẽ dùng 01 hàm ở trong đó cho phần view.
Đầu tiên , phương thức __construct() : gọi phương thức khởi tạo từ lớp cha (CI_Controller) và tải model, ta có thể dùng model này trong tất cả các phương thức khác trong controller này.
Nó cũng đồng thời tải 01 bộ các hàm URL Helper , bởi vì chúng ta sẽ dùng 01 hàm ở trong đó cho phần view.
Tiếp theo, có 02 phương thức để xem: tất cả dòng
tin và 01 dòng tin xác định.
Bạn có thể thấy biến $slug được dùng để đưa vào phương thức thứ 02 của model.
Model dùng biến slug này để xác định dòng tin sẽ trả về.
Bạn có thể thấy biến $slug được dùng để đưa vào phương thức thứ 02 của model.
Model dùng biến slug này để xác định dòng tin sẽ trả về.
Bây giờ, dữ liệu sẽ được nhận bởi controller thông
qua model của chúng ta, nhưng chưa có gì được hiển thị cả. Điều tiếp theo cần
làm là truyền dữ liệu vào các phần views.
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');
}
Đoạn mã trên lấy tất cả dòng tin từ model và gán
vào 01 biến .
Giá trị của phần tiêu đề tin cũng được gán vào $data['title'] và tất cả dữ liệu của nó gán lên các phần views.
Bây giờ việc ta phải làm là tạo 01 tập tin trong phần view để hiển thị các dòng tin.
Tạo tập tin sau application/views/news/index.php và paste đoạn mã vào.
Giá trị của phần tiêu đề tin cũng được gán vào $data['title'] và tất cả dữ liệu của nó gán lên các phần views.
Bây giờ việc ta phải làm là tạo 01 tập tin trong phần view để hiển thị các dòng tin.
Tạo tập tin sau application/views/news/index.php và paste đoạn mã vào.
<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; ?>
Ở đây, mỗi dòng tin được lặp và hiển thị ra cho
người dùng xem.
Bạn có thể thấy chúng ta đã viết phần trang mẫu vừa có PHP trộn lẫn HTML.
Nếu bạn thích dùng 01 trang mẫu đa ngôn ngữ hơn bạn có thể dùng lớp thư viện Template Parser (xem trong phần library-Template Parser Class) của CodeIgniter hoặc của 01 bên thứ 03.
Bạn có thể thấy chúng ta đã viết phần trang mẫu vừa có PHP trộn lẫn HTML.
Nếu bạn thích dùng 01 trang mẫu đa ngôn ngữ hơn bạn có thể dùng lớp thư viện Template Parser (xem trong phần library-Template Parser Class) của CodeIgniter hoặc của 01 bên thứ 03.
Phần hiển thị xem thử trang tin tức xem như đã xong,
nhưng 01 trang để hiển thị tin tức riêng vẫn chưa có.
Model đã tạo trước đây được tạo theo cách giúp dễ sử dụng.
Bạn chỉ cần thêm vài đoạn mã vào controller và tạo 01 cái view mới.
Quay trở lại controller News và cập nhật phương thức view() với đoạn mã sau:
Model đã tạo trước đây được tạo theo cách giúp dễ sử dụng.
Bạn chỉ cần thêm vài đoạn mã vào controller và tạo 01 cái view mới.
Quay trở lại controller News và cập nhật phương thức view() với đoạn mã sau:
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');
}
Thay vì gọi phương thức get_news()
mà không có 01 tham số, biến $slug được truyền vào, vì thế nên nó sẽ trả về 01 dòng
tin theo yêu cầu.
Những thứ duy nhất còn lại phải làm là tạo ra phần view tĩnh tại application/views/news/view.php.
Paste đoạn mã sau vào:
Những thứ duy nhất còn lại phải làm là tạo ra phần view tĩnh tại application/views/news/view.php.
Paste đoạn mã sau vào:
<?php
echo
'<h2>'.$news_item['title'].'</h2>';
echo
$news_item['text'];
Định tuyến
Do ký tự đại diện trong phần qui tắc định tuyến đã
tạo trước đây, bạn cần 01 định tuyến bổ sung thêm để hiển thị controller news
vừa tạo.
Chỉnh tập tin định tuyến của bạn (application/config/routes.php) như dưới đây.
Điều này đảm bảo rằng các yêu cầu liên quan sẽ truy cập đến controller News thay vì đi thẳng đến controller Pages.
Dòng định tuyến đầu tiên với 01 slug của phương thức view() trong controller News
Chỉnh tập tin định tuyến của bạn (application/config/routes.php) như dưới đây.
Điều này đảm bảo rằng các yêu cầu liên quan sẽ truy cập đến controller News thay vì đi thẳng đến controller Pages.
Dòng định tuyến đầu tiên với 01 slug của phương thức view() trong controller News
$route['news/(:any)']
= 'news/view/$1';
$route['news']
= 'news';
$route['(:any)']
= 'pages/view/$1';
$route['default_controller']
= 'pages/view';
Trỏ trình duyệt của bạn về thư mục gốc của
framework theo đường dẫn index.php/news
và xem trang kết quả trả về.
Các tập tin chúng ta đã tạo trong ví dụ này:
application/models/News_model.phpapplication/controllers/News.php
application/views/news/index.php
application/views/news/view.php
Sửa cấu hình:
application/config/database.php
application/config/routes.phpapplication/config/database.php
Nếu vẫn chưa hiểu các bạn xem thêm video clip sau:
XEM MỤC LỤC CÁC BÀI VIẾT VỀ CODEIGNITER
By #drM
Nguồn: CodeIgniter User Guide
Không có nhận xét nào:
Đăng nhận xét