Hướng dẫn tạo website tin tức phần 12: Quản lý bài viết phần 1

Hướng dẫn tạo website tin tức phần 12: Quản lý bài viết phần 1 là vấn đề được nhiều lập trình viên quan tâm, bởi những kiến thức trên trường lớp là không đủ, vì vậy bài Hướng dẫn tạo website tin tức phần 12: Quản lý bài viết phần 1 sẽ chia sẻ tới bạn nhiều thông tin hữu ích

Mọi người vẫn hỏi tôi về việc học lập trình nói chung và PHP nói riêng có cần năng khiếu hay quá khó để tiếp cận hay không. Thì tôi có thể trả lời rằng, học lập trình cũng như việc bạn học tiếng Anh hay bất kỳ một ngôn ngữ khác, bởi lập trình...là ngôn ngữ của máy tính, để máy tính đọc và máy tính thực hiện theo yêu cầu của mình, bạn thích là học được.

Xin chào các bạn, chào mừng các bạn đã quay trở lại với series hướng dẫn xây dựng trang tin tức bằng PHP. Ở trong bài trước, chúng ta đã hoàn thành xong các chức năng của hình ảnh. Tiếp tục hôm nay mình sẽ hướng dẫn các bạn viết các chức năng của bài viết. Bây giờ chúng ta bắt đầu thôi!

1. Khái quát

Đây có lẽ là phần quan trọng nhất của ứng dụng này rồi nhỉ? Bài viết (tiếng anh là posts) sẽ bao gồm nội dung của một lĩnh vực nào đó (chuyên mục) và có thể kèm hình ảnh, mô tả, tiêu đề, ... 

