Chuyển tới nội dung chính
Phiên bản: 8.0.0

Cấu Hình Giao Diện

Trong v8, CMS đã cung cấp sẵn một hệ thống Theme Options mạnh mẽ tại đường dẫn Admin → Giao diện → Cấu hình. Hệ thống này được xây dựng trên Class SkillDo\Cms\Support\ThemeOption.

Theme Options cho phép admin tùy chỉnh giao diện website qua form UI. Dữ liệu lưu vào database qua Option::get/update, dùng trong theme để build CSS/layout.


1. Thêm Nhóm Cấu Hình Chính (Group)

Một Group đại diện cho một Tab bấm lớn bên trái màn hình Cấu hình Theme. Bạn sử dụng hàm tĩnh ThemeOption::addGroup() kết hợp với Hook theme_custom_options để đăng ký Tab này.

Ví dụ tạo file bootstrap/theme-options.php:

use SkillDo\Cms\Support\ThemeOption;
use SkillDo\Form\Form;

add_action('theme_custom_options', function () {

// Tạo 1 Tab mới tên ID là 'general'
ThemeOption::addGroup('general', [
'position' => 10, // Thứ tự sắp xếp (số nhỏ xếp lên trên)
'label' => 'Cấu hình chung',
'icon' => '<i class="fa-light fa-screwdriver-wrench"></i>',
'root' => false, // Set true nếu chỉ cấp quyền Super Admin mới thấy Tab

// Khai báo giao diện các Input trong Panel
'form' => function(Form $form) {
$form->text('general_label', ['label' => 'Tên website (shop)']);
$form->color('theme_color', ['label' => 'Màu chủ đề']);
$form->background('bodyBg', ['label' => 'Nền website']);
}
]);

});
Param $argsTypeMô tảDefault
positionintThứ tự sắp xếp (thấp = trước)0
labelstringTên nhóm hiển thị trong tabbắt buộc
iconstringHTML icon đại diện''
formForm|callableForm object hoặc closure trả về Formnull
rootboolChỉ hiển thị với tài khoản rootfalse

2. Thêm Nhóm Con (Group Sub)

Nếu trong 1 Tab lớn general có quá nhiều chức năng, bạn có thể phân rã thành nhóm Sub (các Box nhỏ xếp trong lưới màn hình bên phải). Sử dụng hàm ThemeOption::addGroupSub().

add_action('theme_custom_options', function () {

// Thêm nhóm Sub 'FOOTER BOTTOM' chui vào bên trong TAB Tên 'general'
ThemeOption::addGroupSub('general', 'general-bottom', [
'label' => 'Cấu Hình Footer Dưới Cùng',
'form' => function(Form $form) {

// Hàm switch() tạo ra Nút Bật/Tắt công tắc
$form->switch('footer_bottom_public', [
'label' => 'Bật hiển thị footer',
'start' => 4,
]);

// Hàm color() tạo ô chọn màu
$form->color('footer_bottom_bg_color', ['label' => 'Màu Nền footer v8', 'start' => 4]);
$form->color('footer_bottom_text_color', ['label' => 'Màu chữ footer', 'start' => 4]);
}
]);

});

3. Thêm Một Trường Lẻ Mới (Add Field) Vào Nhóm Đã Có

Trường hợp bạn không muốn tạo thêm Tab, mà chỉ muốn Bơm thêm 1 vài Ô nhập liệu con vào sẵn các Tab Mặc Định đã thiết kế bởi Core CMS/Theme, hãy sử dụng hàm ThemeOption::addField().

// Bơm thêm ô 'Màu khung logo' vào Tab ID là 'header'
ThemeOption::addField('header', 'logo_bg', 'color', [
'label' => 'Màu khung logo',
'start' => 4,
]);

// Bơm thêm ô text 'Số lượng Cột' vảo Tab Gốc 'general'
ThemeOption::addField('general', 'column_limit', 'number', [
'label' => 'Số lượng Cột lưới',
'default' => 4
]);

4. Ví Dụ Thực Tế — Thêm Option Trong Plugin

Plugin có thể thêm tab option vào Theme Options từ ServiceProvider::boot():

public function boot(): void
{
add_action('theme_custom_options', function () {

ThemeOption::addGroup('my-plugin', [
'position' => 50,
'label' => 'My Plugin',
'icon' => '<i class="fa-light fa-box"></i>',
'form' => function(\SkillDo\Form\Form $form) {
$form->switch('my_plugin_enabled', [
'label' => 'Bật plugin',
]);
$form->number('my_plugin_limit', [
'label' => 'Số sản phẩm/trang',
'default' => 12,
]);
$form->color('my_plugin_color', [
'label' => 'Màu chủ đạo',
]);
}
]);

ThemeOption::addGroupSub('my-plugin', 'my-plugin-advanced', [
'label' => 'Nâng cao',
'form' => function(\SkillDo\Form\Form $form) {
$form->textarea('my_plugin_custom_css', [
'label' => 'CSS tùy chỉnh',
]);
}
]);
});
}

5. Các Hook Sửa Khung Options Của Core (Dành Cho Viết Plugin)

CMS V8 tạo điều kiện rất lớn cho các Theme Child hoặc các Plugin ghi đè Options Form mà không cần gọi API Code rườm rà, bạn có thể sửa trực tiếp Form Obj thông qua Filter Hooks.

Hooks Theme Options

HookTypeMô tả
theme_custom_optionsactionThêm/sửa theme options
theme_option_savefilterChỉnh data trước khi lưu
theme_options_general_formfilterSửa form tab "Cấu hình chung"
theme_options_header_formfilterSửa form tab "Header"
theme_options_footer_formfilterSửa form tab "Footer"
theme_options_footer_bottom_formfilterSửa form tab "Footer Bottom"
theme_options_post_formfilterSửa form tab "Bài viết"
theme_options_post_category_formfilterSửa form tab "Danh mục bài viết"
theme_options_fonts_formfilterSửa form tab "Font style"
theme_option_setupactionSau khi tất cả options đã load

Ví dụ ứng dụng Filter Hook sửa Option Header:

use SkillDo\Form\Form;

add_filter('theme_options_header_form', function(Form $form) {
// Ép thêm ô chọn logo phụ vào Giao diện Option có sẵn
$form->image('header_logo_mobile', ['label' => 'Logo hiển thị riêng di động']);

return $form;
});

5. Gọi Data Đã Lưu Dưới Frontend (Views)

Một khi Admin cấu hình và Bấm Nút "Lưu thay đổi" ở màn hình Backend Cấu Hình Theme, mọi dữ liệu File, Văn bản, Màu sắc sẽ tự động ghi vào Table options. Để móc lấy Data ra hiển thị ở Front-end Layouts Blade, bạn sử dụng Option::get($key, $default).

Ví dụ In cấu hình Màu Theme Color vào Menu thẻ <style>:

use SkillDo\Cms\Support\Option;

// Lấy tham số 'theme_color', nếu hệ thống chưa lưu thì lấy mặc định '#000000'
$color = Option::get('theme_color', '#000000');

In ra View Blade:

<div class="footer-area">
<!-- Gọi trực tiếp Option từ Frontend -->
<h3>Bản quyền: {{ Option::get('general_label', 'CMS V8') }}</h3>
</div>