Joomla Bài học 31: Khởi tạo Custom Component đầu tiên từ con số 0, cấu trúc thư mục MVC và file manifest com_custom.xml.
Chào mừng bạn chính thức bước sang Phần 4: Lập trình Component chuyên sâu - MVC Architecture (Bài 31 - 40).
Sau khi đã làm chủ toàn bộ hệ thống quản trị, phân quyền, SEO, bảo mật và thiết kế giao diện (Template), đây là lúc chúng ta chạm tay vào cốt lõi mạnh mẽ nhất của một lập trình viên Joomla: Tự viết Custom Component từ con số 0. Không giống như các CMS khác chỉ cho phép tạo trang tĩnh, kiến trúc MVC (Model - View - Controller) của Joomla cung cấp một framework hướng đối tượng vô cùng chuẩn mực, giúp bạn xây dựng các ứng dụng web phức tạp (như hệ thống quản lý khóa học, thương mại điện tử, đặt phòng, CRM nội bộ) với hiệu năng cực cao và tính bảo mật tuyệt đối.
Trong Joomla Bài học 31, chúng ta sẽ thiết kế cấu trúc thư mục chuẩn cho một Custom Component (đặt tên mã là com_custom hoặc com_joomlalab), giải phẫu tệp tin định danh hệ thống Manifest XML và khởi tạo bảng cơ sở dữ liệu đầu tiên.
1. Kiến trúc MVC trong hệ sinh thái Joomla 5
Joomla áp dụng mô hình MVC (Model - View - Controller) kết hợp với chuẩn PSR-4 Namespaces của PHP 8.2+. Điểm đặc biệt của một Joomla Component là nó tách biệt hoàn toàn giữa hai môi trường:
-
Administrator (Phía quản trị): Nơi quản lý dữ liệu, thao tác CRUD (Create, Read, Update, Delete) cho các Admin.
-
Site (Phía người dùng cuối - Frontend): Nơi hiển thị dữ liệu ra ngoài cho khách truy cập xem và tương tác.
2. Cấu trúc thư mục chuẩn của một Custom Component hiện đại
Trong Joomla 5, toàn bộ các lớp PHP (Controllers, Models, Views) được đặt bên trong thư mục src/ để tận dụng không tên không gian (Namespace tự động), trong khi các file giao diện HTML/PHP được tách riêng vào thư mục tmpl/.
Hãy tạo cây thư mục chuẩn cho Component mới của chúng ta (ví dụ đặt tên là com_joomlalab hoặc com_custom) bên trong mã nguồn:
Plaintext
com_custom/
├── admin/ <-- Khu vực quản trị (Administrator)
│ ├── sql/
│ │ ├── install.mysql.utf8.sql (Script tạo bảng database khi cài đặt)
│ │ └── uninstall.mysql.utf8.sql (Script xóa bảng database khi gỡ cài đặt)
│ ├── src/
│ │ ├── Controller/
│ │ │ └── DisplayController.php (Controller mặc định phía Admin)
│ │ ├── Extension/
│ │ │ └── CustomComponent.php (Dependency Injection & Khởi tạo Component)
│ │ ├── Model/
│ │ │ └── ItemsModel.php (Truy vấn SQL lấy danh sách bản ghi)
│ │ └── View/
│ │ └── Items/
│ │ └── HtmlView.php (View hiển thị danh sách dạng HTML)
│ └── tmpl/
│ └── items/
│ └── default.php (Giao diện bảng danh sách phía Admin)
├── site/ <-- Khu vực hiển thị ngoài Frontend
│ ├── src/
│ │ ├── Controller/
│ │ │ └── DisplayController.php
│ │ ├── Model/
│ │ │ └── ItemModel.php
│ │ └── View/
│ │ └── Item/
│ │ └── HtmlView.php
│ └── tmpl/
│ └── item/
│ └── default.php
└── custom.xml <-- File Manifest định danh Component (Gốc)
3. Giải phẫu chi tiết file Manifest (custom.xml)
File Manifest (custom.xml hoặc trùng với tên component) là "chứng minh thư" của component. Khi bạn cài đặt gói .zip lên Joomla, hệ thống sẽ đọc file này để biết cần tạo bảng nào trong database, copy file nào vào thư mục nào và khai báo các menu quản trị ra sao.
Tạo file src/administrator/components/com_custom/custom.xml với nội dung chuẩn Joomla 5:
XML
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" method="upgrade">
<name>com_custom</name>
<author>Hieu Nguyen</author>
<creationDate>2026-11</creationDate>
<copyright>Copyright (C) 2026 JoomlaLab. All rights reserved.</copyright>
<license>GNU General Public License version 2 or later</license>
<version>1.0.0</version>
<description>COM_CUSTOM_XML_DESCRIPTION</description>
<!-- 1. KHAI BÁO SCRIPT TẠO VÀ XÓA DATABASE KHI CÀI ĐẶT/GỠ BỎ -->
<install>
sql>
<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
</sql>
</install>
<uninstall>
<sql>
<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
</sql>
</uninstall>
<!-- 2. KHAI BÁO FILE VÀ THƯ MỤC PHÍA QUẢN TRỊ (ADMINISTRATOR) -->
<administration>
<menu img="class:icon-cube" alt="Custom Component">COM_CUSTOM_TITLE</menu>
<files folder="admin">
<folder>sql</folder>
<folder>src</folder>
<folder>tmpl</folder>
</files>
</administration>
<!-- 3. KHAI BÁO FILE VÀ THƯ MỤC PHÍA NGƯỜI DÙNG (SITE) -->
<files folder="site">
<folder>src</folder>
<folder>tmpl</folder>
</files>
</extension>
4. Thiết lập Script khởi tạo Database (sql/install.mysql.utf8.sql)
Để component có nơi lưu trữ dữ liệu, chúng ta khai báo bảng mẫu #__custom_items trong file cài đặt SQL.
Tạo file src/administrator/components/com_custom/sql/install.mysql.utf8.sql:
SQL
CREATE TABLE IF NOT EXISTS `#__custom_items` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`title` VARCHAR(255) NOT NULL,
`alias` VARCHAR(255) NOT NULL,
`description` TEXT DEFAULT NULL,
`state` TINYINT(3) NOT NULL DEFAULT 1,
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`created_by` INT(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Và file hủy cài đặt tương ứng src/administrator/components/com_custom/sql/uninstall.mysql.utf8.sql:
SQL
DROP TABLE IF EXISTS `#__custom_items`;
5. Tổng kết bài học
-
Hiểu rõ kiến trúc phân tách hai môi trường Administrator và Site trong một Custom Component của Joomla 5.
-
Nắm vững cấu trúc thư mục sử dụng chuẩn Namespace
src/hiện đại. -
Thành thạo việc thiết kế file Manifest XML để khai báo menu quản trị, cấu trúc file và script SQL tự động tạo bảng.
Trong Bài học 32, chúng ta sẽ tiến hành lập trình các lớp xử lý cốt lõi đầu tiên cho phía Backend: Lập trình Controller và Model quản lý danh sách dữ liệu (CRUD List View).
All Rights Reserved