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 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 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 nhiều 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ế:

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

Với Attributes (động):
- 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.
- Không cần triển khai!

✨ 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ữ"chuỗi", "số nguyên", "hình ảnh"
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

Tính tái sử dụng

Các bộ thuộc tính có thể được tái sử dụng trên nhiều thực thể khác nhau:

Bộ thuộc tính "Thông tin cơ bản":
- title (chuỗi)
- description (văn bản)
- publish_date (ngày)

Được sử dụng bởi:
- Bài viết blog
- Bài báo tin tức
- Trang sản phẩm
- Danh sách sự kiện

Tại sao điều này quan trọng: Thay đổi một lần, cập nhật ở mọi nơi!


📚 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
chuỗiVăn bản ngắnTên sản phẩm, email
văn bảnVăn bản dài có định dạngBài viết blog, mô tả
văn bảnCóTiêuĐềVăn bản có tiêu đềCác phần của bài viết
số nguyênSố nguyênSố lượng, tuổi
số thựcSố thập phân chính xác caoDữ liệu khoa học
số thựcSố thập phânGiá, đánh giá
ngàyChỉ ngàyNgày sinh, hạn chót
ngàyGiờNgày + giờBắt đầu sự kiện, xuất bản lúc
giờChỉ giờGiờ mở cửa
tệpBất kỳ tệp nàoPDF, tài liệu
hình ảnhHình ảnh đơn lẻẢnh đại diện, logo
nhómHìnhẢnhNhiều hình ảnhThư viện ảnh
nútRadioLựa chọn đơnKích thước (S/M/L)
danh sáchLựa chọn thả xuốngQuốc gia, danh mục
thực thểLiên kết đến nội dung khácSản phẩm liên quan
khoảngThờiGianKhoả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 cái gì:

  • chuỗi - Dòng đơn, dưới 255 ký tự (tên, email, tiêu đề)
  • văn bản - Nhiều đoạn, hỗ trợ định dạng (bài viết, mô tả)
  • văn bảnCóTiêuĐề - 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 cái gì:

  • số nguyên - Không cần số thập phân (tuổi, số lượng, lượt xem)
  • số thực - Số thập phân tiêu chuẩn (giá $19.99, đánh giá 4.5)
  • số thực - 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 cái gì:

  • ngày - Chỉ ngày (sinh nhật, hạn chót)
  • giờ - Chỉ giờ (giờ làm việc, thời gian hẹn)
  • ngàyGiờ - Cả hai đều cần (bắt đầu sự kiện, bài viết đã xuất bản)
  • khoảngThờiGian - 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 cái gì:

  • tệp - Bất kỳ tài liệu nào (PDF, DOC, ZIP)
  • hình ảnh - Một bức ảnh (ảnh sản phẩm, đại diện)
  • nhómHìnhẢnh - Nhiều bức ả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 cái gì:

  • nútRadio - Chọn chỉ MỘT tùy chọn (Có/Không, Kích thước S/M/L)
  • danh sách - 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

  • thực thể - 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 từng loại dữ liệu.

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:

  • Chuỗi: 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": "Chuỗi"
},
"additionalFields": [
{
"type": "integer",
"value": "10",
"marker": "Extra"
}
]
}

  • Văn bản: 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": "Văn bản"
},
"additionalFields": []
}

  • Văn bản có tiêu đề: 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": "Văn bản có tiêu đề"
},
"additionalFields": []
}

  • Số nguyên: Một số nguyên, ví dụ, 5, 100, -2.

Ví dụ:

{
"type": "integer",
"value": {},
"marker": "integer",
"position": 4,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Số nguyên"
},
"additionalFields": []
}

  • Số thực: 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": "Số thực"
},
"additionalFields": []
}

  • Số thực: 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": "Số thực"
},
"additionalFields": []
}

  • Ngày và giờ: 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": "Ngày giờ"
},
"additionalFields": []
}

  • Ngày: Một ngày, ví dụ, 2023-10-27.

Ví dụ:

{
"type": "date",
"value": {},
"marker": "date",
"position": 8,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Ngày"
},
"additionalFields": []
}

  • Giờ: Một giờ, ví dụ, 10:00:00.

