Xây dựng Website PHP theo MVC

Bài 9: Thêm chuyên mục

1) Chuẩn bị

Trong SEO, đường dẫn URL tốt sẽ giúp cho Google index dễ dàng hơn. URL chứa từ khóa sẽ làm tăng giá trị của bài viết. Vì vậy chúng ta sẽ viết một hàm chuyển đổi để đường dẫn url thân thiện với google hơn, ví dụ đường dẫn sẽ có dạng: 
Tạo file Lib/function.php và chèn đoạn code sau đây vào:
<?php

function changeTitle($str,$strSymbol='-',$case=MB_CASE_LOWER){// MB_CASE_UPPER / MB_CASE_TITLE / MB_CASE_LOWER
	$str=trim($str);
	if ($str=="") return "";
	$str =str_replace('"','',$str);
	$str =str_replace("'",'',$str);
	$str = stripUnicode($str);
	$str = mb_convert_case($str,$case,'utf-8');
	$str = preg_replace('/[\W|_]+/',$strSymbol,$str);
	return $str;
}

function stripUnicode($str){
	if(!$str) return '';
	//$str = str_replace($a, $b, $str);
	$unicode = array(
		'a'=>'á|à|ả|ã|ạ|ă|ắ|ằ|ẳ|ẵ|ặ|â|ấ|ầ|ẩ|ẫ|ậ|å|ä|æ|ā|ą|ǻ|ǎ',
		'A'=>'Á|À|Ả|Ã|Ạ|Ă|Ắ|Ằ|Ẳ|Ẵ|Ặ|Â|Ấ|Ầ|Ẩ|Ẫ|Ậ|Å|Ä|Æ|Ā|Ą|Ǻ|Ǎ',
		'ae'=>'ǽ',
		'AE'=>'Ǽ',
		'c'=>'ć|ç|ĉ|ċ|č',
		'C'=>'Ć|Ĉ|Ĉ|Ċ|Č',
		'd'=>'đ|ď',
		'D'=>'Đ|Ď',
		'e'=>'é|è|ẻ|ẽ|ẹ|ê|ế|ề|ể|ễ|ệ|ë|ē|ĕ|ę|ė',
		'E'=>'É|È|Ẻ|Ẽ|Ẹ|Ê|Ế|Ề|Ể|Ễ|Ệ|Ë|Ē|Ĕ|Ę|Ė',
		'f'=>'ƒ',
		'F'=>'',
		'g'=>'ĝ|ğ|ġ|ģ',
		'G'=>'Ĝ|Ğ|Ġ|Ģ',
		'h'=>'ĥ|ħ',
		'H'=>'Ĥ|Ħ',
		'i'=>'í|ì|ỉ|ĩ|ị|î|ï|ī|ĭ|ǐ|į|ı',	  
		'I'=>'Í|Ì|Ỉ|Ĩ|Ị|Î|Ï|Ī|Ĭ|Ǐ|Į|İ',
		'ij'=>'ij',	  
		'IJ'=>'IJ',
		'j'=>'ĵ',	  
		'J'=>'Ĵ',
		'k'=>'ķ',	  
		'K'=>'Ķ',
		'l'=>'ĺ|ļ|ľ|ŀ|ł',	  
		'L'=>'Ĺ|Ļ|Ľ|Ŀ|Ł',
		'o'=>'ó|ò|ỏ|õ|ọ|ô|ố|ồ|ổ|ỗ|ộ|ơ|ớ|ờ|ở|ỡ|ợ|ö|ø|ǿ|ǒ|ō|ŏ|ő',
		'O'=>'Ó|Ò|Ỏ|Õ|Ọ|Ô|Ố|Ồ|Ổ|Ỗ|Ộ|Ơ|Ớ|Ờ|Ở|Ỡ|Ợ|Ö|Ø|Ǿ|Ǒ|Ō|Ŏ|Ő',
		'Oe'=>'œ',
		'OE'=>'Œ',
		'n'=>'ñ|ń|ņ|ň|ʼn',
		'N'=>'Ñ|Ń|Ņ|Ň',
		'u'=>'ú|ù|ủ|ũ|ụ|ư|ứ|ừ|ử|ữ|ự|û|ū|ŭ|ü|ů|ű|ų|ǔ|ǖ|ǘ|ǚ|ǜ',
		'U'=>'Ú|Ù|Ủ|Ũ|Ụ|Ư|Ứ|Ừ|Ử|Ữ|Ự|Û|Ū|Ŭ|Ü|Ů|Ű|Ų|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ',
		's'=>'ŕ|ŗ|ř',
		'R'=>'Ŕ|Ŗ|Ř',
		's'=>'ß|ſ|ś|ŝ|ş|š',
		'S'=>'Ś|Ŝ|Ş|Š',
		't'=>'ţ|ť|ŧ',
		'T'=>'Ţ|Ť|Ŧ',
		'w'=>'ŵ',
		'W'=>'Ŵ',
		'y'=>'ý|ỳ|ỷ|ỹ|ỵ|ÿ|ŷ',
		'Y'=>'Ý|Ỳ|Ỷ|Ỹ|Ỵ|Ÿ|Ŷ',
		'z'=>'ź|ż|ž',
		'Z'=>'Ź|Ż|Ž'
	);
	foreach($unicode as $khongdau=>$codau) {
		$arr=explode("|",$codau);
		$str = str_replace($arr,$khongdau,$str);
	}
	return $str;
}


