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

Model Mặc Định

Đây là toàn bộ các Model được cung cấp sẵn bởi SkillDo CMS và Framework. Bạn có thể sử dụng trực tiếp các Model này trong Plugin hoặc Theme mà không cần khai báo lại.

Các Model đều nằm trong hai package chính:

  • CMS: packages/skilldo/cms/src/Models/
  • Namespace SkillDo\Cms\Models
  • Framework (API): packages/skilldo/framework/src/Api/Models/
  • Namespace SkillDo\Api\Models

Về alias: CmsServiceProvider::aliases() đăng ký các Model CMS dưới namespace alias SkillDo\Model\* (vd: SkillDo\Model\Post, SkillDo\Model\User...). Chỉ riêng \Gallery\GalleryItem có alias gốc (root alias) trỏ thẳng vào Model. Lưu ý hai alias gốc dễ nhầm:

  • \LanguageSkillDo\Cms\Support\Language (class hỗ trợ đa ngôn ngữ, không phải Model SkillDo\Cms\Models\Language)
  • \ThemeMenuSkillDo\Cms\Menu\ThemeMenu (class quản lý menu, không phải Model SkillDo\Cms\Models\ThemeMenu)

1. CMS Models

Post — Bài Viết

Thuộc tínhGiá trị
Filecms/src/Models/Post.php
NamespaceSkillDo\Cms\Models\Post
Bảng DB{prefix}post
AliasSkillDo\Model\Post
TraitsSoftDeletes, ModelRoute, ModelLanguage
Route typepost
Language typepost

Mô tả: Model quản lý bài viết (blog, tin tức, portfolio...). Hỗ trợ đa ngôn ngữ, URL slug, Soft Delete và phân loại theo post_type.

Ví dụ sử dụng:

use SkillDo\Cms\Models\Post;

// Lấy 10 bài viết mới nhất dạng 'post' đang public
$posts = Post::where('post_type', 'post')
->orderBy('created', 'desc')
->limit(10)
->get();

// Lấy bài viết theo ID
$post = Post::find(5);
echo $post->title;
echo $post->content;

// Tạo bài viết mới
$id = Post::create([
'title' => 'Tiêu đề bài viết',
'content' => '<p>Nội dung...</p>',
'post_type' => 'post',
'public' => 1,
]);

PostCategory — Danh Mục Bài Viết

Thuộc tínhGiá trị
Filecms/src/Models/PostCategory.php
NamespaceSkillDo\Cms\Models\PostCategory
Bảng DB{prefix}categories
AliasSkillDo\Model\PostCategory
TraitsModelRoute, ModelLanguage
Route typepost_categories
Language typepost_categories

Mô tả: Model quản lý danh mục bài viết. Hỗ trợ cấu trúc cây phân cấp (NestedSet), đa ngôn ngữ, URL slug. Field cate_type để phân biệt loại danh mục (mặc định post_categories).

Ví dụ sử dụng:

use SkillDo\Cms\Models\PostCategory;

// Lấy toàn bộ danh mục dạng cây phẳng (flat tree, duyệt cha → con) — trả về array
$categories = PostCategory::tree();

// Lấy dạng phân cấp lồng nhau (mỗi item có ->child) — trả về Collection
$categories = PostCategory::multilevel();

// Lấy danh mục dạng options cho select box (id => name) — trả về Collection
$options = PostCategory::options();

// Lấy danh mục theo cate_type riêng (dùng cho portfolio, project...)
$categories = PostCategory::where('cate_type', 'portfolio_categories')->tree();

// Lấy danh mục của một bài viết cụ thể — trả về Collection
$categories = PostCategory::getsByPost(5);

Lưu ý: tree(), multilevel(), options(), getsByPost() là các scope thực thi query ngay và trả về kết quả (array/Collection) — không chain ->get() phía sau. Các điều kiện where(...) phải đặt trước khi gọi scope.


Tag — Thẻ

Thuộc tínhGiá trị
Filecms/src/Models/Tag.php
NamespaceSkillDo\Cms\Models\Tag
Bảng DB{prefix}tags + bảng nối {prefix}tag_relationships
AliasSkillDo\Model\Tag
TraitsModelLanguage
Language typetags
Có từphiên bản 8.1.3

