Bài 25: PHP trang tin tức - Hiển thị danh sách bài viết chuyên mục

DOWNLOAD

Hi, xin chào tất cả các bạn, chào mừng các bạn đã quay trở lại với series xây dựng trang web tin tức căn bản với PHP. Trong bài học hôm trước, chúng ta đã cùng nhau xây dựng trang hiển thị các bài viết mới nhất. Ngày hôm nay, mình sẽ hướng dẫn các bạn làm thế nào để tạo ra trang bài viết cho từng chuyên mục. Không luyên thuyên nữa, chúng ta bắt đầu ngay nhé!

Thực ra bài này cũng có nét tương tự giống bài  hiển thị danh sách bài viết mới nhất. Bạn nào tinh ý chắc cũng đã nghĩ ra hướng giải pháp rồi nhỉ :v

1. Sửa lỗi bài học trước

Trước khi vào bài học, mình nói về cái lỗi ở bài học trước, đó là về cái phần lấy số hàng trong table.

Trong bài trước, câu lệnh sql của chúng ta có dạng như bên dưới:

$sqlGetCountPost = "SELECT id_post FROM posts"; (khoảng dòng số 6)

Các bạn chỉ cần thêm điều kiện WHERE status = '1' vào lệnh sql để nó chỉ đếm những bài viết đã public:

$sqlGetCountPost = "SELECT id_post FROM posts WHERE status = '1'";

Ngoài ra ở chỗ điều kiện if else kiểm tra có tồn tài bài viết (dòng 35), nến các bạn thích có thể thêm câu lệnh else bên dưới nó để tạo một cái thông báo nho nhỏ khi website của mình chưa có bài viết nào để hiển thị.

else {
        echo '<div class="well well-lg">Chưa có bài viết nào.</div>';
}
Ok thế là xong!

2. Hiển thị danh sách bài viết chuyên mục

Các bạn mở file templates/categories.php lên và copy nội dung này vào:

<?php

// Nhận giá trị slug của chuyên mục
$sc = trim(htmlspecialchars(addslashes($_GET['sc'])));

// Lấy id của chuyên mụcs
$sql_get_id_cate = "SELECT id_cate, url FROM categories WHERE url = '$sc'";

// Chuyên mục tồnta5i
if ($db->num_rows($sql_get_id_cate)) {
    $id_cate = $db->fetch_assoc($sql_get_id_cate, 1)['id_cate'];

?>
<div class="container">
    <div class="row">
    <?php

    // Lấy số hàng trong table
    $sqlGetCountPost = "SELECT id_post FROM posts WHERE cate_1_id = '$id_cate' OR cate_2_id = '$id_cate' OR cate_3_id = '$id_cate' AND status = '1'";
    $countPost = $db->num_rows($sqlGetCountPost);

    // Lấy tham số trang
    if (isset($_GET['p'])) {
      $page = trim(htmlspecialchars(addslashes($_GET['p'])));

      if (preg_match('/\d/', $page)) {
        $page = $page;
      } else {
        $page = 1;
      }
    } else {
      $page = 1;
    }

    $limit = 20; // Giới hạn số bài viết hiển thị trong 1 trang
    $totalPage = ceil($countPost / $limit); // Tổng số trang sau khi tính toán
        
    // Validate tham số page    
    if ($page > $totalPage) {
      $page = $totalPage;
    } else if ($page < 1) {
      $page = 1;
    }
      
    $start = ($page - 1) * $limit;

    $sql_get_latest_news = "SELECT * FROM posts WHERE status = '1' AND cate_1_id = '$id_cate' OR cate_2_id = '$id_cate' OR cate_3_id = '$id_cate' ORDER BY id_post DESC LIMIT $start, $limit";
    if ($db->num_rows($sql_get_latest_news)) {
        foreach ($db->fetch_assoc($sql_get_latest_news, 0) as $data_post) {
            echo '
                <div class="col-md-3">
                    <div class="thumbnail">
                        <a href="' . $_DOMAIN . $data_post['slug'] . '-' . $data_post['id_post'] . '.html">
                            <img src="' . $data_post['url_thumb'] . '">
                        </a>
                        <div class="caption">
                            <h3><a href="' . $_DOMAIN . $data_post['slug'] . '-' . $data_post['id_post'] . '.html">' . $data_post['title'] . '</a></h3>
                            <p>' . $data_post['descr'] . '</p>
                        </div>
                    </div>
                </div>
            ';
        }

        echo '</div>';

        echo '
            <div class="btn-toolbar" role="toolbar">
                <div class="btn-group">
        ';

        # Pagination button
        if ($page > 1 && $totalPage > 1) {
            echo '
                <a href="' . $_DOMAIN . ($page - 1 ) . '" class="btn btn-default">
                    <span class="glyphicon glyphicon-chevron-left"></span>
                </a>
            ';
        }
       
        for ($i = 1; $i <= $totalPage; $i++) {
            if ($i == $page){
                echo '<a class="btn btn-primary">' . $i . '</a>';
            } else {
                echo '
                    <a href="' . $_DOMAIN . $i . '" class="btn btn-default">
                        ' . $i . '
                    </a>
                ';
            }
        }
       
        if ($page < $totalPage && $totalPage > 1) {
            echo '
                <a href="' . $_DOMAIN . ($page + 1 ) . '" class="btn btn-default">
                    <span class="glyphicon glyphicon-chevron-right"></span>
                </a>
            ';
        }

        echo '
                </div>
            </div>
        ';
    } else {
        echo '<div class="well well-lg">Chưa có bài viết nào cho chuyên mục này.</div>';
    }

    ?>
</div>
<?php

// Chuyên mục không tồn tại
} else {
    require 'templates/404.php';
}

