Nhảy đến nội dung

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ứngTrường động
Cần thay đổi mãChỉnh sửa trong bảng điều khiển
Cần triển khai lạiCập nhật trực tiếp
Cấu trúc cứngCấu trúc linh hoạt
Mã trùng lặpTậ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ĩaVí dụ
MarkerMã định danh duy nhất"product_name"
TypeLoại dữ liệu mà nó lưu trữ"string", "integer", "image"
ValueGiá 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ạiTốt nhất choVí dụ sử dụng
stringVăn bản ngắnTên sản phẩm, email
textVăn bản dài có định dạngBài viết, mô tả
textWithHeaderVăn bản có tiêu đềCác phần của bài viết
integerSố nguyênSố lượng, tuổi
realSố thập phân chính xác caoDữ liệu khoa học
floatSố thập phânGiá, đánh giá
dateChỉ ngàyNgày sinh, hạn chót
dateTimeNgày + giờThời gian sự kiện, ngày xuất bản
timeChỉ giờGiờ mở cửa
fileBất kỳ tệp nàoPDF, tài liệu
imageHình ảnh đơn lẻẢnh đại diện, logo
groupOfImagesNhiều hình ảnhThư viện ảnh
radioButtonLựa chọn đơnKích thước (S/M/L)
listLựa chọn thả xuốngQuốc gia, danh mục
entityLiên kết đến nội dung khácSản phẩm liên quan
timeIntervalKhoảng thời gianThời gian khuyến mãi
jsonDữ liệu có cấu trúc tùy chỉnhPhả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ứcChứ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:

  1. 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
  2. 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
  3. 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
  4. Nó có phải là một tệp không?

    • Hình ảnh? → image hoặc groupOfImages
    • Tài liệu? → file
  5. 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

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:

  1. Đi đến tập hợp thuộc tính của bạn
  2. Nhấp vào một thuộc tính
  3. Thêm các bộ xác thực (bắt buộc, min/max, regex, v.v.)
  4. 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_price không phải pp)
  • 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