انتقل إلى المحتوى الرئيسي

المقدمة

حدد حقولًا مخصصة لمحتواك دون الحاجة إلى تعديل الكود.

🎯 ماذا يفعل هذا الموديل؟

يتيح لك موديل AttributesSets استخدام حقول مخصصة لمحتواك (المنتجات، الصفحات، النماذج، إلخ) دون الحاجة إلى ترميزها في تطبيقك.

فكر في الأمر كمنشئ نماذج لبياناتك - أنت تحدد الحقول التي تحتاجها، وOneEntry يتولى الباقي.

📖 شرح بسيط

تخيل أنك تبني متجرًا عبر الإنترنت. كل منتج يحتاج إلى:

  • اسم (نص).
  • سعر (رقم).
  • صورة (صورة).
  • وصف (نص طويل).
  • فئة (قائمة منسدلة).

بدلاً من ترميز هذه الحقول في تطبيقك، تستخدم Attributes لتحديدها في لوحة إدارة OneEntry. ثم يمكنك:

  • إضافة حقول جديدة في أي وقت (دون تغييرات في الكود!).
  • إعادة استخدام الحقول عبر أنواع محتوى مختلفة.
  • تغيير أنواع الحقول دون إعادة نشر.
  • إدارة هيكل المحتوى بالكامل في مكان واحد.

مثال من العالم الحقيقي:

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!

✨ المفاهيم الأساسية

ما هو السمة؟

السمة هي حقل واحد يخزن البيانات.

أمثلة:

  • اسم المنتج (سلسلة نصية).
  • سعر المنتج (عدد عشري).
  • صورة المنتج (صورة).
  • تاريخ النشر (تاريخ).

ما هو مجموعة السمات؟

مجموعة السمات هي مجموعة من السمات التي تحدد هيكلًا.

مثال: مجموعة سمات المنتج

- name (string)
- price (float)
- description (text)
- images (group of images)
- category (list)
- inStock (integer)

لماذا تستخدم مجموعات السمات؟

❌ بدون سمات✅ مع سمات
حقول مشفرةحقول ديناميكية
تغييرات في الكودتعديل في لوحة الإدارة
إعادة نشر مطلوبةتحديثات مباشرة
هيكل صارمهيكل مرن
كود مكررمجموعات قابلة لإعادة الاستخدام

📋 ما تحتاج إلى معرفته

ثلاثة مصطلحات مهمة

المصطلحما هومثال
المؤشرمعرف فريد للكود"product_name"
النوعنوع البيانات المخزنة"string"، "integer"، "image"
القيمةقيمة السمة"اسم المنتج"

مهم حول المؤشرات:

  • يجب أن تكون فريدة
  • لا يُسمح بالمسافات (استخدم _ بدلاً من ذلك)
  • لا يمكن أن تبدأ برقم
  • استخدم الحروف الصغيرة للاتساق

أمثلة:

  • ✅ جيد: product_name، price_usd، main_image
  • ❌ سيء: product name، 2nd_price، Product Name

📚 أنواع البيانات المتاحة

يمكن أن تخزن السمات أنواعًا مختلفة من البيانات. اختر النوع المناسب لكل حقل.

جدول مرجعي سريع

النوعالأفضل من أجلهمثال للاستخدام
stringنص قصيراسم المنتج، البريد الإلكتروني
textنص طويل منسقمنشور مدونة، وصف
textWithHeaderنص مع عنوانأقسام المقالات
integerأعداد صحيحةالكمية، العمر
realأعداد عشرية عالية الدقةبيانات علمية
floatأعداد عشريةالسعر، التقييم
dateفقط التاريختاريخ الميلاد، الموعد النهائي
dateTimeالتاريخ + الوقتبدء الحدث، نشر في
timeفقط الوقتساعات العمل
fileأي ملفPDF، مستند
imageصورة واحدةصورة شخصية، شعار
groupOfImagesصور متعددةمعرض الصور
radioButtonاختيار واحدالحجم (S/M/L)
listاختيار من القائمة المنسدلةالدولة، الفئة
entityرابط لمحتوى آخرالمنتجات ذات الصلة
timeIntervalنطاق تاريخفترة الترويج
jsonبيانات مهيكلة مخصصةاستجابة API

