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 những 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 những 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 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ý toàn bộ cấu trúc nội dung ở một nơi.

Ví dụ thực tế:

Không có Attributes (mã hóa cứng):
- Mã: const product = { name: 'Tên sản phẩm', price: 150, image: '', description: '' }
- Để thêm trường "màu sắc" → Thay đổi mã, triển khai lại, chờ đợi.

Với Attributes (động):
- Mã: const { name, price, image, description } = product
- Bảng điều khiển quản trị: Thêm thuộc tính "màu sắc".
- Mã tự động bao gồm trường mới.
- Mã: const { name, price, image, description, color } = product
- Không cần triển khai lại!

✨ Khái niệm chính

Thuộc tính là gì?

Một thuộc tính 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).

Bộ thuộc tính là gì?

Một bộ thuộc tính là một tập hợp các thuộc tính định nghĩa một cấu trúc.

Ví dụ: Bộ thuộc tính sản phẩm

- name (chuỗi)
- price (số thực)
- description (văn bản)
- images (nhóm hình ảnh)
- category (danh sách)
- inStock (số nguyên)

Tại sao nên sử dụng bộ thuộc tính?

❌ 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ặpBộ 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"

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

Các thuộc tính 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Ả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 của 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 & 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 - 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)

📖 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 từng loại dữ liệu.

💡Dữ liệu trả về trong bộ thuộc tính không bao gồm giá trị thuộc tính thực tế, vì những 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. Loại thuộc tính này có thể có giá trị bằng cách kiểm tra ô tương ứng trong bảng điều khiển quản trị