?>
Ngoài trừ có thêm phần nhận tham số get để xử lý lấy id chuyên mục thì toàn bộ hầu như giống cách lấy danh sách bài viết mới nhất, chỉ khác ở 2 câu lệnh sql lấy số hàng trong table và in danh sách. Bây giờ các bạn đang nghĩ: "Ôi sao nó đơn giản thế này nhỉ?" đúng không nào :v Ta chỉ cần theo điều kiện WHERE cate_1_id = '$id_cate' OR cate_2_id = '$id_cate' OR cate_3_id = '$id_cate' là có thể lọc các bài viết theo chuyên mục chỉ định.

Ok giờ các bạn chạy lại, chúng ta sẽ được kết quả như sau:

Nếu các bạn chưa có nhiều row bài, có thể thay đổi giá trị $limit để test.

3. Lời kết

Bài học hôm nay tuy không có kiến thức mới nhiều lắm so với bài hôm trước nhưng mình hi vọng nó giúp ích được cho các bạn hiểu rõ cách thức làm thế nào để lọc bài viết theo một id chuyên mục nào đó. Qua bài sau, chúng ta sẽ cùng nhau xây dựng trang hiển thị nội dung bài viết cho ứng dụng này. Nếu có thắc mắc gì các bạn cứ comment bên dưới hoặc đăng trên group kèm theo link bài viết để được hỗ trợ sớm nhất. Cảm ơn các bạn đã theo dõi, chúc các bạn thành công!

Bạn đang muồn tìm hiểu PHP Framework?

Nếu bạn muốn học mô hình MVC thì nên lựa chọn Codeigniter, đây là framework đơn giản và dễ sử dụng nhất. Tham khảo khóa học Codeigniter để dễ dàng nắm bắt  hơn.

-------------------#####-------------------

-------------------#####-------------------

Nguồn: freetuts.net

KHÓA HỌC ĐANG GIẢM GIÁ

FEDU - 20: Học lập trình Angular js/MySQL/PHP

(Giảng viên: Nguyễn Đức Việt)

XEM
UNICA - Xây dựng website hoàn chỉnh với Laravel PHP Framework

(Giảng viên: )

XEM
UNICA - Lập trình FULLSTACK với ANGULAR - PHP - MYSQL

(Giảng viên: )

XEM
KYNA - Lập trình Fullstack với Angular - PHP - MySQL

(Giảng viên: Nguyễn Đức Việt)

XEM
KYNA - Lập trình hướng đối tượng từ cơ bản đến nâng cao trong PHP

(Giảng viên: Lưu Trường Hải Lân)

XEM