Aller au contenu principal

Introduction

Définissez des champs personnalisés pour votre contenu sans toucher au code.

🎯 Que fait ce module ?

Le module AttributesSets vous permet d'utiliser des champs personnalisés pour votre contenu (produits, pages, formulaires, etc.) sans les coder en dur dans votre application.

Considérez-le comme un constructeur de formulaires pour vos données - vous définissez les champs dont vous avez besoin, et OneEntry s'occupe du reste.

📖 Explication Simple

Imaginez que vous construisez une boutique en ligne. Chaque produit a besoin de :

  • Nom (texte).
  • Prix (nombre).
  • Image (photo).
  • Description (texte long).
  • Catégorie (liste déroulante).

Au lieu de coder ces champs en dur dans votre application, vous utilisez Attributes pour les définir dans le panneau d'administration de OneEntry. Ensuite, vous pouvez :

  • Ajouter de nouveaux champs à tout moment (sans changements de code !).
  • Réutiliser des champs à travers différents types de contenu.
  • Changer les types de champs sans redéploiement.
  • Gérer toute la structure de contenu en un seul endroit.

Exemple concret :

Sans Attributes (codé en dur) :
- Code : const product = { name, price, image, description }
- Pour ajouter le champ "couleur" → Changer le code, redéployer, attendre.

Avec Attributes (dynamique) :
- Panneau d'administration : Ajouter l'attribut "couleur".
- Le code inclut automatiquement le nouveau champ.
- Pas de déploiement nécessaire !

✨ Concepts Clés

Qu'est-ce qu'un Attribut ?

Un attribut est un champ unique qui stocke des données.

Exemples :

  • Nom du produit (chaîne).
  • Prix du produit (flottant).
  • Image du produit (image).
  • Date de publication (date).

Qu'est-ce qu'un Ensemble d'Attributs ?

Un ensemble d'attributs est une collection d'attributs qui définissent une structure.

Exemple : Ensemble d'Attributs de Produit

