NTM Solutions

Facebook Youtube Google+

Thứ Tư, 31 tháng 10, 2018

CI-Bài 02-Phần Tin Tức


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.

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

<?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

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.

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.

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

<?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.

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â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.

<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.

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:

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:

<?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

$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.php

application/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.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 #tiensim

Nguồn: CodeIgniter User Guide