Bài 25: PHP trang tin tức - Hiển thị danh sách bài viết chuyên mục - Web tin tức PHP căn bản
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 ...
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>'; }
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'; } ?>
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!