- nom (chaîne)
- prix (flottant)
- description (texte)
- images (groupe d'images)
- catégorie (liste)
- enStock (entier)

Pourquoi Utiliser des Ensembles d'Attributs ?

❌ Sans Attributes✅ Avec Attributes
Champs codés en durChamps dynamiques
Changements de code nécessairesÉditez dans le panneau d'administration
Redéploiement requisMises à jour en direct
Structure rigideStructure flexible
Code dupliquéEnsembles réutilisables

📋 Ce Que Vous Devez Savoir

Trois Termes Importants

TermeCe Que C'estExemple
MarkerIdentifiant de code unique"product_name"
TypeQuel type de données il stocke"string", "integer", "image"
ValueValeur de l'attribut"Nom du Produit"

Important concernant les Markers :

  • Doit être unique
  • Pas d'espaces autorisés (utilisez _ à la place)
  • Ne peut pas commencer par un chiffre
  • Utilisez des minuscules pour la cohérence

Exemples :

  • ✅ Bon : product_name, price_usd, main_image
  • ❌ Mauvais : product name, 2nd_price, Product Name

Réutilisabilité

Les ensembles d'attributs peuvent être réutilisés à travers différentes entités :

Ensemble d'Attributs "Infos de Base" :
- titre (chaîne)
- description (texte)
- date_de_publication (date)

Utilisé par :
- Articles de blog
- Articles d'actualité
- Pages de produits
- Annonces d'événements

Pourquoi cela compte : Changez une fois, mises à jour partout !


📚 Types de Données Disponibles

Les attributs peuvent stocker différents types de données. Choisissez le bon type pour chaque champ.

Tableau de Référence Rapide

TypeMeilleur PourUtilisation Exemple
stringTexte courtNom du produit, email
textTexte long formatéArticle de blog, description
textWithHeaderTexte avec titreSections d'articles
integerNombres entiersQuantité, âge
realDécimales de haute précisionDonnées scientifiques
floatNombres décimauxPrix, évaluation
dateJuste la dateDate de naissance, date limite
dateTimeDate + heureDébut d'événement, publié à
timeJuste l'heureHeures d'ouverture
fileTout fichierPDF, document
imageImage uniqueAvatar, logo
groupOfImagesImages multiplesGalerie photo
radioButtonChoix uniqueTaille (S/M/L)
listSélection déroulantePays, catégorie
entityLien vers d'autres contenusProduits associés
timeIntervalPlage de datesPériode de promotion
jsonDonnées structurées personnaliséesRéponse API

🔍 Descriptions Détaillées des Types de Données

Types de Texte

Quand utiliser quoi :

  • string - Ligne unique, moins de 255 caractères (nom, email, titre)
  • text - Plusieurs paragraphes, supporte le formatage (articles, descriptions)
  • textWithHeader - Texte nécessitant un titre (sections de blog, FAQ)

Types de Nombres

Quand utiliser quoi :

  • integer - Pas de décimales nécessaires (âge, quantité, vues)
  • float - Décimales standard (prix 19,99 $, évaluation 4,5)
  • real - Précision supplémentaire nécessaire (calculs scientifiques)

Types de Date/Heure

Quand utiliser quoi :

  • date - Juste le jour (anniversaire, date limite)
  • time - Juste l'heure (heures d'affaires, heure de rendez-vous)
  • dateTime - Les deux nécessaires (début d'événement, article publié)
  • timeInterval - Période entre les dates (durée de vente, dates de vacances)

Types de Fichiers & Images

Quand utiliser quoi :

  • file - Tout document (PDF, DOC, ZIP)
  • image - Une image (photo de produit, avatar)
  • groupOfImages - Plusieurs images (galerie, images de produit)

Types de Sélection

Quand utiliser quoi :

  • radioButton - Choisissez seulement UNE option (Oui/Non, Taille S/M/L)
  • list - Menu déroulant avec options (Pays, Catégorie, Statut)

Types Avancés

  • entity - Lien vers d'autres pages/produits (Articles Associés, Catégories)
  • json - Stocker des structures de données complexes (réponses API, paramètres)

📖 Exemples de Types de Données

Voici des exemples techniques de la structure de chaque type de données.

Cliquez pour voir tous les exemples de types de données

Référence des Types de Données

Les types de données peuvent être des types suivants :

  • String : Texte simple, par exemple, "Bonjour, le monde !".

Exemple :

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

  • Text : Texte plus long, souvent formaté, par exemple, un article ou une lettre.

Exemple :

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

  • Text with Header : Texte avec un en-tête qui peut être utilisé pour désigner un sujet ou une catégorie.

Exemple :

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

  • Integer : Un entier, par exemple, 5, 100, -2.

Exemple :

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

  • Real : Identique à Float, mais avec une précision plus élevée.

Exemple :

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

  • Float : Un type de données pour les nombres à virgule flottante qui peuvent avoir une partie décimale, par exemple, 3,14, 1,5, -0,25.

Exemple :

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

  • Date and Time : Une combinaison de date et d'heure, par exemple, 2023-10-27 10:00:00.

Exemple :

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

  • Date : Une date, par exemple, 2023-10-27.

Exemple :

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

  • Time : Une heure, par exemple, 10:00:00.

Exemple :

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

  • File : Tout fichier sur votre ordinateur, par exemple, un document, une image, de la musique.

Exemple :

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

  • Image : Une image, par exemple, une photographie, un dessin.

Exemple :

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

  • Group of Images : Une collection d'images, par exemple, un album photo.

Exemple :

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

  • Radio Button : Un bouton de sélection à partir duquel une seule option peut être choisie.

Exemple :

{
"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 : Une liste d'éléments, par exemple, une liste de courses.

Exemple :

{
"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": "Valeur Supplémentaire"
},
"position": 3
}
],
"validators": {},
"localizeInfos": {
"title": "List"
},
"additionalFields": []
}

  • Entity : Une entité représentant un objet.

Exemple :

{
"type": "entity",
"value": {},
"marker": "entity",
"position": 15,
"listTitles": [
{
"title": "Produits",
"value": {
"id": 1,
"depth": 0,
"parentId": null,
"position": 1,
"selected": true
}
},
{
"title": "Page Normale",
"value": {
"id": 4,
"depth": 0,
"parentId": null,
"position": 2,
"selected": true
}
},
{
"title": "Erreur",
"value": {
"id": 2,
"depth": 0,
"parentId": null,
"position": 3,
"selected": true
}
}
],
"validators": {},
"localizeInfos": {
"title": "Entity"
},
"additionalFields": [
{
"type": "string",
"value": "Champ de Test",
"marker": "test_field"
}
]
}

  • Time interval : Un calendrier flexible avec une interface conviviale pour gérer les données d'intervalle de temps.

Exemple :