🔍 أوصاف مفصلة لأنواع البيانات

أنواع النصوص

متى تستخدم ماذا:

  • string - سطر واحد، أقل من 255 حرفًا (اسم، بريد إلكتروني، عنوان)
  • text - عدة فقرات، يدعم التنسيق (مقالات، أوصاف)
  • textWithHeader - نص يحتاج إلى عنوان (أقسام المدونة، الأسئلة الشائعة)

أنواع الأرقام

متى تستخدم ماذا:

  • integer - لا حاجة للأعداد العشرية (العمر، الكمية، المشاهدات)
  • float - أعداد عشرية قياسية (السعر 19.99 دولار، التقييم 4.5)
  • real - دقة إضافية مطلوبة (حسابات علمية)

أنواع التاريخ/الوقت

متى تستخدم ماذا:

  • date - فقط اليوم (عيد الميلاد، الموعد النهائي)
  • time - فقط الساعة (ساعات العمل، وقت الموعد)
  • dateTime - كلاهما مطلوب (بدء الحدث، نشر المقال)
  • timeInterval - الفترة بين التواريخ (مدة البيع، تواريخ الإجازة)

أنواع الملفات والصور

متى تستخدم ماذا:

  • file - أي مستند (PDF، DOC، ZIP)
  • image - صورة واحدة (صورة المنتج، صورة شخصية)
  • groupOfImages - صور متعددة (معرض، صور المنتجات)

أنواع الاختيار

متى تستخدم ماذا:

  • radioButton - اختر خيارًا واحدًا فقط (نعم/لا، الحجم S/M/L)
  • list - قائمة منسدلة مع خيارات (الدولة، الفئة، الحالة)

الأنواع المتقدمة

  • entity - رابط لصفحات/منتجات أخرى (عناصر ذات صلة، فئات)
  • json - تخزين هياكل بيانات معقدة (استجابات API، إعدادات)

📖 أمثلة على أنواع البيانات

فيما يلي أمثلة تقنية على هيكل كل نوع بيانات.

💡 البيانات المعادة في مجموعة السمات لا تشمل القيم الفعلية للسمات، حيث تحتوي هذه القيم على كيانات محددة مثل الصفحات، المنتجات، إلخ. الاستثناء الوحيد هو نوع السمة timeInterval. يمكن أن تحتوي هذه السمة على قيم من خلال تحديد المربع المقابل في لوحة الإدارة

انقر لرؤية جميع أمثلة أنواع البيانات

مرجع أنواع البيانات

يمكن أن تكون أنواع البيانات من الأنواع التالية:

  • String: نص بسيط، على سبيل المثال، "مرحبًا، العالم!".

مثال:

{
"type": "string",
"value": {},
"marker": "string",
"position": 1,
"listTitles": [],
"validators": {
"requiredValidator": {
"strict": true
}
},
"localizeInfos": {
"title": "String"
},
"additionalFields": [
{
"type": "integer",
"value": "10",
"marker": "Extra"
}
]
}

  • Text: نص أطول، غالبًا ما يكون منسقًا، على سبيل المثال، مقال أو رسالة.

مثال:

{
"type": "text",
"value": {},
"marker": "text",
"position": 2,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Text"
},
"additionalFields": []
}

  • Text with Header: نص مع عنوان يمكن استخدامه للدلالة على موضوع أو فئة.

مثال:

{
"type": "textWithHeader",
"value": {},
"marker": "text_with_header",
"position": 3,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Text With Header"
},
"additionalFields": []
}

  • Integer: عدد صحيح، على سبيل المثال، 5، 100، -2.

مثال:

{
"type": "integer",
"value": {},
"marker": "integer",
"position": 4,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Integer"
},
"additionalFields": []
}

  • Real: نفس الشيء مثل Float، ولكن بدقة أعلى.

مثال:

{
"type": "real",
"value": {},
"marker": "real_number",
"position": 5,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Real Number"
},
"additionalFields": []
}

  • Float: نوع بيانات للأعداد العشرية التي يمكن أن تحتوي على جزء عشري، على سبيل المثال، 3.14، 1.5، -0.25.