Mô tả: Phân loại phẳng, không phân cấp cho nội dung. Khác với PostCategory, thẻ dùng bảng riêng và không ghi vào bảng routes — toàn bộ trang lưu trữ dùng chung một route /tag/{slug}, nên slug chỉ cần duy nhất trong phạm vi bảng tags.

Ví dụ sử dụng:

use SkillDo\Cms\Models\Tag;
use SkillDo\Cms\Support\TagService;

// Thẻ của một bài viết
$tags = TagService::getsByObject($postId);

// Danh sách [id => name] cho select
$options = Tag::query()->options();

// Lọc bài viết theo thẻ
$posts = Post::where('public', 1)->whereByTag($tag)->get();

Chi tiết đầy đủ (bật thẻ cho post type khác, field nhập thẻ, hook mở rộng): xem Thẻ (Tag).


Page — Trang Nội Dung

Thuộc tínhGiá trị
Filecms/src/Models/Page.php
NamespaceSkillDo\Cms\Models\Page
Bảng DB{prefix}page
AliasSkillDo\Model\Page
TraitsSoftDeletes, ModelRoute, ModelLanguage
Route typepage
Language typepage

Mô tả: Model quản lý trang nội dung tĩnh (About, Contact, Privacy...). Tương tự Post nhưng không có post_type, dành riêng cho các trang đơn.

Ví dụ sử dụng:

use SkillDo\Cms\Models\Page;

$page = Page::where('slug', 'gioi-thieu')->first();
echo $page->title;
echo $page->content;

User — Người Dùng

Thuộc tínhGiá trị
Filecms/src/Models/User.php
NamespaceSkillDo\Cms\Models\User
Bảng DB{prefix}users
AliasSkillDo\Model\User
TraitsSoftDeletes

Mô tả: Model quản lý tài khoản người dùng. Tích hợp sẵn validation username/email, hash mật khẩu Argon2id (fallback Bcrypt nếu PHP không hỗ trợ, tự migrate hash MD5 cũ khi đăng nhập), cập nhật Role tự động khi saved. Dùng Eloquent Builder riêng: SkillDo\Database\Eloquent\UserBuilder.

Các cột chính: username, password, salt, firstname, lastname, email, phone, status, activation_key, role

Ví dụ sử dụng:

use SkillDo\Cms\Models\User;

// Tìm user theo email
$user = User::where('email', 'test@example.com')->first();

// Tạo user mới (password tự động hash)
$userId = User::create([
'username' => 'john_doe',
'password' => 'mypassword123', // Sẽ được hash tự động trong saving event
'firstname' => 'John',
'lastname' => 'Doe',
'email' => 'john@example.com',
'role' => 'subscriber',
]);

// Đổi mật khẩu
$user = User::find(5);
$user->changePassword('newPassword123');

// Lấy danh sách bài viết của user
$posts = $user->posts()->get();

Thuộc tínhGiá trị
Filecms/src/Models/Gallery.php
NamespaceSkillDo\Cms\Models\Gallery
Bảng DB{prefix}group (dùng chung với ThemeMenu, phân biệt bởi object_type = 'gallery')
Alias\Gallery, SkillDo\Model\Gallery

Mô tả: Model quản lý Album/Group gallery. Global scope tự thêm object_type = 'gallery'. Khi xóa Album sẽ tự động xóa toàn bộ GalleryItem bên trong (theo group_id). Có các helper static Gallery::addOption(), Gallery::getOption(), Gallery::removeOption() (ủy quyền cho GalleryOption).

use SkillDo\Cms\Models\Gallery;

$galleries = Gallery::orderBy('order')->get();

GalleryItem — Ảnh Trong Album

Thuộc tínhGiá trị
Filecms/src/Models/GalleryItem.php
NamespaceSkillDo\Cms\Models\GalleryItem
Bảng DB{prefix}galleries
Alias ngắn\GalleryItem

Mô tả: Model quản lý từng ảnh/file trong gallery. Hỗ trợ metadata (alt text, caption...). Dùng object_type để gắn với đối tượng cha (vd: post_post, products).

use SkillDo\Cms\Models\GalleryItem;