{
"time_interval": {
"id": 4,
"type": "timeInterval",
"value": [
// Tableau de groupes de valeurs, chacun lié à un intervalle spécifique (via intervalId). Ce tableau est formé lorsque la réception des valeurs est activée dans le CMS
{
// Enregistrements de temps spécifiques applicables aux dates spécifiées
"values": [
{
// Identifiant unique de l'enregistrement
"id": "1dc1787d-acc3-4315-a45d-52166c72e577",
// Plage de dates (inclusive) à laquelle cet enregistrement s'applique
"dates": ["2025-11-27T00:00:00.000Z", "2025-11-27T00:00:00.000Z"],
// Tableau de créneaux horaires au format [[début, fin], ...]
"times": [
[
// Début du créneau horaire (heures et minutes)
{
"hours": 19,
"minutes": 18
},
// Fin du créneau horaire
{
"hours": 21,
"minutes": 19
}
]
],
// Réservé (non utilisé dans l'implémentation actuelle)
"intervals": [],
// Exceptions — segments de temps exclus du calendrier à la date spécifiée
"exceptions": [
{
// Date d'exception
"date": "2025-12-17T17:00:00.000Z",
// Tableau de segments de temps exclus
"externalTimes": [
["2025-12-17T17:25:00.000Z", "2025-12-17T17:27:00.000Z"]
]
}
],
// Référence à l'intervalle du tableau `intervals`
"intervalId": "0da61a19-49cb-40b1-88e6-1fa3c93a1fa6",
// Indicateur de récurrence hebdomadaire (le jour correspondant de la semaine)
"inEveryWeek": true
},
{
"id": "cfa187d3-0284-4e0d-8206-7b353cf47110",
"dates": ["2025-12-18T00:00:00.000Z", "2025-12-18T00:00:00.000Z"],
// Tableau de créneaux horaires au format [[début, fin], ...]
"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"],
// Pas de créneaux horaires
"times": [],
// Règles dynamiques pour l'expansion du calendrier
"external": [
{
// Date de base pour calculer l'événement récurrent
"date": "2026-01-15T00:00:00.000Z",
// L'événement se répète chaque mois ce jour-là
"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",
// Indicateur de récurrence hebdomadaire
"inEveryWeek": true,
// Indicateur de récurrence mensuelle
"inEveryMonth": true,
// Indicateur de récurrence annuelle
"inEveryYears": true
}
],
// Référence à l'intervalle du tableau `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": [
// Tableau de modèles d'intervalle de temps
{
// Identifiant unique du modèle d'intervalle
"id": "0da61a19-49cb-40b1-88e6-1fa3c93a1fa6",
"range": [
// Plage principale d'applicabilité de l'intervalle
"2025-11-26T17:00:00.000Z",
"2025-11-26T17:00:00.000Z"
],
// Exceptions au niveau de l'intervalle entier
"external": [
{
"date": "2025-12-17T17:00:00.000Z",
"externalTimes": [
["2025-12-17T17:25:00.000Z", "2025-12-17T17:27:00.000Z"]
]
}
],
// Créneaux horaires internes (périodes de travail/actives)
"intervals": [
{
"id": "01fea594-9933-47ac-af0a-ec0e0884f618",
// Fin du créneau horaire
"end": {
"hours": 21,
"minutes": 19
},
// Début du créneau horaire
"start": {
"hours": 19,
"minutes": 18
},
// Durée du bloc répétitif (en minutes) ; null — pas de périodicité
"period": null
},
{
"id": "22ba24af-1fae-4422-8c92-0635b684a306",
"end": {
"hours": 0,
"minutes": 29
},
"start": {
"hours": 0,
"minutes": 25
},
// Périodicité : les créneaux horaires se répètent avec un pas de 2 minutes
"period": 2,
// Exception à l'intérieur du créneau périodique
"external": {
// Indicateur d'affichage de l'exception dans l'interface
"show": false,
// Durée du fragment exclu (en 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"],
// Pas d'exceptions
"external": [],
// Pas de créneaux horaires internes
"intervals": [],
"inEveryWeek": true,
"inEveryMonth": true,
"inEveryYears": true
}
],
// Indicateur de visibilité de l'attribut dans l'interface
"isVisible": true,
"identifier": "time_interval",
"localizeInfos": {
"en_US": {
"title": "Time interval"
}
},
"receiveValues": true
}
}

  • JSON : Certaines données au format JSON.

Exemple :

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

L'interface de remplissage de contenu correspondra au type de données sélectionné pour chaque champ d'attribut.


💡 Notes Importantes

Validateurs

Vous pouvez ajouter des validateurs pour les attributs afin d'assurer la qualité des données :

  • Champs requis.
  • Longueur min/max pour le texte.
  • Limites de taille de fichier pour les téléchargements.
  • Dimensions en pixels pour les images.
  • Plages de dates.

En savoir plus : Consultez la section "Validateurs" pour une configuration détaillée.

Ensembles d'Attributs Partagés

⚠️ Important : Si un ensemble d'attributs est utilisé par plusieurs entités, soyez prudent lors des modifications :

Suppression d'un attribut :

  • Le supprime partout où l'ensemble est utilisé.
  • Supprime tout le contenu dans ce champ.
  • Ne peut pas être annulé !

Ajout d'un attribut :

  • Ajouté partout où l'ensemble est utilisé.
  • Contenu existant inchangé.
  • Le nouveau champ sera vide pour les éléments existants.

Exemple :

"Infos Produit" utilisé par :
- Produits Physiques.
- Produits Numériques.
- Services.

Supprimer l'attribut "poids" → Supprimé de TOUS les trois ! ⚠️

📊 Tableau de Référence Rapide - Méthodes Courantes

MéthodeCe Qu'elle FaitQuand l'utiliser
getAttributes()Récupérer tous les objets d'ensembles d'attributs.
getAttributesByMarker()Récupérer tous les attributs par marker avec des données de l'ensemble d'attributs.
getAttributeSetByMarker()Récupérer un seul objet d'ensemble d'attributs par marker.
getSingleAttributeByMarkerSet()Récupérer un attribut avec des données de l'ensemble d'attributs.

❓ Questions Fréquemment Posées (FAQ)

Quelle est la différence entre string et text ?

  • string - Texte court, ligne unique (max ~255 caractères). Utilisez pour les noms, titres, emails.
  • text - Texte long, plusieurs paragraphes, supporte le formatage et HTML. Utilisez pour les descriptions, articles.

Quand devrais-je utiliser integer vs float ?

  • integer - Nombres entiers uniquement : 1, 2, 100, -5. Utilisez pour les quantités, comptes, âges.
  • float - Nombres décimaux : 19.99, 4.5, -0.25. Utilisez pour les prix, évaluations, mesures.
  • real - Comme float mais avec une précision plus élevée. Utilisez pour les calculs scientifiques.

Meilleure pratique : Planifiez vos types d'attributs avant d'ajouter du contenu.


Que se passe-t-il si je supprime un attribut ?

  • Vous ne pouvez pas supprimer un attribut s'il est utilisé dans un ensemble d'attributs.

Puis-je réutiliser le même attribut dans différents ensembles d'attributs ?

Non, chaque attribut appartient à un seul ensemble d'attributs. Mais vous pouvez :

  • Créer des attributs similaires avec des markers différents
  • Réutiliser des ensembles d'attributs entiers à travers plusieurs entités

Qu'est-ce que le "marker" et pourquoi est-il important ?

Le marker est l'identifiant technique que vous utilisez dans le code :

// Dans votre code :
product.attributeValues.product_name // ← "product_name" est le marker

// VS le nom (affiché dans l'administration) :
"Nom du Produit" // ← Cela est juste pour les humains

Règles pour les markers :

  • Doit être unique
  • Pas d'espaces (utilisez _)
  • Ne peut pas commencer par des chiffres
  • Utilisez des minuscules
  • Choisissez des noms descriptifs

Comment savoir quel type utiliser pour mes données ?

Demandez-vous :

  1. Est-ce du texte ?

    • Court (< 255 caractères) ? → string
    • Long avec formatage ? → text
    • Nécessite un titre ? → textWithHeader
  2. Est-ce un nombre ?

    • Pas de décimales ? → integer
    • A des décimales ? → float
    • Précision scientifique ? → real
  3. Est-ce un choix ?

    • Choisissez une option ? → radioButton
    • Menu déroulant ? → list
  4. Est-ce un fichier ?

    • Image ? → image ou groupOfImages
    • Document ? → file
  5. Est-ce une date ?

    • Juste la date ? → date
    • Date + heure ? → dateTime
    • Période de temps ? → timeInterval

Puis-je avoir des attributs imbriqués (attributs à l'intérieur d'attributs) ?

Pas directement, mais vous pouvez utiliser :

  • Type entity pour lier à d'autres contenus
  • Type json pour stocker des données structurées
  • Plusieurs ensembles d'attributs pour organiser des champs liés

Comment ajouter des règles de validation ?

Dans le panneau d'administration de OneEntry :

  1. Allez à votre ensemble d'attributs
  2. Cliquez sur un attribut
  3. Ajoutez des validateurs (requis, min/max, regex, etc.)
  4. Enregistrez les modifications

Validateurs courants :

  • Champ requis
  • Longueur min/max
  • Format d'email
  • Format d'URL
  • Limites de taille de fichier
  • Dimensions d'image

🎓 Meilleures Pratiques

  • Utilisez des markers descriptifs (product_price pas pp)
  • Planifiez les types d'attributs avant d'ajouter du contenu
  • Réutilisez les ensembles d'attributs lorsque cela est possible
  • Ajoutez des validateurs pour garantir la qualité des données
  • Documentez l'utilisation de chaque attribut

Plus d'informations sur l'interface utilisateur du module https://doc.oneentry.cloud/docs/attributes/introduction

Définition du module AttributesSets


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


🔗 Documentation Connexe

  • Module Produits - Utilise des ensembles d'attributs pour les données produit
  • Module Pages - Utilise des ensembles d'attributs pour le contenu des pages
  • Module Blocs - Utilise des ensembles d'attributs pour des blocs réutilisables
  • Module Formulaires - Créez des formulaires avec des champs personnalisés