Ví dụ:

{
"type": "date",
"value": {},
"marker": "date",
"position": 8,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Ngày"
},
"additionalFields": []
}

  • Tệp: 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": "Tệp"
},
"additionalFields": []
}

  • Hình ảnh: 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": "Hình ảnh"
},
"additionalFields": []
}

  • Nhóm hình ảnh: 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": "Nhóm hình ảnh"
},
"additionalFields": []
}

  • Nút radio: 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": "Nút radio"
},
"additionalFields": []
}

  • Danh sách: 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": "chuỗi",
"value": "Giá trị bổ sung"
},
"position": 3
}
],
"validators": {},
"localizeInfos": {
"title": "Danh sách"
},
"additionalFields": []
}

  • Thực thể: 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": "Thực thể"
},
"additionalFields": [
{
"type": "chuỗi",
"value": "Trường thử nghiệm",
"marker": "test_field"
}
]
}

  • Khoảng thời gian: 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 khoảng thời gian (giờ và phút)
{
"hours": 19,
"minutes": 18
},
// Kết thúc khoảng thời gian
{
"hours": 21,
"minutes": 19
}
]
],
// Được dự trữ (không 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 trình 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 trình
"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 hàng 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 khoảng thời gian
"end": {
"hours": 21,
"minutes": 19
},
// Bắt đầu 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": "Khoảng thời gian"
}
},
"receiveValues": true
}
}

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

Các bộ xác thực

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 ngày.

Tìm hiểu thêm: Xem phần "Các bộ xác thực" để biết cấu hình chi tiết.

Các 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:

Xóa một thuộc tính:

  • Xóa nó ở mọi nơi bộ được sử dụng.
  • Xóa tất cả nội dung trong trường đó.
  • Không thể hoàn tác!

Thêm một thuộc tính:

  • Thêm ở mọi nơi bộ được sử dụng.
  • 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ó.

Ví dụ:

"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ụ.

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 thức phổ biến

Phương thứcChức năngKhi nào sử dụ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ác câu hỏi thường gặp (FAQ)

Sự khác biệt giữa chuỗi và văn bản là gì?

  • chuỗi - 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.
  • văn bản - Văn bản dài, nhiều đoạ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 số nguyên so với số thực?

  • số nguyên - Chỉ số nguyên: 1, 2, 100, -5. Sử dụng cho số lượng, đếm, tuổi.
  • số thực - Số thập phân: 19.99, 4.5, -0.25. Sử dụng cho giá cả, đánh giá, đo lường.
  • số thực - Giống như số thực nhưng độ 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 marker 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 các marker:

  • 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ự)? → chuỗi
    • Dài với định dạng? → văn bản
    • Cần tiêu đề không? → văn bảnCóTiêuĐề
  2. Nó có phải là một số không?

    • Không có số thập phân? → số nguyên
    • Có số thập phân? → số thực
    • Độ chính xác khoa học? → số thực
  3. Nó có phải là một lựa chọn không?

    • Chọn một tùy chọn? → nútRadio
    • Menu thả xuống? → danh sách
  4. Nó có phải là một tệp không?

    • Hình ảnh? → hình ảnh hoặc nhómHìnhẢnh
    • Tài liệu? → tệp
  5. Nó có phải là một ngày không?

    • Chỉ ngày? → ngày
    • Ngày + giờ? → ngàyGiờ
    • Khoảng thời gian? → khoảngThờiGian

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?

Không trực tiếp, nhưng bạn có thể sử dụng:

  • Loại thực thể để liên kết đến nội dung khác
  • Loại json để lưu trữ dữ liệu có cấu trúc
  • Nhiều bộ thuộc tính để tổ chức các trường liên quan

Làm thế nào tôi thêm các 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

Các bộ xác thực phổ biến:

  • Trường bắt buộc
  • Độ dài min/max
  • Định dạng email
  • Định dạng URL
  • Giới hạn kích thước tệp
  • Kích thước hình ảnh

🎓 Thực hành tốt nhất

  • Sử dụng các marker 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ô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