Nhấp để xem tất cả cá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ập phân 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 thời gian, 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 vẽ.

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 bộ sưu tập 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": "Giá trị bổ sung"
},
"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": "Sản phẩm",
"value": {
"id": 1,
"depth": 0,
"parentId": null,
"position": 1,
"selected": true
}
},
{
"title": "Trang bình thường",
"value": {
"id": 4,
"depth": 0,
"parentId": null,
"position": 2,
"selected": true
}
},
{
"title": "Lỗi",
"value": {
"id": 2,
"depth": 0,
"parentId": null,
"position": 3,
"selected": true
}
}
],
"validators": {},
"localizeInfos": {
"title": "Entity"
},
"additionalFields": [
{
"type": "string",
"value": "Trường thử nghiệm",
"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": [
// Mảng các nhóm giá trị, mỗi nhóm liên kết với một khoảng thời gian cụ thể (thông qua intervalId). Mảng này được hình thành khi Nhận giá trị được bật trong CMS
{
// Các bản ghi thời gian cụ thể áp dụng cho các ngày đã chỉ định
"values": [
{
// Mã định danh bản ghi duy nhất
"id": "1dc1787d-acc3-4315-a45d-52166c72e577",
// Khoảng thời gian (bao gồm) mà bản ghi này áp dụng
"dates": ["2025-11-27T00:00:00.000Z", "2025-11-27T00:00:00.000Z"],
// Mảng các khoảng thời gian theo định dạng [[bắt đầu, kết thúc], ...]
"times": [
[
// Bắt đầu của khoảng thời gian (giờ và phút)
{
"hours": 19,
"minutes": 18
},
// Kết thúc của khoảng thời gian
{
"hours": 21,
"minutes": 19
}
]
],
// Được dự trữ (không được sử dụng trong triển khai hiện tại)
"intervals": [],
// Các ngoại lệ — các đoạn thời gian bị loại trừ khỏi lịch vào ngày đã chỉ định
"exceptions": [
{
// Ngày ngoại lệ
"date": "2025-12-17T17:00:00.000Z",
// Mảng các đoạn thời gian bị loại trừ
"externalTimes": [
["2025-12-17T17:25:00.000Z", "2025-12-17T17:27:00.000Z"]
]
}
],
// Tham chiếu đến khoảng thời gian từ mảng `intervals`
"intervalId": "0da61a19-49cb-40b1-88e6-1fa3c93a1fa6",
// Cờ cho sự lặp lại hàng tuần (vào ngày tương ứng trong tuần)
"inEveryWeek": true
},
{
"id": "cfa187d3-0284-4e0d-8206-7b353cf47110",
"dates": ["2025-12-18T00:00:00.000Z", "2025-12-18T00:00:00.000Z"],
// Mảng các khoảng thời gian theo định dạng [[bắt đầu, kết thúc], ...]
"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"],
// Không có khoảng thời gian
"times": [],
// Quy tắc động cho việc mở rộng lịch
"external": [
{
// Ngày cơ sở để tính toán sự kiện lặp lại
"date": "2026-01-15T00:00:00.000Z",
// Sự kiện lặp lại mỗi tháng vào ngày này
"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",
// Cờ cho sự lặp lại hàng tuần
"inEveryWeek": true,
// Cờ cho sự lặp lại hàng tháng
"inEveryMonth": true,
// Cờ cho sự lặp lại hàng năm
"inEveryYears": true
}
],
// Tham chiếu đến khoảng thời gian từ mảng `intervals`
"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": [
// Mảng các mẫu khoảng thời gian
{
// Mã định danh duy nhất của mẫu khoảng thời gian
"id": "0da61a19-49cb-40b1-88e6-1fa3c93a1fa6",
"range": [
// Khoảng thời gian chính của tính khả dụng
"2025-11-26T17:00:00.000Z",
"2025-11-26T17:00:00.000Z"
],
// Các ngoại lệ ở cấp độ toàn bộ khoảng thời gian
"external": [
{
"date": "2025-12-17T17:00:00.000Z",
"externalTimes": [
["2025-12-17T17:25:00.000Z", "2025-12-17T17:27:00.000Z"]
]
}
],
// Các khoảng thời gian nội bộ (thời gian làm việc/hoạt động)
"intervals": [
{
"id": "01fea594-9933-47ac-af0a-ec0e0884f618",
// Kết thúc của khoảng thời gian
"end": {
"hours": 21,
"minutes": 19
},
// Bắt đầu của khoảng thời gian
"start": {
"hours": 19,
"minutes": 18
},
// Thời gian của khối lặp lại (tính bằng phút); null — không có chu kỳ
"period": null
},
{
"id": "22ba24af-1fae-4422-8c92-0635b684a306",
"end": {
"hours": 0,
"minutes": 29
},
"start": {
"hours": 0,
"minutes": 25
},
// Chu kỳ: các khoảng thời gian lặp lại với bước 2 phút
"period": 2,
// Ngoại lệ bên trong khoảng thời gian định kỳ
"external": {
// Cờ để hiển thị ngoại lệ trong giao diện
"show": false,
// Thời gian của đoạn bị loại trừ (tính bằng phút)
"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"],
// Không có ngoại lệ
"external": [],
// Không có khoảng thời gian nội bộ
"intervals": [],
"inEveryWeek": true,
"inEveryMonth": true,
"inEveryYears": true
}
],
// Cờ cho tính khả dụng của thuộc tính trong giao diện
"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:

  • Các 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 ngày.
Nhấp để xem ví dụ về các bộ xác thực
  • 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": "Tiền tệ"
},
"additionalFields": [
{
"type": "integer",
"value": "10",
"marker": "extra"
}
]
}

  • defaultValueValidator:

Ví dụ:

{
"type": "string",
"value": {},
"marker": "string",
"position": 1,
"listTitles": [],
"validators": {
"defaultValueValidator": {
"customErrorText": "Lỗi tùy chỉnh",
"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.

Bộ thuộc tính chia sẻ

⚠️ Quan trọng: Nếu một bộ 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 bộ.
  • Nội dung hiện có sẽ 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 bộ.
  • Các giá trị hiện có sẽ bị xóa vĩnh viễn.

Ví dụ:

Bộ thuộc tính "Thông tin sản phẩm" được sử dụng bởi:
- Sản phẩm vật lý
- Sản phẩm kỹ thuật số
- Dịch vụ

Thêm thuộc tính "trọng lượng" → Được thêm vào TẤT CẢ ba!
Xóa thuộc tính "trọng lượng" → Bị xóa khỏi TẤT CẢ ba! ⚠️

📊 Bảng tham khảo nhanh - Các phương pháp phổ biến

Phương phápChức năng
getAttributes()Lấy tất cả các đối tượng bộ thuộc tính.
getAttributesByMarker()Lấy tất cả các thuộc tính theo marker với dữ liệu từ bộ thuộc tính.
getAttributeSetByMarker()Lấy một đối tượng duy nhất của bộ thuộc tính theo marker.
getSingleAttributeByMarkerSet()Lấy một thuộc tính với dữ liệu từ bộ 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á, đánh giá, đo lường.
  • real - Giống như 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 bộ thuộc tính.

Tôi có thể tái sử dụng cùng một thuộc tính trong các bộ thuộc tính khác nhau không?

Không, mỗi thuộc tính thuộc về một bộ 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ộ bộ thuộc tính trên nhiều thực thể

"Marker" là gì và tại sao nó quan trọng?

Marker là mã định danh kỹ thuật mà bạn sử dụng trong mã:

// Trong mã của bạn:
product.attributeValues.product_name // ← "product_name" là marker

// So với tên (hiển thị trong quản trị):
"Tên sản phẩm" // ← Đây chỉ dành cho con người

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à một 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 bộ 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 bộ 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 mỗi thuộc tính là gì

Thêm thông tin 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