Các đặc điểm và chức năng trong phần này là:

  • Viết bài
  • Chỉnh sửa bài viết
  • Phân quyền theo ID của tác giả viết bài (ngoại trừ quản trị viên)
  • Xoá bài viết
  • Danh sách bài viết
  • Phân trang và tìm kiếm
  • Hiển thị những bài viết thuộc theo từng tài khoản (ngoại trừ quản trị vie

2. Tạo table bài viết

Các bạn tạo table posts bằng cách chạy lệnh SQL sau:

CREATE TABLE `posts` (
  `id_post` int(11) NOT NULL,
  `title` text COLLATE utf8_unicode_ci NOT NULL,
  `descr` text COLLATE utf8_unicode_ci NOT NULL,
  `url_thumb` text COLLATE utf8_unicode_ci NOT NULL,
  `slug` text COLLATE utf8_unicode_ci NOT NULL,
  `keywords` text COLLATE utf8_unicode_ci NOT NULL,
  `body` longtext COLLATE utf8_unicode_ci NOT NULL,
  `cate_1_id` int(11) NOT NULL,
  `cate_2_id` int(11) NOT NULL,
  `cate_3_id` int(11) NOT NULL,
  `author_id` int(11) NOT NULL,
  `status` int(11) NOT NULL,
  `view` int(11) NOT NULL,
  `date_posted` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
ALTER TABLE `posts`
  ADD PRIMARY KEY (`id`);
ALTER TABLE `posts`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; 

Mình sẽ giải thích một số field:

  • title: tiều đề bài viết
  • descr: mô tả bài viết
  • url_thumb: url thumbnail (ảnh nhỏ) bài viết
  • slug: url bài viết
  • keywords: từ khoá bài viết
  • body: nội dung bài viết
  • cate_1_id, cate_2_id, cate_3_id: ID chuyên mục lớn/vừa/nhỏ của bài viết
  • author_id: ID tác giả của bài viết
  • status: trạng thái của bài viết
  • status = 0: xuất bản
  • status = 1: ẩn
  • view: lượt xem bài viết

3. Phân trang bài viết

Cũng như chức năng chuyên mục, ở phần này sẽ phân ra thành 3 trang:

  • Trang hiển thị danh sách bài viết (http://domain.com/admin/posts)
  • Trang thêm bài viết (http://domain.com/admin/posts/add)
  • Trang chỉnh sửa bài viết (http://domain.com/admin/posts/id)

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

<?php
  
// Nếu đăng nhập
if ($user)
{
    echo '<h3>Bài viết</h3>';
    // Lấy tham số ac
    if (isset($_GET['ac']))
    {
        $ac = trim(addslashes(htmlspecialchars($_GET['ac'])));
    }
    else
    {
        $ac = '';
    }
  
    // Lấy tham số id
    if (isset($_GET['id']))
    {
        $id = trim(addslashes(htmlspecialchars($_GET['id'])));
    }
    else
    {
        $id = '';
    }
  
    // Nếu có tham số ac
    if ($ac != '') 
    {
        // Trang thêm bài viết
        if ($ac == 'add')
        {
            // Dãy nút của thêm bài viết
            echo
            '
                <a href="' . $_DOMAIN . 'posts" class="btn btn-default">
                    <span class="glyphicon glyphicon-arrow-left"></span> Trở về
                </a> 
            ';
  
            // Content thêm bài viết
        } 
        // Trang chỉnh sửa bài viết
        else if ($ac == 'edit')
        {
            $sql_check_id_cate = "SELECT id_post, author_id FROM posts WHERE id_post = '$id'";
            // Nếu tồn tại tham số id trong table
            if ($db->num_rows($sql_check_id_cate)) 
            {
                $data_post = $db->fetch_assoc($sql_check_id_cate, 1);
 
                if ($data_post['author_id'] == $data_user['id_acc'] || $data_user['position'] == '1')
                {
                    // Dãy nút của chỉnh sửa bài viết
                    echo
                    '
                        <a href="' . $_DOMAIN . 'posts" class="btn btn-default">
                            <span class="glyphicon glyphicon-arrow-left"></span> Trở về
                        </a>
                        <a class="btn btn-danger" id="del_post" data-id="' . $id . '">
                            <span class="glyphicon glyphicon-trash"></span> Xoá
                        </a> 
                    ';  
      
                    // Content chỉnh sửa bài viết
                }
                else
                {
                    echo '<div class="alert alert-danger">ID bài viết không thuộc quyền sở hữu của bạn.</div>';
                }
            }
            else
            {
                // Hiển thị thông báo lỗi
                echo
                '
                    <div class="alert alert-danger">ID bài viết đã bị xoá hoặc không tồn tại.</div>
                ';
            }
        }
   }
    // Ngược lại không có tham số ac
    // Trang danh sách bài viết
    else
    {
        // Dãy nút của danh sách bài viết
        echo
        '
            <a href="' . $_DOMAIN . 'posts/add" class="btn btn-default">
                <span class="glyphicon glyphicon-plus"></span> Thêm
            </a> 
            <a href="' . $_DOMAIN . 'posts" class="btn btn-default">
                <span class="glyphicon glyphicon-repeat"></span> Reload
            </a> 
            <a class="btn btn-danger" id="del_post_list">
                <span class="glyphicon glyphicon-trash"></span> Xoá
            </a> 
        ';
  
        // Content danh sách bài viết
    }
}
// Ngược lại chưa đăng nhập
else
{
    new Redirect($_DOMAIN); // Trở về trang index
}
  
?> 

4. Thêm bài viết

Truy cập đường dẫn http://domain.com/admin/posts/add để bắt đầu làm nhé!

Ở chức năng này chúng ta sẽ thêm tiêu đề, slug và một số thông tin cần thiết của bài viết thôi. Còn về nội dung, hình ảnh và mấy cái khác chúng ta sẽ thực hiên ở phần chỉnh sửa bài viết.

Xây dựng template

Các bạn mở file admin/templates/posts.php lên và chèn đoạn code này vào bên dưới dòng // Content thêm bài viết:

echo
'
    <p class="form-add-post">
        <form method="POST" id="formAddPost" onsubmit="return false;">
            <div class="form-group">
                <label>Tiêu đề bài viết</label>
                <input type="text" class="form-control title" id="title_add_post">
            </div>
            <div class="form-group">
                <label>URL chuyên mục</label>
                <input type="text" class="form-control slug" placeholder="Nhấp vào để tự tạo" id="slug_add_post">
            </div>
            <div class="form-group">
                <button type="submit" class="btn btn-primary">Tạo</button>
            </div>
            <div class="alert alert-danger hidden"></div>
        </form>
    </p>  
'; 


Các bạn chạy lại trang sẽ được kết quả như sau: Viết Ajax gửi dữ liệu

Các bạn mở file admin/js/form.js lên và copy đoạn code bên dưới:

// Thêm bài viết
$('#formAddPost button').on('click', function() {
    $title_add_post = $('#title_add_post').val();
    $slug_add_post = $('#slug_add_post').val();
 
    if ($title_add_post == '' || $slug_add_post == '') {
        $('#formAddPost .alert').removeClass('hidden');
        $('#formAddPost .alert').html('Vui lòng điền đầy đủ thông tin.');
    } else {
        $.ajax({
            url : $_DOMAIN + 'posts.php',
            type : 'POST',
            data : {
                title_add_post : $title_add_post,
                slug_add_post : $slug_add_post,
                action : 'add_post'
            }, success : function(data) {
                $('#formAddPost .alert').html(data);
            }, error : function() {
                $('#formAddPost .alert').removeClass('hidden');
                $('#formAddPost .alert').html('Đã có lỗi xảy ra, hãy thử lại.');
            }
        });
    }
}); 

Viết PHP xử lý dữ liệu

Tạo file admin/posts.php và dán nội dung này vào:

<?php
 
// Kết nối database và thông tin chung
require_once 'core/init.php';
 
// Nếu đăng nhập
if ($user) 
{
    // Nếu tồn tại POST action
    if (isset($_POST['action']))
    {
        // Xử lý POST action
        $action = trim(addslashes(htmlspecialchars($_POST['action'])));
 
        // Thêm bài viết
        if ($action == 'add_post')
        {
            // Xử lý các giá trị
            $title_add_post = trim(addslashes(htmlspecialchars($_POST['title_add_post'])));
            $slug_add_post = trim(addslashes(htmlspecialchars($_POST['slug_add_post'])));
 
            // Các biến xử lý thông báo
            $show_alert = '<script>$("#formAddPost .alert").removeClass("hidden");</script>';
            $hide_alert = '<script>$("#formAddPost .alert").addClass("hidden");</script>';
            $success = '<script>$("#formAddPost .alert").attr("class", "alert alert-success");</script>';
 
            // Nếu các giá trị rỗng
            if ($title_add_post == '' || $slug_add_post == '')
            {
                echo $show_alert.'Vui lòng điền đầy đủ thông tin';
            }
            // Ngược lại
            else
            {
                // Kiểm tra bài viết tồn tại 
                $sql_check_post_exist = "SELECT title, slug FROM posts WHERE title = '$title_add_post' OR slug = '$slug_add_post'";
                // Nếu bài viết tồn tại
                if ($db->num_rows($sql_check_post_exist))
                {
                    echo $show_alert.'Bài viết có tiêu đề hoặc slug đã tồn tại.';
                }
                else
                {
                    // Thực thi thêm bài viết
                    $sql_add_post = "INSERT INTO posts VALUES (
                        '',
                        '$title_add_post',
                        '',
                        '',
                        '$slug_add_post',
                        '',
                        '',
                        '',
                        '',
                        '',
                        '$data_user[id_acc]',
                        '0',
                        '0',
                        '$date_current'
                    )";
                    $db->query($sql_add_post);
                    echo $show_alert.$success.'Thêm bài viết thành công.';
                    $db->close(); // Giải phóng
                    new Redirect($_DOMAIN.'posts'); // Trở về trang danh sách bài viết
                }
            }
        }
 
        // Tải chuyên mục trong chỉnh sửa bài viết
    }
    // Ngược lại không tồn tại POST action
    else
    {
        new Redirect($_DOMAIN);
    }
}
// Nếu không đăng nhập
else
{
    new Redirect($_DOMAIN);
}
 
?>


Ok! Bây giờ các bạn chạy lại và thêm bài viết thử xem nó có hoạt động không?

5. Lời kết

Mình sẽ kết thúc ở đây, trong phần sau chúng ta sẽ tiếp tục hoàn thành nốt các chức năng còn lại của bài viết. Nếu có thắc mắc gì các bạn cứ comment bên dưới hoặc đăng bài trên group kèm theo link bài viết đễ được hỗ trợ nhanh nhất. Cảm ơn các bạn, chúc các bạn thành công!

Hy vọng với bài viết về Hướng dẫn tạo website tin tức phần 12: Quản lý bài viết phần 1 đã giải đáp giúp bạn phần nào về kiến thức lập trình PHP. Như tôi đã nói, ngôn ngữ lập trình không quan trọng bằng tư duy giải thuật, tư duy logic để giải quyết vấn đề.

Với những năm trước đây, lập trình viên là một cái nghề khó và kén chọn người học, đồng nghĩa với việc thu nhập hàng tháng của các lập trình viên luôn cao. Còn những năm gần đây, thì lập trình là môn học phổ thông, và ai cũng nên học một ngôn ngữ lập trình nào đó.

Nếu bạn còn bất kỳ câu hỏi nào trong việc học lập trình online, hãy gửi yêu cầu cho tôi qua email hoidapcode.com@gmail.com hoặc để lại comment bên dưới, tôi sẽ giải đáp trong vòng 24 giờ!

Blog hoidapcode.com là blog được tổng hợp tự động các bài học, thông tin về lập trình trên mạng internet. Nếu bạn có ý kiến hoặc đóng góp về bài viết này, hãy liên hệ với tôi!