Back to Main Site

Tổng quan về Kiến trúc hệ thống PolyCMS

Last updated on Jul 10, 2026 4:16 AM

Kiến trúc Model-View-Controller (MVC)

PolyCMS tuân thủ nghiêm ngặt mô hình kiến trúc Model-View-Controller (MVC) được phát triển trên nền tảng CodeIgniter — cùng một bộ khung framework chạy hệ thống Perfex CRM. Điều này đảm bảo sự đồng bộ và tích hợp mượt mà nhất với cơ sở mã nguồn hiện có của CRM.

Cấu trúc tệp tin mã nguồn

modules/polycms/
├── assets/              # Mã nguồn CSS, JS, hình ảnh cho admin & frontend
├── controllers/         # Các Controller xử lý MVC
│   ├── Posts.php         # Thao tác CRUD trên bài viết
│   ├── Pages.php         # Quản lý trang tĩnh
│   ├── Categories.php    # Quản lý chuyên mục
│   ├── Tags.php          # Quản lý thẻ tag
│   ├── Media.php         # Thao tác trên thư viện phương tiện
│   ├── Comments.php      # Kiểm duyệt bình luận của độc giả
│   ├── Menus.php         # Trình dựng menu kéo thả
│   ├── Themes.php        # Quản lý giao diện theme
│   ├── Plugins.php       # Quản lý các plugin bổ trợ
│   ├── Settings.php      # Thiết lập hệ thống CMS
│   ├── Tools.php         # Sao lưu, Nhập/Xuất dữ liệu
│   ├── Frontend.php      # Điều phối định tuyến và hiển thị trang ngoài
│   └── Dashboard.php     # Bảng điều khiển CMS
├── helpers/             # Các hàm bổ trợ (Helper functions)
│   ├── polycms_blog_helper.php
│   ├── polycms_seo_helper.php
│   └── polycms_hook_helper.php
├── language/            # 16 gói ngôn ngữ hệ thống
├── libraries/           # Các lớp dịch vụ (Service classes)
│   ├── ThemeLoader.php   # Điều phối hiển thị tệp template của theme
│   ├── PluginManager.php # Quản lý vòng đời hoạt động của các plugin
│   └── ShortcodeParser.php # Trình phân tích mã shortcode
├── models/              # Các Model tương tác cơ sở dữ liệu
│   ├── Blog_post_model.php
│   ├── Blog_category_model.php
│   └── ... (mỗi model cho một nhóm bảng tương ứng)
├── plugins/             # Các plugin đi kèm mặc định (gồm 5 plugin)
├── themes/              # Các giao diện theme đi kèm mặc định
├── views/               # Các tệp template hiển thị admin & frontend
├── migrations/          # Các tệp cập nhật cơ sở dữ liệu migration
├── documentations/      # Tài liệu hướng dẫn đi kèm
├── install.php          # Lược đồ khởi tạo các bảng database khi cài đặt
├── uninstall.php        # Quy trình gỡ cài đặt an toàn (giữ nguyên dữ liệu)
└── polycms.php          # Tệp khai báo mô-đun và đăng ký các hook hệ thống

Cấu trúc các bảng cơ sở dữ liệu (Database Schema)

PolyCMS khởi tạo 16 bảng dữ liệu chuyên biệt, tất cả đều được đặt tiền tố bảng mặc định của Perfex CRM + blog_:

Nhóm phân loạiCác bảng cơ sở dữ liệu tương ứng
Nội dung (Content)blog_posts, blog_pages, blog_page_meta
Phân loại (Taxonomy)blog_categories, blog_tags, blog_post_categories, blog_post_tags, blog_post_meta
Tương tác (Engagement)blog_comments
Điều hướng (Navigation)blog_menus, blog_menu_items, blog_widgets
Mở rộng (Extensions)blog_plugins, blog_plugin_options, blog_themes, blog_theme_options
Cấu hình (Configuration)blog_settings, blog_permalink_settings