?>
Require function này trong file View/admin/index.php:
require '../../Lib/function.php';
File View/admin/index.php sau khi chỉnh sửa:
<?php
	session_start(); /*đăng ký phiên làm việc*/
	ob_start();
	require '../../Config/config.php';
	require '../../Lib/function.php';
	require '../../Model/Database.php';
	$db = new Database();

	/**
     * Nếu tồn tại session và giá trị level = 1 thì có quyền truy cập trang quản trị viên
     * Ngược lại thì chuyển hướng về trang chủ
     * @var array
     */

	if (!empty($_SESSION['useradmin']) && $_SESSION['useradmin']['level'] == admin) {
		require('layouts/header.php');

		if (isset($_GET['controller'])) {
			require '../../Route/admin/web.php'; /*xử lý các request trong Route/web.php*/
		} else {
			require('pages/home.php');
		}

		require('layouts/footer.php');
	} else {
		header('Location: ../../');
	}

	$db->closeDatabase();

2) Làm chức năng thêm chuyên mục

Đầu tiên chúng ta sẽ đi thiết kế giao diện thêm chuyên mục. Tạo file View/admin/pages/category/add.php và chèn đoạn code sau đây vào: 
<div class="content-wrapper" style="min-height: 353px;">
    <div class="content-header">
        <div class="container-fluid">
            <div class="row mb-2">
                <div class="col-sm-6">
                    <h1 class="m-0 text-dark">Thêm chuyên mục</h1>
                </div><!-- /.col -->
                <div class="col-sm-6">
                    <ol class="breadcrumb float-sm-right">
                        <li class="breadcrumb-item"><a href="#">Chuyên mục</a></li>
                        <li class="breadcrumb-item active">Admin</li>
                    </ol>
                </div>
            </div>
        </div>
    </div>
    <section class="content">
        <div class="container-fluid">
            <form method="post">
                <div class="card-body">
                    <div class="form-group">
                        <label for="exampleInputEmail1">Tên chuyên mục</label>
                        <input type="text" name="name" class="form-control" placeholder="Tên chuyên mục">
                    </div>
                    <button type="submit" name="addCategory" class="btn btn-primary">Thêm</button>
                </div>
            </form>
        </div>
    </section>
</div>
Tiếp theo, tạo file Controller/admin/addCategory.php:
<?php

class AddCategory {
	public function __construct()
	{
		require('pages/category/add.php');
	}
}
Chạy chương trình theo đường dẫn: http://localhost/blog/View/admin/?controller=addCategory để xem kết quả:
Tạo file Model/admin/category.php viết hàm xử lý với database:
<?php

class CategoryModel extends Database{
	protected $db;

	public function __construct()
	{
		$this->db = new Database();
		$this->db->connect();
	}

	public function addCategory($name, $slug)
	{	
		$this->db->conn->real_escape_string($name);
		$sql = "INSERT INTO categories (name, slug)
							VALUES ('$name', '$slug')";
		$this->db->conn->query($sql);
	}
}
Thực hiện xử lý form trong file Controller/admin/addCategory.php:
<?php

class AddCategory {
	public function __construct()
	{
		require('../../Model/admin/category.php');
		$categoryModel = new CategoryModel();
		$name = $slug = NULL;
		$alert = array();

		if (isset($_POST['addCategory'])) {
			$name = $_POST['name'];
			$slug = changeTitle($name);

			if ($name) {
				$categoryModel->addCategory($name, $slug);
				$alert['success'] = 'Thêm thành công';
			}
		}

		require('pages/category/add.php');
	}
}
Xử lý hiện thông báo khi thêm chuyên mục thành công trong file View/admin/pages/category/add.php:
<?php  
                        if (isset($alert['success'])) {?>
                            <div class="form-group alert alert-primary">
                                <?=$alert['success']?>
                            </div>
                        <?php }
                    ?>
File View/admin/pages/category/add.php hoàn chỉnh sau khi hiển thị thông báo:
<div class="content-wrapper" style="min-height: 353px;">
    <div class="content-header">
        <div class="container-fluid">
            <div class="row mb-2">
                <div class="col-sm-6">
                    <h1 class="m-0 text-dark">Thêm chuyên mục</h1>
                </div><!-- /.col -->
                <div class="col-sm-6">
                    <ol class="breadcrumb float-sm-right">
                        <li class="breadcrumb-item"><a href="#">Chuyên mục</a></li>
                        <li class="breadcrumb-item active">Admin</li>
                    </ol>
                </div>
            </div>
        </div>
    </div>
    <section class="content">
        <div class="container-fluid">
            <form method="post">
                <div class="card-body">
                    <?php  
                        if (isset($alert['success'])) {?>
                            <div class="form-group alert alert-primary">
                                <?=$alert['success']?>
                            </div>
                        <?php }
                    ?>
                    <div class="form-group">
                        <label>Tên chuyên mục</label>
                        <input type="text" name="name" class="form-control" placeholder="Tên chuyên mục">
                    </div>
                    <button type="submit" name="addCategory" class="btn btn-primary">Thêm</button>
                </div>
            </form>
        </div>
    </section>
</div>