مثال:

{
"type": "float",
"value": {},
"marker": "float",
"position": 6,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Float"
},
"additionalFields": []
}

  • Date and Time: مزيج من التاريخ والوقت، على سبيل المثال، 2023-10-27 10:00:00.

مثال:

{
"type": "dateTime",
"value": {},
"marker": "date_time",
"position": 7,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "DateTime"
},
"additionalFields": []
}

  • Date: تاريخ، على سبيل المثال، 2023-10-27.

مثال:

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

  • Time: وقت، على سبيل المثال، 10:00:00.

مثال:

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

  • File: أي ملف على جهاز الكمبيوتر الخاص بك، على سبيل المثال، مستند، صورة، موسيقى.

مثال:

{
"type": "file",
"value": {},
"marker": "file",
"position": 10,
"listTitles": [],
"validators": {
"checkingFilesValidator": {
"maxUnits": "kb",
"maxValue": "2000",
"minUnits": "kb",
"minValue": 0,
"extensions": []
}
},
"localizeInfos": {
"title": "File"
},
"additionalFields": []
}

  • Image: صورة، على سبيل المثال، صورة فوتوغرافية، رسم.

مثال:

{
"type": "image",
"value": {},
"marker": "image",
"position": 11,
"listTitles": [],
"validators": {
"sizeInPixelsValidator": {
"maxX": "500",
"maxY": "500"
}
},
"localizeInfos": {
"title": "Image"
},
"additionalFields": []
}

  • Group of Images: مجموعة من الصور، على سبيل المثال، ألبوم صور.

مثال:

{
"type": "groupOfImages",
"value": {},
"marker": "image_group",
"position": 12,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Image Group"
},
"additionalFields": []
}

  • Radio Button: زر اختيار يمكن اختيار خيار واحد فقط منه.

مثال:

{
"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: قائمة من العناصر، على سبيل المثال، قائمة تسوق.

مثال:

{
"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: كيان يمثل كائنًا.

مثال:

{
"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: تقويم مرن مع واجهة مستخدم سهلة لإدارة بيانات الفترات الزمنية.

مثال:

{
"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: بعض البيانات بتنسيق JSON.

مثال:

{
"type": "json",
"value": {},
"marker": "json",
"position": 17,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Json"
},
"additionalFields": []
}

ستتوافق واجهة ملء المحتوى مع نوع البيانات المحدد لكل حقل سمة.


💡 ملاحظات مهمة

المدققون

يمكنك إضافة مدققين للسمات لضمان جودة البيانات:

  • الحقول المطلوبة.
  • الحد الأدنى/الحد الأقصى للطول للنص.
  • حدود حجم الملف للتحميلات.
  • أبعاد البكسل للصور.
  • نطاقات التاريخ.
انقر لرؤية أمثلة المدققين
  • requiredValidator: يتطلب إدخال قيمة.

مثال:

{
"type": "string",
"value": {},
"marker": "string",
"position": 1,
"listTitles": [],
"validators": {
"requiredValidator": {
"strict": true
}
},
"localizeInfos": {
"title": "Currency"
},
"additionalFields": [
{
"type": "integer",
"value": "10",
"marker": "extra"
}
]
}

  • defaultValueValidator:

مثال:

{
"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"
}
]
}

تعلم المزيد: راجع قسم المدققين للحصول على تكوين مفصل.

مجموعات السمات المشتركة

⚠️ مهم: إذا تم استخدام مجموعة سمات من قبل كيانات متعددة، كن حذرًا عند إجراء تغييرات:

إضافة سمة:

  • سيتم إضافتها إلى جميع الكيانات التي تستخدم المجموعة.
  • يبقى المحتوى الحالي دون تغيير.
  • سيكون الحقل الجديد فارغًا للعناصر الموجودة.

إزالة سمة:

  • سيتم إزالتها من جميع الكيانات التي تستخدم المجموعة.
  • سيتم حذف القيم الحالية بشكل دائم.

مثال:

"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! ⚠️

📊 جدول مرجعي سريع - الطرق الشائعة

الطريقةماذا تفعل
getAttributes()الحصول على جميع كائنات مجموعات السمات.
getAttributesByMarker()الحصول على جميع السمات حسب المؤشر مع البيانات من مجموعة السمات.
getAttributeSetByMarker()الحصول على كائن واحد من مجموعة السمات حسب المؤشر.
getSingleAttributeByMarkerSet()الحصول على سمة واحدة مع البيانات من مجموعة السمات.

❓ الأسئلة الشائعة (FAQ)

ما الفرق بين string و text؟

  • string - نص قصير، سطر واحد (حد أقصى ~255 حرفًا). استخدمه للأسماء، العناوين، البريد الإلكتروني.
  • text - نص طويل، عدة فقرات، يدعم التنسيق وHTML. استخدمه للأوصاف، المقالات.

متى يجب أن أستخدم integer مقابل float؟

  • integer - أعداد صحيحة فقط: 1، 2، 100، -5. استخدمه للكمية، العد، الأعمار.
  • float - أعداد عشرية: 19.99، 4.5، -0.25. استخدمه للأسعار، التقييمات، القياسات.
  • real - مثل float ولكن بدقة أعلى. استخدمه للحسابات العلمية.

أفضل ممارسة: خطط لأنواع السمات الخاصة بك قبل إضافة المحتوى.


ماذا يحدث إذا قمت بحذف سمة؟

  • لا يمكنك حذف سمة إذا كانت مستخدمة في مجموعة سمات.

هل يمكنني إعادة استخدام نفس السمة في مجموعات سمات مختلفة؟

لا، كل سمة تنتمي إلى مجموعة سمات واحدة. لكن يمكنك:

  • إنشاء سمات مشابهة مع مؤشرات مختلفة
  • إعادة استخدام مجموعات السمات بالكامل عبر كيانات متعددة

ما هو "المؤشر" ولماذا هو مهم؟

المؤشر هو المعرف الفني الذي تستخدمه في الكود:

// 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

قواعد المؤشرات:

  • يجب أن تكون فريدة
  • لا مسافات (استخدم _)
  • لا يمكن أن تبدأ بأرقام
  • استخدم الحروف الصغيرة
  • اختر أسماء وصفية

كيف أعرف أي نوع يجب أن أستخدمه لبياناتي؟

اسأل نفسك:

  1. هل هو نص؟

    • قصير (< 255 حرفًا)؟ → string
    • طويل مع تنسيق؟ → text
    • يحتاج إلى عنوان؟ → textWithHeader
  2. هل هو رقم؟

    • لا أعداد عشرية؟ → integer
    • يحتوي على أعداد عشرية؟ → float
    • دقة علمية؟ → real
  3. هل هو اختيار؟

    • اختر خيارًا واحدًا؟ → radioButton
    • قائمة منسدلة؟ → list
  4. هل هو ملف؟

    • صورة؟ → image أو groupOfImages
    • مستند؟ → file
  5. هل هو تاريخ؟

    • فقط تاريخ؟ → date
    • تاريخ + وقت؟ → dateTime
    • فترة زمنية؟ → timeInterval

هل يمكنني الحصول على سمات متداخلة (سمات داخل سمات)؟

نعم، يمكنك استخدام حقول إضافية


كيف أضيف قواعد التحقق؟

في لوحة إدارة OneEntry:

  1. انتقل إلى مجموعة السمات الخاصة بك
  2. انقر على سمة
  3. أضف المدققين (مطلوب، الحد الأدنى/الحد الأقصى، regex، إلخ.)
  4. احفظ التغييرات

تعلم المزيد: راجع قسم المدققين للحصول على تكوين مفصل.


🎓 أفضل الممارسات

  • استخدم مؤشرات وصفية (product_price وليس pp)
  • خطط لأنواع السمات قبل إضافة المحتوى
  • أعد استخدام مجموعات السمات عند الإمكان
  • أضف مدققين لضمان جودة البيانات
  • وثق ما هو الغرض من كل سمة

مزيد من المعلومات حول واجهة مستخدم الموديل https://doc.oneentry.cloud/docs/attributes/introduction

تعريف موديل AttributesSets


const { AttributesSets } = defineOneEntry(
"your-project-url", {
"token": "your-app-token"
}
);


🔗 الوثائق ذات الصلة