// Lấy gallery của một bài viết
$images = GalleryItem::where('object_id', 5)
->where('object_type', 'post_post')
->orderBy('order')
->get();

// Thêm ảnh vào gallery của bài viết
GalleryItem::create([
'object_id' => 5,
'object_type' => 'post_post',
'value' => 'uploads/2026/03/photo.jpg',
]);

ThemeMenu — Menu Điều Hướng (Nhóm)

Thuộc tínhGiá trị
Filecms/src/Models/ThemeMenu.php
NamespaceSkillDo\Cms\Models\ThemeMenu
Bảng DB{prefix}group (dùng chung, phân biệt bởi object_type = 'menu')
Alias ngắn\ThemeMenu

Mô tả: Model quản lý nhóm/vị trí Menu (Header, Footer, Sidebar...). options là mảng liệt kê các location mà menu này được gán vào.

use SkillDo\Cms\Models\ThemeMenu;

// Lấy menu theo vị trí (location)
$menu = ThemeMenu::getByLocation('header');

// Lấy tất cả menu — dùng all(), KHÔNG dùng get() (get() tĩnh chỉ trả về 1 bản ghi)
$menus = ThemeMenu::all();

ThemeMenuItem — Mục Menu

Thuộc tínhGiá trị
Filecms/src/Models/ThemeMenuItem.php
NamespaceSkillDo\Cms\Models\ThemeMenuItem
Bảng DB{prefix}menu
Alias ngắn\ThemeMenuItem

Mô tả: Model quản lý từng mục trong Menu (link, bài viết, trang, danh mục...). Hỗ trợ phân cấp (parent_id) và getItems() để lấy cây menu đệ quy.

use SkillDo\Cms\Models\ThemeMenuItem;

// Lấy các mục menu cấp 1 của một menu cụ thể
$items = ThemeMenuItem::where('menu_id', 1)
->where('parent_id', 0)
->orderBy('order')
->get();

// Lấy cây menu đầy đủ (đệ quy)
ThemeMenuItem::getItems($items, 1);

foreach ($items as $item) {
echo $item->name . ' → ' . $item->slug;
foreach ($item->child as $child) {
echo ' ' . $child->name;
}
}

Widget — Widget Sidebar

Thuộc tínhGiá trị
Filecms/src/Models/Widget.php
NamespaceSkillDo\Cms\Models\Widget
Bảng DB{prefix}widget
Alias ngắn\Widget

Mô tả: Model lưu trữ dữ liệu cấu hình của các Widget được đặt vào Sidebar.


Router — Bảng URL Routing

Thuộc tínhGiá trị
Filecms/src/Models/Router.php
NamespaceSkillDo\Cms\Models\Router
Bảng DB{prefix}routes
Alias ngắn\Router

Mô tả: Model nội bộ của hệ thống, lưu trữ bảng mapping giữa slug URL và Controller xử lý tương ứng. Được quản lý tự động bởi Trait ModelRoutethông thường không cần thao tác trực tiếp.

use SkillDo\Cms\Models\Router;

// Tìm route theo slug
$route = Router::where('slug', 'san-pham-a')->first();
echo $route->controller; // Ecommerce\Controllers\Web\ProductController
echo $route->method; // detail

Language — Bảng Đa Ngôn Ngữ

Thuộc tínhGiá trị
Filecms/src/Models/Language.php
NamespaceSkillDo\Cms\Models\Language
Bảng DB{prefix}language
Primary Keylanguage_id
Alias ngắnSkillDo\Model\Language (không phải \Language)

Mô tả: Model nội bộ của hệ thống, lưu trữ bản dịch của các đối tượng (Post, Page, Product...). Được quản lý tự động bởi Trait ModelLanguagethông thường không cần thao tác trực tiếp.


ElementBuilderSection — Section Element Builder

Thuộc tínhGiá trị
Filecms/src/Models/ElementBuilderSection.php
NamespaceSkillDo\Cms\Models\ElementBuilderSection
Bảng DB{prefix}element_builder_sections

Mô tả: Model nội bộ lưu trữ các section được tạo bởi Element Builder (Page Builder của CMS).


ElementBuilderBlock — Block Dùng Lại

