Giới thiệu
Định nghĩa các trường tùy chỉnh cho nội dung của bạn mà không cần chạm vào mã.
🎯 Mô-đun này làm gì?
Mô-đun AttributesSets cho phép bạn sử dụng các trường tùy chỉnh cho nội dung của bạn (sản phẩm, trang, biểu mẫu, v.v.) mà không cần mã hóa chúng trong ứng dụng của bạn.
Hãy nghĩ về nó như một trình tạo biểu mẫu cho dữ liệu của bạn - bạn định nghĩa các trường bạn cần, và OneEntry sẽ xử lý phần còn lại.
📖 Giải thích đơn giản
Hãy tưởng tượng bạn đang xây dựng một cửa hàng trực tuyến. Mỗi sản phẩm cần:
- Tên (văn bản).
- Giá (số).
- Hình ảnh (hình ảnh).
- Mô tả (văn bản dài).
- Danh mục (thả xuống).
Thay vì mã hóa cứng các trường này trong ứng dụng của bạn, bạn sử dụng Attributes để định nghĩa chúng trong bảng điều khiển quản trị OneEntry. Sau đó, bạn có thể:
- Thêm các trường mới bất cứ lúc nào (không cần thay đổi mã!).
- Tái sử dụng các trường trên các loại nội dung khác nhau.
- Thay đổi loại trường mà không cần triển khai lại.
- Quản lý tất cả cấu trúc nội dung ở một nơi.
Ví dụ thực tế:
Without Attributes (hardcoded):
- Code: const product = { name: 'Product name', price: 150, image: '', description: '' }
- To add "color" field → Change code, redeploy, wait.
With Attributes (dynamic):
- Code: const { name, price, image, description } = product
- Admin panel: Add "color" attribute.
- Code automatically includes new field.
- Code: const { name, price, image, description, color } = product
- No deployment needed!
✨ Khái niệm chính
Attribute là gì?
Một attribute là một trường đơn lẻ lưu trữ dữ liệu.
Ví dụ:
- Tên sản phẩm (chuỗi).
- Giá sản phẩm (số thực).
- Hình ảnh sản phẩm (hình ảnh).
- Ngày xuất bản (ngày).
Attribute Set là gì?
Một attribute set là một tập hợp các attributes định nghĩa một cấu trúc.
Ví dụ: Tập hợp thuộc tính sản phẩm
- name (string)
- price (float)
- description (text)
- images (group of images)
- category (list)
- inStock (integer)
Tại sao nên sử dụng Attribute Sets?
| ❌ Không có Attributes | ✅ Có Attributes |
|---|---|
| Trường mã hóa cứng | Trường động |
| Cần thay đổi mã | Chỉnh sửa trong bảng điều khiển |
| Cần triển khai lại | Cập nhật trực tiếp |
| Cấu trúc cứng | Cấu trúc linh hoạt |
| Mã trùng lặp | Tập hợp có thể tái sử dụng |
📋 Những điều bạn cần biết
Ba thuật ngữ quan trọng
| Thuật ngữ | Định nghĩa | Ví dụ |
|---|---|---|
| Marker | Mã định danh duy nhất | "product_name" |
| Type | Loại dữ liệu mà nó lưu trữ | "string", "integer", "image" |
| Value | Giá trị thuộc tính | "Tên sản phẩm" |
Điều quan trọng về Markers:
- Phải duy nhất
- Không cho phép khoảng trắng (sử dụng
_thay thế) - Không thể bắt đầu bằng số
- Sử dụng chữ thường để nhất quán
Ví dụ:
- ✅ Tốt:
product_name,price_usd,main_image - ❌ Xấu:
product name,2nd_price,Product Name
📚 Các loại dữ liệu có sẵn
Attributes có thể lưu trữ các loại dữ liệu khác nhau. Chọn loại phù hợp cho mỗi trường.
Bảng tham khảo nhanh
| Loại | Tốt nhất cho | Ví dụ sử dụng |
|---|---|---|
| string | Văn bản ngắn | Tên sản phẩm, email |
| text | Văn bản dài có định dạng | Bài viết, mô tả |
| textWithHeader | Văn bản có tiêu đề | Các phần của bài viết |
| integer | Số nguyên | Số lượng, tuổi |
| real | Số thập phân chính xác cao | Dữ liệu khoa học |
| float | Số thập phân | Giá, đánh giá |
| date | Chỉ ngày | Ngày sinh, hạn chót |
| dateTime | Ngày + giờ | Thời gian sự kiện, ngày xuất bản |
| time | Chỉ giờ | Giờ mở cửa |
| file | Bất kỳ tệp nào | PDF, tài liệu |
| image | Hình ảnh đơn lẻ | Ảnh đại diện, logo |
| groupOfImages | Nhiều hình ảnh | Thư viện ảnh |
| radioButton | Lựa chọn đơn | Kích thước (S/M/L) |
| list | Lựa chọn thả xuống | Quốc gia, danh mục |
| entity | Liên kết đến nội dung khác | Sản phẩm liên quan |
| timeInterval | Khoảng thời gian | Thời gian khuyến mãi |
| json | Dữ liệu có cấu trúc tùy chỉnh | Phản hồi API |
🔍 Mô tả chi tiết về các loại dữ liệu
Các loại văn bản
Khi nào sử dụng loại nào:
- string - Dòng đơn, dưới 255 ký tự (tên, email, tiêu đề)
- text - Nhiều đoạn văn, hỗ trợ định dạng (bài viết, mô tả)
- textWithHeader - Văn bản cần tiêu đề (các phần blog, Câu hỏi thường gặp)
Các loại số
Khi nào sử dụng loại nào:
- integer - Không cần số thập phân (tuổi, số lượng, lượt xem)
- float - Số thập phân tiêu chuẩn (giá $19.99, đánh giá 4.5)
- real - Cần độ chính xác cao hơn (tính toán khoa học)
Các loại ngày/giờ
Khi nào sử dụng loại nào:
- date - Chỉ ngày (sinh nhật, hạn chót)
- time - Chỉ giờ (giờ làm việc, thời gian hẹn)
- dateTime - Cả hai đều cần (thời gian sự kiện, bài viết đã xuất bản)
- timeInterval - Khoảng thời gian giữa các ngày (thời gian khuyến mãi, ngày nghỉ)
Các loại tệp và hình ảnh
Khi nào sử dụng loại nào:
- file - Bất kỳ tài liệu nào (PDF, DOC, ZIP)
- image - Một hình ảnh (ảnh sản phẩm, ảnh đại diện)
- groupOfImages - Nhiều hình ảnh (thư viện, hình ảnh sản phẩm)
Các loại lựa chọn
Khi nào sử dụng loại nào:
- radioButton - Chọn chỉ MỘT tùy chọn (Có/Không, Kích thước S/M/L)
- list - Menu thả xuống với các tùy chọn (Quốc gia, Danh mục, Trạng thái)
Các loại nâng cao
- entity - Liên kết đến các trang/sản phẩm khác (Mặt hàng liên quan, Danh mục)
- json - Lưu trữ cấu trúc dữ liệu phức tạp (phản hồi API, cài đặt)
📖 Ví dụ về các loại dữ liệu
Dưới đây là các ví dụ kỹ thuật về cấu trúc của mỗi loại dữ liệu.
💡Dữ liệu trả về trong tập hợp thuộc tính không bao gồm các giá trị thuộc tính thực tế, vì các giá trị này nằm trong các thực thể cụ thể như trang, sản phẩm, v.v. Ngoại lệ duy nhất là loại thuộc tính timeInterval. Thuộc tính này có thể có giá trị bằng cách đánh dấu ô tương ứng trong bảng điều khiển quản trị
Nhấp để xem tất cả ví dụ về loại dữ liệu
Tham khảo các loại dữ liệu
Các loại dữ liệu có thể là các loại sau:
- String: Văn bản đơn giản, ví dụ, "Xin chào, thế giới!".
Ví dụ:
{
"type": "string",
"value": {},
"marker": "string",
"position": 1,
"listTitles": [],
"validators": {
"requiredValidator": {
"strict": true
}
},
"localizeInfos": {
"title": "String"
},
"additionalFields": [
{
"type": "integer",
"value": "10",
"marker": "Extra"
}
]
}
- Text: Văn bản dài hơn, thường được định dạng, ví dụ, một bài viết hoặc một bức thư.
Ví dụ:
{
"type": "text",
"value": {},
"marker": "text",
"position": 2,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Text"
},
"additionalFields": []
}
- Text with Header: Văn bản có tiêu đề có thể được sử dụng để chỉ định một chủ đề hoặc danh mục.
Ví dụ:
{
"type": "textWithHeader",
"value": {},
"marker": "text_with_header",
"position": 3,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Text With Header"
},
"additionalFields": []
}
- Integer: Một số nguyên, ví dụ, 5, 100, -2.
Ví dụ:
{
"type": "integer",
"value": {},
"marker": "integer",
"position": 4,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Integer"
},
"additionalFields": []
}
- Real: Giống như Float, nhưng với độ chính xác cao hơn.
Ví dụ:
{
"type": "real",
"value": {},
"marker": "real_number",
"position": 5,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Real Number"
},
"additionalFields": []
}
- Float: Một loại dữ liệu cho các số thực có thể có phần thập phân, ví dụ, 3.14, 1.5, -0.25.
Ví dụ:
{
"type": "float",
"value": {},
"marker": "float",
"position": 6,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Float"
},
"additionalFields": []
}
- Date and Time: Một sự kết hợp của ngày và giờ, ví dụ, 2023-10-27 10:00:00.
Ví dụ:
{
"type": "dateTime",
"value": {},
"marker": "date_time",
"position": 7,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "DateTime"
},
"additionalFields": []
}
- Date: Một ngày, ví dụ, 2023-10-27.
Ví dụ:
{
"type": "date",
"value": {},
"marker": "date",
"position": 8,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Date"
},
"additionalFields": []
}
- Time: Một giờ, ví dụ, 10:00:00.
Ví dụ:
{
"type": "date",
"value": {},
"marker": "date",
"position": 8,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Date"
},
"additionalFields": []
}
- File: Bất kỳ tệp nào trên máy tính của bạn, ví dụ, một tài liệu, hình ảnh, nhạc.
Ví dụ:
{
"type": "file",
"value": {},
"marker": "file",
"position": 10,
"listTitles": [],
"validators": {
"checkingFilesValidator": {
"maxUnits": "kb",
"maxValue": "2000",
"minUnits": "kb",
"minValue": 0,
"extensions": []
}
},
"localizeInfos": {
"title": "File"
},
"additionalFields": []
}
- Image: Một hình ảnh, ví dụ, một bức ảnh, một bức tranh.
Ví dụ:
{
"type": "image",
"value": {},
"marker": "image",
"position": 11,
"listTitles": [],
"validators": {
"sizeInPixelsValidator": {
"maxX": "500",
"maxY": "500"
}
},
"localizeInfos": {
"title": "Image"
},
"additionalFields": []
}
- Group of Images: Một tập hợp các hình ảnh, ví dụ, một album ảnh.
Ví dụ:
{
"type": "groupOfImages",
"value": {},
"marker": "image_group",
"position": 12,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Image Group"
},
"additionalFields": []
}
- Radio Button: Một nút lựa chọn mà chỉ có thể chọn một tùy chọn.
Ví dụ:
{
"type": "radioButton",
"value": {},
"marker": "radio",
"position": 13,
"listTitles": [
{
"title": "A",
"value": "a",
"extended": {
"type": null,
"value": null
},
"position": 1
},
{
"title": "B",
"value": "b",
"extended": {
"type": null,
"value": null
},
"position": 2
}
],
"validators": {},
"localizeInfos": {
"title": "Radio"
},
"additionalFields": []
}
- List: Một danh sách các mục, ví dụ, một danh sách mua sắm.
Ví dụ:
{
"type": "list",
"value": {},
"marker": "list",
"position": 14,
"listTitles": [
{
"title": "A",
"value": "a",
"extended": {
"type": null,
"value": null
},
"position": 1
},
{
"title": "B",
"value": "b",
"extended": {
"type": null,
"value": null
},
"position": 2
},
{
"title": "C",
"value": "c",
"extended": {
"type": "string",
"value": "Additional Value"
},
"position": 3
}
],
"validators": {},
"localizeInfos": {
"title": "List"
},
"additionalFields": []
}
- Entity: Một thực thể đại diện cho một đối tượng.
Ví dụ:
{
"type": "entity",
"value": {},
"marker": "entity",
"position": 15,
"listTitles": [
{
"title": "Products",
"value": {
"id": 1,
"depth": 0,
"parentId": null,
"position": 1,
"selected": true
}
},
{
"title": "Normal Page",
"value": {
"id": 4,
"depth": 0,
"parentId": null,
"position": 2,
"selected": true
}
},
{
"title": "Error",
"value": {
"id": 2,
"depth": 0,
"parentId": null,
"position": 3,
"selected": true
}
}
],
"validators": {},
"localizeInfos": {
"title": "Entity"
},
"additionalFields": [
{
"type": "string",
"value": "Test Field",
"marker": "test_field"
}
]
}
- Time interval: Một lịch linh hoạt với giao diện thân thiện cho việc quản lý dữ liệu khoảng thời gian.
Ví dụ:
{
"time_interval": {
"id": 4,
"type": "timeInterval",
"value": [
// Array of value groups, each linked to a specific interval (via intervalId). This array is formed when Receive values is enabled in CMS
{
// Specific time records applicable to the specified dates
"values": [
{
// Unique record identifier
"id": "1dc1787d-acc3-4315-a45d-52166c72e577",
// Date range (inclusive) to which this record applies
"dates": ["2025-11-27T00:00:00.000Z", "2025-11-27T00:00:00.000Z"],
// Array of time slots in format [[start, end], ...]
"times": [
[
// Start of time slot (hours and minutes)
{
"hours": 19,
"minutes": 18
},
// End of time slot
{
"hours": 21,
"minutes": 19
}
]
],
// Reserved (not used in current implementation)
"intervals": [],
// Exceptions — time segments excluded from the schedule on the specified date
"exceptions": [
{
// Exception date
"date": "2025-12-17T17:00:00.000Z",
// Array of excluded time segments
"externalTimes": [
["2025-12-17T17:25:00.000Z", "2025-12-17T17:27:00.000Z"]
]
}
],
// Reference to interval from the `intervals` array
"intervalId": "0da61a19-49cb-40b1-88e6-1fa3c93a1fa6",
// Flag for weekly recurrence (on the corresponding day of the week)
"inEveryWeek": true
},
{
"id": "cfa187d3-0284-4e0d-8206-7b353cf47110",
"dates": ["2025-12-18T00:00:00.000Z", "2025-12-18T00:00:00.000Z"],
// Array of time slots in format [[start, end], ...]
"times": [
[
{
"hours": 0,
"minutes": 25
},
{
"hours": 0,
"minutes": 27
}
],
[
{
"hours": 19,
"minutes": 18
},
{
"hours": 21,
"minutes": 19
}
]
],
"intervals": [],
"exceptions": [
{
"date": "2025-12-17T17:00:00.000Z",
"externalTimes": [
["2025-12-17T17:25:00.000Z", "2025-12-17T17:27:00.000Z"]
]
}
],
"intervalId": "0da61a19-49cb-40b1-88e6-1fa3c93a1fa6"
},
{
"id": "474de0f7-595f-49a5-aaa7-65617203ae69",
"dates": ["2025-12-25T00:00:00.000Z", "2025-12-25T00:00:00.000Z"],
// No time slots
"times": [],
// Dynamic rules for schedule expansion
"external": [
{
// Base date for calculating recurring event
"date": "2026-01-15T00:00:00.000Z",
// Event repeats every month on this day
"inEveryMonth": true
}
],
"intervals": [],
"exceptions": [
{
"date": "2025-12-17T17:00:00.000Z",
"externalTimes": [
["2025-12-17T17:25:00.000Z", "2025-12-17T17:27:00.000Z"]
]
}
],
"intervalId": "0da61a19-49cb-40b1-88e6-1fa3c93a1fa6",
// Flag for weekly recurrence
"inEveryWeek": true,
// Flag for monthly recurrence
"inEveryMonth": true,
// Flag for yearly recurrence
"inEveryYears": true
}
],
// Reference to interval from the `intervals` array
"intervalId": "0da61a19-49cb-40b1-88e6-1fa3c93a1fa6"
},
{
"values": [
{
"id": "2f80dc18-16da-45cb-82c6-e41e1f6ee084",
"dates": ["2025-12-22T00:00:00.000Z", "2025-12-23T00:00:00.000Z"],
"times": [],
"intervals": [],
"exceptions": [],
"intervalId": "918175fd-cc18-4ca5-9bee-c78c61c9415a",
"inEveryWeek": true,
"inEveryMonth": true
}
],
"intervalId": "918175fd-cc18-4ca5-9bee-c78c61c9415a"
}
],
"isPrice": false,
"original": true,
"intervals": [
// Array of time interval templates
{
// Unique identifier of interval template
"id": "0da61a19-49cb-40b1-88e6-1fa3c93a1fa6",
"range": [
// Main range of interval applicability
"2025-11-26T17:00:00.000Z",
"2025-11-26T17:00:00.000Z"
],
// Exceptions at the entire interval level
"external": [
{
"date": "2025-12-17T17:00:00.000Z",
"externalTimes": [
["2025-12-17T17:25:00.000Z", "2025-12-17T17:27:00.000Z"]
]
}
],
// Internal time slots (working/active periods)
"intervals": [
{
"id": "01fea594-9933-47ac-af0a-ec0e0884f618",
// End of time slot
"end": {
"hours": 21,
"minutes": 19
},
// Start of time slot
"start": {
"hours": 19,
"minutes": 18
},
// Duration of repeating block (in minutes); null — no periodicity
"period": null
},
{
"id": "22ba24af-1fae-4422-8c92-0635b684a306",
"end": {
"hours": 0,
"minutes": 29
},
"start": {
"hours": 0,
"minutes": 25
},
// Periodicity: time slots repeat with 2-minute step
"period": 2,
// Exception inside periodic slot
"external": {
// Flag for displaying exception in the interface
"show": false,
// Duration of excluded fragment (in minutes)
"value": 2
}
}
],
"inEveryWeek": true,
"inEveryMonth": true,
"inEveryYears": true
},
{
"id": "918175fd-cc18-4ca5-9bee-c78c61c9415a",
"range": ["2026-01-18T17:00:00.000Z", "2026-01-20T17:00:00.000Z"],
// No exceptions
"external": [],
// No internal time slots
"intervals": [],
"inEveryWeek": true,
"inEveryMonth": true,
"inEveryYears": true
}
],
// Flag for attribute visibility in the interface
"isVisible": true,
"identifier": "time_interval",
"localizeInfos": {
"en_US": {
"title": "Time interval"
}
},
"receiveValues": true
}
}
- JSON: Một số dữ liệu ở định dạng JSON.
Ví dụ:
{
"type": "json",
"value": {},
"marker": "json",
"position": 17,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Json"
},
"additionalFields": []
}
Giao diện điền nội dung sẽ tương ứng với loại dữ liệu đã chọn cho mỗi trường thuộc tính.
💡 Lưu ý quan trọng
Validators
Bạn có thể thêm các bộ xác thực cho các thuộc tính để đảm bảo chất lượng dữ liệu:
- Trường bắt buộc.
- Độ dài tối thiểu/tối đa cho văn bản.
- Giới hạn kích thước tệp cho các tệp tải lên.
- Kích thước pixel cho hình ảnh.
- Khoảng thời gian cho ngày.
Nhấp để xem ví dụ về validators
- requiredValidator: Yêu cầu phải nhập một giá trị.
Ví dụ:
{
"type": "string",
"value": {},
"marker": "string",
"position": 1,
"listTitles": [],
"validators": {
"requiredValidator": {
"strict": true
}
},
"localizeInfos": {
"title": "Currency"
},
"additionalFields": [
{
"type": "integer",
"value": "10",
"marker": "extra"
}
]
}
- defaultValueValidator:
Ví dụ:
{
"type": "string",
"value": {},
"marker": "string",
"position": 1,
"listTitles": [],
"validators": {
"defaultValueValidator": {
"customErrorText": "Custom error",
"fieldDefaultValue": "usd",
"fieldDefaultValue2": "",
},
},
"localizeInfos": {
"title": "String"
},
"additionalFields": [
{
"type": "integer",
"value": "10",
"marker": "extra"
}
]
}
Tìm hiểu thêm: Xem phần Validators để biết cấu hình chi tiết.
Tập hợp thuộc tính chia sẻ
⚠️ Quan trọng: Nếu một tập hợp thuộc tính được sử dụng bởi nhiều thực thể, hãy cẩn thận khi thực hiện thay đổi:
Thêm một thuộc tính:
- Nó sẽ được thêm vào tất cả các thực thể sử dụng tập hợp.
- Nội dung hiện có không thay đổi.
- Trường mới sẽ trống cho các mục hiện có.
Xóa một thuộc tính:
- Nó sẽ bị xóa khỏi tất cả các thực thể sử dụng tập hợp.
- Các giá trị hiện có sẽ bị xóa vĩnh viễn.
Ví dụ:
"Product Info" attribute set used by:
- Physical Products
- Digital Products
- Services
Adding "weight" attribute → Added to ALL three!
Removing "weight" attribute → Removed from ALL three! ⚠️
📊 Bảng tham khảo nhanh - Các phương thức phổ biến
| Phương thức | Chức năng |
|---|---|
| getAttributes() | Lấy tất cả các đối tượng tập hợp thuộc tính. |
| getAttributesByMarker() | Lấy tất cả các thuộc tính theo marker với dữ liệu từ tập hợp thuộc tính. |
| getAttributeSetByMarker() | Lấy một đối tượng duy nhất của tập hợp thuộc tính theo marker. |
| getSingleAttributeByMarkerSet() | Lấy một thuộc tính với dữ liệu từ tập hợp thuộc tính. |
❓ Câu hỏi thường gặp (FAQ)
Sự khác biệt giữa string và text là gì?
- string - Văn bản ngắn, một dòng (tối đa ~255 ký tự). Sử dụng cho tên, tiêu đề, email.
- text - Văn bản dài, nhiều đoạn văn, hỗ trợ định dạng và HTML. Sử dụng cho mô tả, bài viết.
Khi nào tôi nên sử dụng integer so với float?
- integer - Chỉ số nguyên:
1, 2, 100, -5. Sử dụng cho số lượng, đếm, tuổi. - float - Số thập phân:
19.99, 4.5, -0.25. Sử dụng cho giá cả, đánh giá, đo lường. - real - Giống float nhưng có độ chính xác cao hơn. Sử dụng cho các tính toán khoa học.
Thực hành tốt nhất: Lập kế hoạch cho các loại thuộc tính của bạn trước khi thêm nội dung.
Điều gì xảy ra nếu tôi xóa một thuộc tính?
- Bạn không thể xóa một thuộc tính nếu nó đang được sử dụng trong một tập hợp thuộc tính.
Tôi có thể tái sử dụng cùng một thuộc tính trong các tập hợp thuộc tính khác nhau không?
Không, mỗi thuộc tính thuộc về một tập hợp thuộc tính. Nhưng bạn có thể:
- Tạo các thuộc tính tương tự với các markers khác nhau
- Tái sử dụng toàn bộ tập hợp thuộc tính trên nhiều thực thể
"Marker" là gì và tại sao nó quan trọng?
Marker là định danh kỹ thuật mà bạn sử dụng trong mã:
// In your code:
product.attributeValues.product_name // ← "product_name" is the marker
// VS the name (shown in admin):
"Product Name" // ← This is just for humans
Quy tắc cho markers:
- Phải duy nhất
- Không có khoảng trắng (sử dụng
_) - Không thể bắt đầu bằng số
- Sử dụng chữ thường
- Chọn tên mô tả
Làm thế nào tôi biết loại nào để sử dụng cho dữ liệu của mình?
Hãy tự hỏi:
-
Nó có phải là văn bản không?
- Ngắn (< 255 ký tự)? →
string - Dài với định dạng? →
text - Cần tiêu đề? →
textWithHeader
- Ngắn (< 255 ký tự)? →
-
Nó có phải là số không?
- Không có số thập phân? →
integer - Có số thập phân? →
float - Độ chính xác khoa học? →
real
- Không có số thập phân? →
-
Nó có phải là một lựa chọn không?
- Chọn một tùy chọn? →
radioButton - Menu thả xuống? →
list
- Chọn một tùy chọn? →
-
Nó có phải là một tệp không?
- Hình ảnh? →
imagehoặcgroupOfImages - Tài liệu? →
file
- Hình ảnh? →
-
Nó có phải là một ngày không?
- Chỉ ngày? →
date - Ngày + giờ? →
dateTime - Khoảng thời gian? →
timeInterval
- Chỉ ngày? →
Tôi có thể có các thuộc tính lồng nhau (thuộc tính bên trong thuộc tính) không?
Có, bạn có thể sử dụng Các trường bổ sung
Làm thế nào tôi thêm quy tắc xác thực?
Trong bảng điều khiển quản trị OneEntry:
- Đi đến tập hợp thuộc tính của bạn
- Nhấp vào một thuộc tính
- Thêm các bộ xác thực (bắt buộc, min/max, regex, v.v.)
- Lưu thay đổi
Tìm hiểu thêm: Xem phần Validators để biết cấu hình chi tiết.
🎓 Thực hành tốt nhất
- Sử dụng các markers mô tả (
product_pricekhông phảipp) - Lập kế hoạch cho các loại thuộc tính trước khi thêm nội dung
- Tái sử dụng các tập hợp thuộc tính khi có thể
- Thêm các bộ xác thực để đảm bảo chất lượng dữ liệu
- Tài liệu cho biết mỗi thuộc tính dùng để làm gì
Thông tin thêm về giao diện người dùng của mô-đun https://doc.oneentry.cloud/docs/attributes/introduction
Định nghĩa của mô-đun AttributesSets
const { AttributesSets } = defineOneEntry( "your-project-url", { "token": "your-app-token" });
🔗 Tài liệu liên quan
- Mô-đun Sản phẩm - Sử dụng các tập hợp thuộc tính cho dữ liệu sản phẩm
- Mô-đun Trang - Sử dụng các tập hợp thuộc tính cho nội dung trang
- Mô-đun Khối - Sử dụng các tập hợp thuộc tính cho các khối có thể tái sử dụng
- Mô-đun Biểu mẫu - Tạo biểu mẫu với các trường tùy chỉnh