Đây là bài tổng hợp cực kỳ thú vị trong chương 3. Mục tiêu là bạn có thể áp dụng mọi thứ đã học từ đầu chương vào một project hoàn chỉnh và có cấu trúc rõ ràng.
Chúng ta đã cùng nhau học cách chia nhỏ file, sử dụng biến toàn cục, hằng số, hàm dùng chung, flash message… Giờ là lúc gom hết những mảnh ghép đó thành một hệ thống hoàn chỉnh: Trang liên hệ chuyên nghiệp, có thể tái sử dụng cho mọi website mà bạn xây dựng sau này.
Mục tiêu của mini project
- Giao diện trang liên hệ có form điền tên, email, nội dung.
- Kiểm tra hợp lệ: Không được bỏ trống, email đúng định dạng.
- Gửi thông tin giả lập như thể gửi mail thật.
- Hiển thị thông báo (flash message) khi gửi thành công hoặc lỗi.
- Tách giao diện header/footer, sử dụng hàm & config như bài trước.
Cấu trúc thư mục
Đây là cách tổ chức file/folder đơn giản và gọn gàng:
contact-project/
│
├── includes/
│ ├── config.php
│ ├── functions.php
│ └── flash.php
│
├── templates/
│ ├── header.php
│ └── footer.php
│
├── contact.php
├── handle-contact.php
└── thanks.php
Bắt đầu setup file
includes/config.php
Chứa các hằng số cấu hình:
<?php
define('SITE_NAME', 'Liên hệ với chúng tôi');
define('ADMIN_EMAIL', 'admin@example.com'); // địa chỉ giả lập
includes/functions.php
<?php
function is_valid_email($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
includes/flash.php
Như bài 27:
<?php
session_start();
function set_flash($message, $type = 'success') {
$_SESSION['flash'] = compact('message', 'type');
}
function show_flash() {
if (!empty($_SESSION['flash'])) {
$f = $_SESSION['flash'];
echo "<div class='{$f['type']}'>{$f['message']}</div>";
unset($_SESSION['flash']);
}
}
Giao diện chính: contact.php
<?php
include 'includes/config.php';
include 'includes/functions.php';
include 'includes/flash.php';
include 'templates/header.php';
?>
<h2>Liên hệ với chúng tôi</h2>
<?php show_flash(); ?>
<form action="handle-contact.php" method="POST">
<label>Tên của bạn:</label><br>
<input type="text" name="name"><br><br>
<label>Email:</label><br>
<input type="text" name="email"><br><br>
<label>Nội dung:</label><br>
<textarea name="message"></textarea><br><br>
<button type="submit">Gửi liên hệ</button>
</form>
<?php include 'templates/footer.php'; ?>
Xử lý form: handle-contact.php
<?php
include 'includes/functions.php';
include 'includes/flash.php';
$name = trim($_POST['name']);
$email = trim($_POST['email']);
$message = trim($_POST['message']);
if (!$name || !$email || !$message) {
set_flash("Vui lòng điền đầy đủ thông tin", "error");
header("Location: contact.php");
exit;
}
if (!is_valid_email($email)) {
set_flash("Email không hợp lệ", "error");
header("Location: contact.php");
exit;
}
// Giả lập gửi mail – ghi log hoặc in ra màn hình
file_put_contents('contact-log.txt', "$name <$email>: $message\n", FILE_APPEND);
set_flash("Cảm ơn bạn đã liên hệ, chúng tôi sẽ phản hồi sớm!", "success");
header("Location: thanks.php");
exit;
Trang cảm ơn: thanks.php
<?php
include 'templates/header.php';
include 'includes/flash.php';
show_flash();
?>
<h3>Thông điệp của bạn đã được gửi đi!</h3>
<p>Chúng tôi rất trân trọng phản hồi từ bạn.</p>
<a href="contact.php">Gửi lại</a>
<?php include 'templates/footer.php'; ?>
Tách phần giao diện: templates/header.php
<!DOCTYPE html>
<html>
<head>
<title><?= SITE_NAME ?></title>
<style>
body { font-family: sans-serif; max-width: 600px; margin: auto; }
.error { color: red; }
.success { color: green; }
</style>
</head>
<body>
Và footer.php:
</body>
</html>
Kết luận
Mini project này giúp bạn rèn kỹ năng:
- Tổ chức file có cấu trúc rõ ràng
- Xử lý form, kiểm tra dữ liệu
- Sử dụng flash message để phản hồi người dùng
- Mô phỏng gửi mail thực tế
Bạn hoàn toàn có thể mở rộng project này thành một hệ thống liên hệ thực sự – chỉ cần thêm chức năng gửi email thật bằng mail() hoặc dùng thư viện như PHPMailer. Còn giờ thì hãy tự tay code lại từ đầu một lần để ghi nhớ nhé!

Thảo luận