FastAdmin-T là một khung ứng dụng quản trị dựa trên ThinkPHP, được tối ưu cho phát triển nhanh các hệ thống quản lý nội dung và nghiệp vụ. Dưới đây là tổng hợp các thao tác thiết lập quan trọng, đã được tái cấu trúc để đảm bảo tính rõ ràng, an toàn và tương thích với phiên bản PHP hiện đại.
Cấu hình cơ sở dữ liệu và ghi chú bảng
Để tăng tính minh bạch trong quản lý schema, nên bổ sung ghi chú mô tả cho từng bảng:
ALTER TABLE `student` COMMENT = 'Danh sách sinh viên';
Tích hợp gửi email qua SMTP
Hệ thống hỗ trợ gửi thông báo qua dịch vụ email như Gmail, QQ Mail hoặc Outlook — nhưng yêu cầu kích hoạt đúng giao thức và sử dụng mã ứng dụng (App Password) thay vì mật khẩu tài khoản thông thường:
- Bật SMTP/IMAP trong phần cài đặt bảo mật của tài khoản email.
- Trong phần Cài đặt hệ thống → Cấu hình email, nhập:
- Tên người dùng SMTP: địa chỉ email đầy đủ (ví dụ:
admin@domain.com) - Mật khẩu SMTP: mã ứng dụng đã tạo tại trang quản lý tài khoản
- Email người gửi: phải trùng với tài khoản SMTP hoặc là alias được xác thực
Lưu ý: FastAdmin-T hiện tương thích tốt với PHP 7.4 trở lên — không còn giới hạn ở phiên bản 5.6 như một số tài liệu cũ.
Tùy chỉnh luồng điều hướng
Để chuyển hướng người dùng trực tiếp đến trang đăng nhập khi truy cập trang chủ, sửa trong controller mặc định:
$this->redirect('admin/index/login');
Ẩn đường dẫn truy cập admin nhằm tăng bảo mật
Thực hiện hai bước đồng thời:
- Thêm
'admin'vào danh sách module bị chặn trongapplication/config.php:
'deny_module_list' => ['common', 'admin']
- Đổi tên tập tin
public/admin.phpthành một tên khác (ví dụ:public/secure.php), sau đó cập nhật lại đường dẫn trong logic điều hướng:
$this->redirect('secure.php/index/login');
Bây giờ, trang quản trị chỉ khả dụng qua URL dạng: https://domain.com/secure.php.
Sử dụng hàm trợ giúp trong template
Các hàm dựng sẵn giúp giảm lặp code và tăng tính linh hoạt:
- Tạo thanh công cụ chuẩn:
{:build_toolbar('refresh,add,delete')}
- Chuyển dữ liệu từ PHP sang JavaScript:
$this->assignconfig('api_version', 'v2.1');
Kết quả có thể truy cập trực tiếp trong JS qua Config.api_version.
Quy tắc kiểm tra đầu vào
Áp dụng quy tắc bắt buộc nhập bằng thuộc tính HTML:
<input name="row[username]" data-rule="required" />
Quản lý JavaScript theo mô hình RequireJS
Mỗi module đều tuân theo quy ước phân lớp rõ ràng:
| Loại | Vị trí file |
|---|---|
| Controller | application/admin/controller/user/Index.php |
| View | application/admin/view/user/index.html |
| JavaScript | public/assets/js/backend/user/index.js |
Dữ liệu từ backend có thể được truyền vào đối tượng JS như sau:
const DashboardData = {
columns: {:json_encode(array_keys($summary))},
values: {:json_encode(array_values($summary))},
labels: {:json_encode(array_values($labels))}
};
Hiển thị hành động điều khiển bảng
Điều kiện hiển thị nút "Sửa" hoặc "Xóa" dựa trên quyền người dùng:
data-operate-edit="{:$auth->check('user/index/edit')}"
Trong file JS tương ứng, khởi tạo bảng với cấu hình phù hợp:
Table.api.init({<br> extend: {<br> index_url: 'user/index',<br> add_url: 'user/add',<br> edit_url: 'user/edit'<br> }<br>});
Cấu trúc thư mục mở rộng
extend/: Thư viện tùy chỉnh do nhóm phát triển viết riêngvendor/: Các gói phụ thuộc bên ngoài (Composer)extra/: Tập tin cấu hình mở rộng (ví dụ:wechat.php,oss.php)
Loại bỏ index.php trong URL
Tạo file .htaccess tại thư mục gốc public/ với nội dung:
<IfModule mod_rewrite.c><br> Options +FollowSymlinks -Multiviews<br> RewriteEngine On<br> RewriteCond %{REQUEST_FILENAME} !-d<br> RewriteCond %{REQUEST_FILENAME} !-f<br> RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]<br></IfModule>
Xử lý thao tác hàng loạt
Để hỗ trợ cập nhật đồng thời nhiều bản ghi (ví dụ: bật/tắt trạng thái), khai báo trường được phép sửa trong controller:
protected $multiFields = 'status,enabled,verified';
Nếu cần xử lý logic đặc thù, ghi đè phương thức multi():
public function multi($ids = "")<br>{<br> $params = $this->request->request('params');<br> parse_str($params, $data);<br> if (!empty($data) && is_array($data)) {<br> $model = \app\admin\model\User::get($ids);<br> $model->allowField(true)->save($data);<br> $this->success('Cập nhật thành công');<br> }<br> return parent::multi($ids);<br>}
Liên kết dữ liệu dạng dropdown (selectpage)
Để tích hợp bộ chọn thông minh với tìm kiếm động, sử dụng thuộc tính data-source:
<input type="text" name="row[category_id]"<br> class="form-control selectpage"<br> data-source="category/selectpage"<br> data-params='{"custom[type]":"news"}'<br> data-field="id"<br value="" /></code>
Trong controller Category::selectpage(), trả về dữ liệu dưới dạng mảng gồm id và name.
Truy vấn liên kết nâng cao (Eager Loading)
Khi cần lấy dữ liệu kèm thông tin từ bảng liên quan (ví dụ: đơn hàng + chi tiết giỏ hàng), cấu hình trong action index():
$this->relationSearch = true;<br>$this->searchFields = ['id', 'user_id'];<br><br>if ($this->request->isAjax()) {<br> list($where, $sort, $order, $offset, $limit) = $this->buildparams();<br> <br> $total = $this->model<br> ->with(['cart' => function ($query) {<br> $query->field('id,product_name,quantity');<br> $query->where('status', 'active');<br> }])<br> ->where($where)<br> ->order($sort, $order)<br> ->count();<br> <br> $list = $this->model<br> ->with(['cart'])<br> ->where($where)<br> ->order($sort, $order)<br> ->limit($offset, $limit)<br> ->select();<br> <br> return json(['total' => $total, 'rows' => $list]);<br>}<br>return $this->view->fetch();
Hỗ trợ kiểu dữ liệu ENUM/SET tự động render
Khi định nghĩa cột kiểu ENUM('draft','published','archived'), hãy ghi chú trong MySQL như sau:
COMMENT 'Trạng thái: 0=draft, 1=published, 2=archived'
Hệ thống sẽ tự động sinh ra control dropdown tương ứng trong form.
Cấu trúc thư mục frontend
application/index/controller/: Controller phía người dùngapplication/index/view/: Template frontendapplication/index/view/default/common/layout.html: Giao diện chungapplication/index/view/default/index/: Trang chủapplication/index/view/default/common/sidebar.html: Sidebar động
Để nhúng sidebar vào trang chủ, dùng cú pháp:
{include file="common/sidebar" /}
Biến hệ thống và cấu hình
Các biến toàn cục có thể truy cập trực tiếp trong template:
- Tên website:
{$site.name} - Thông tin cấu hình CMS:
{$config.sitename} - In toàn bộ cấu hình:
<?php var_dump($config); ?>
Tùy chỉnh giao diện xuất dữ liệu
Để thay đổi hành vi nút "Xuất Excel", chỉnh sửa hàm this.options.formatExport() trong tệp:
public/assets/js/require-backend.min.js
Quy ước đặt tên file theo lớp
Mỗi thực thể dữ liệu có cấu trúc thư mục chuẩn:
| Thành phần | Đường dẫn |
|---|---|
| Controller | application/admin/controller/student/Student.php |
| Model | application/admin/model/Student.php |
| View | application/admin/view/student/student/index.html |
| Validate | application/admin/validate/Student.php |
| Ngôn ngữ (zh-cn) | application/admin/lang/zh-cn/student/student.php |
| JavaScript | public/assets/js/backend/student/student.js |