Thuộc tínhGiá trị
Filecms/src/Models/ElementBuilderBlock.php
NamespaceSkillDo\Cms\Models\ElementBuilderBlock
Bảng DB{prefix}element_builder_blocks

Mô tả: Model nội bộ lưu các block được lưu lại để tái sử dụng nhiều nơi trong Page Builder.


ElementBuilderDraft — Bản Nháp

Thuộc tínhGiá trị
Filecms/src/Models/ElementBuilderDraft.php
NamespaceSkillDo\Cms\Models\ElementBuilderDraft
Bảng DB{prefix}element_builder_draft

Mô tả: Model nội bộ lưu bản nháp đang chỉnh sửa trong Page Builder (chưa xuất bản).


ElementBuilderHistories — Lịch Sử Chỉnh Sửa

Thuộc tínhGiá trị
Filecms/src/Models/ElementBuilderHistories.php
NamespaceSkillDo\Cms\Models\ElementBuilderHistories
Bảng DB{prefix}element_builder_histories

Mô tả: Model nội bộ lưu lịch sử phiên bản của từng section (giới hạn 20 phiên bản/section).

Chi tiết kiến trúc Page Builder: xem Builder Architecture.


2. Framework (API) Models

Các Model này được dùng bởi hệ thống REST API của Framework. Chúng hỗ trợ xác thực bằng JWT/OAuth Access Token và API Key.

AccessToken — JWT Access Token

Thuộc tínhGiá trị
Fileframework/src/Api/Models/AccessToken.php
NamespaceSkillDo\Api\Models\AccessToken
Bảng DB{prefix}oauth_access_tokens
Primary Keyid (UUID - char(36))
TraitsHasUuids

Mô tả: Lưu trữ JWT Access Token đã cấp cho người dùng. Hỗ trợ revoke (thu hồi) và có thời gian hết hạn.


RefreshToken — JWT Refresh Token

Thuộc tínhGiá trị
Fileframework/src/Api/Models/RefreshToken.php
NamespaceSkillDo\Api\Models\RefreshToken
Bảng DB{prefix}oauth_refresh_tokens
Primary Keyid (UUID - char(36))

Mô tả: Lưu trữ Refresh Token dùng để làm mới Access Token khi hết hạn.


ApiKey — API Key

Thuộc tínhGiá trị
Fileframework/src/Api/Models/ApiKey.php
NamespaceSkillDo\Api\Models\ApiKey
Bảng DB{prefix}api_keys

Mô tả: Lưu trữ API Key của người dùng/ứng dụng. Hỗ trợ các trạng thái active, revoked, expired.


3. Tóm Tắt Nhanh

ModelAliasBảngTraits chính
PostSkillDo\Model\PostpostSoftDeletes, ModelRoute, ModelLanguage
PostCategorySkillDo\Model\PostCategorycategoriesModelRoute, ModelLanguage
PageSkillDo\Model\PagepageSoftDeletes, ModelRoute, ModelLanguage
UserSkillDo\Model\UserusersSoftDeletes
TagSkillDo\Model\TagtagsModelLanguage
GallerySkillDo\Model\Gallery, \Gallerygroup
GalleryItemSkillDo\Model\GalleryItem, \GalleryItemgalleries
ThemeMenuSkillDo\Model\ThemeMenugroup
ThemeMenuItemSkillDo\Model\ThemeMenuItemmenu
WidgetSkillDo\Model\Widgetwidget
RouterSkillDo\Model\Routerroutes
LanguageSkillDo\Model\Languagelanguage
ElementBuilderSectionelement_builder_sections
ElementBuilderBlockelement_builder_blocks
ElementBuilderDraftelement_builder_draft
ElementBuilderHistorieselement_builder_histories
AccessTokenoauth_access_tokensHasUuids
RefreshTokenoauth_refresh_tokensHasUuids
ApiKeyapi_keys

Cảnh báo về alias gốc: chỉ \Gallery\GalleryItem là alias gốc trỏ vào Model. \Language\ThemeMenu là alias gốc của class hỗ trợ (SkillDo\Cms\Support\Language, SkillDo\Cms\Menu\ThemeMenu), không phải Model cùng tên. Các Model khác không có alias gốc — dùng SkillDo\Model\* hoặc SkillDo\Cms\Models\*.