Tất cả các bảng đều được thiết lập chặt chẽ các ràng buộc khóa ngoại (foreign key constraints) và chỉ mục index để tối ưu hóa tốc độ truy xuất. Dữ liệu của CMS hoàn toàn cô lập độc lập với dữ liệu khách hàng của CRM.

Vòng đời xử lý yêu cầu (Request Lifecycle)

Các yêu cầu trong trang quản trị (Admin Requests)

  1. Perfex CRM chuyển tiếp định tuyến yêu cầu đến controller tương ứng của PolyCMS.
  2. Controller tiến hành xác thực quyền hạn nhân sự qua hàm staff_can().
  3. Controller gọi Model xử lý các truy vấn cơ sở dữ liệu tương ứng.
  4. Model trả về kết quả dữ liệu thông qua cơ chế CodeIgniter Active Record.
  5. Controller truyền dữ liệu vào tệp View admin tương ứng để hiển thị giao diện.

Các yêu cầu ở trang ngoài (Frontend Requests)

  1. Hệ thống định tuyến động so khớp đường dẫn URL hiện tại với các quy tắc permalink.
  2. Controller Frontend.php xác định định dạng nội dung cần hiển thị (bài viết, trang tĩnh, chuyên mục, thẻ tag, trang tìm kiếm hay trang lưu trữ).
  3. Kích hoạt các sự kiện hooks: polycms_frontend_init, polycms_head.
  4. Lớp ThemeLoader phân tích cấu trúc phân cấp để chọn tệp template hiển thị tương ứng của theme.
  5. Render giao diện tệp template kết hợp xử lý các widget và mã shortcodes đính kèm.
  6. Kích hoạt sự kiện hook: polycms_footer.

Kiến trúc Hệ thống Plugins

Các plugin được quản lý và tải lên bởi lớp PluginManager trong quá trình khởi tạo mô-đun:

  1. Quét thư mục plugins/ để đọc thông tin tệp cấu hình plugin.json.
  2. Đối chiếu trạng thái kích hoạt của plugin trong bảng dữ liệu blog_plugins.
  3. Tải các tệp tin mã nguồn chính của các plugin đang hoạt động.
  4. Các plugin đăng ký các điểm neo tương ứng thông qua các hàm polycms_add_action()polycms_add_filter().
  5. Các hooks này sẽ tự động được kích hoạt tại các thời điểm tương ứng trong vòng đời xử lý yêu cầu.

Kiến trúc Hệ thống Giao diện (Themes)

Lớp ThemeLoader chịu trách nhiệm điều phối việc hiển thị giao diện:

  1. Đọc giao diện đang hoạt động được lưu trong bảng blog_themes.
  2. Xác định định dạng nội dung hiển thị từ yêu cầu của trang.
  3. Tìm kiếm tệp template theo phân cấp: single.phpcategory.phptag.phppage.phpindex.php.
  4. Tải tệp template trùng khớp đầu tiên tìm thấy trong thư mục theme tương ứng.
  5. Truyền các dữ liệu nội bộ, thông số widget và cấu hình theme options vào phạm vi hiển thị của template.

Cơ chế bảo mật hệ thống

  • Lớp kiểm soát quyền hạn — Toàn bộ các thao tác chỉnh sửa của admin đều được kiểm duyệt qua hàm staff_can('polycms', ...).
  • Lọc mã độc XSS — Tích hợp thư viện HTMLPurifier để xử lý sạch mọi nội dung văn bản đa định dạng.
  • Ngăn chặn SQL Injection — Sử dụng trình dựng truy vấn CodeIgniter Active Record/Query Builder an toàn.
  • Bảo vệ tệp tin hệ thống — Hàm polycms_validate_file_path ngăn chặn triệt để các hành vi dò tìm thư mục chéo.
  • Giới hạn tần suất gọi (Rate Limiting) — Cơ chế lưu bộ nhớ đệm IP giúp giới hạn tần suất truy cập ở các endpoint công khai.
  • Chốt chặn BASEPATH — Mọi tệp tin PHP của hệ thống đều bắt đầu bằng dòng lệnh khóa bảo vệ defined('BASEPATH') or exit().

Tài liệu hướng dẫn liên quan