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 (pas de modifications de code !)
- ✅ Réutiliser des champs à travers différents types de contenu
- ✅ Changer les types de champs sans redéployer
- ✅ 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 de caractères)
- 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
- name (chaîne de caractères)
- price (flottant)
- description (texte)
- images (groupe d'images)
- category (liste)
- inStock (entier)
Pourquoi Utiliser des Ensembles d'Attributs ?
| Sans Attributes | Avec Attributes |
|---|---|
| ❌ Champs codés en dur | ✅ Champs dynamiques |
| ❌ Modifications de code nécessaires | ✅ Éditez dans le panneau d'administration |
| ❌ Redéploiement requis | ✅ Mises à jour en direct |
| ❌ Structure rigide | ✅ Structure flexible |
| ❌ Code dupliqué | ✅ Ensembles réutilisables |
📋 Ce Que Vous Devez Savoir
Trois Termes Importants
| Terme | Ce Que C'est | Exemple |
|---|---|---|
| Marker | Identifiant de code unique | "product_name" |
| Type | Quel type de données il stocke | "string", "integer", "image" |
| Value | Valeur 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" :
- title (chaîne de caractères)
- description (texte)
- publish_date (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
| Type | Meilleur Pour | Utilisation Exemple |
|---|---|---|
| string | Texte court | Nom du produit, email |
| text | Texte long formaté | Article de blog, description |
| textWithHeader | Texte avec titre | Sections d'articles |
| integer | Nombres entiers | Quantité, âge |
| real | Décimales de haute précision | Données scientifiques |
| float | Nombres décimaux | Prix, évaluation |
| date | Juste la date | Date de naissance, date limite |
| dateTime | Date + heure | Début d'événement, publié à |
| time | Juste l'heure | Heures d'ouverture |
| file | Tout fichier | PDF, document |
| image | Image unique | Avatar, logo |
| groupOfImages | Plusieurs images | Galerie photo |
| radioButton | Choix unique | Taille (S/M/L) |
| list | Sélection déroulante | Pays, catégorie |
| entity | Lien vers d'autres contenus | Produits associés |
| timeInterval | Plage de dates | Période de promotion |
| json | Données structurées personnalisées | Ré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, prend en charge 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 et d'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 UNE seule 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 :
{
"type": "timeInterval",
"value": {},
"marker": "time_interval",
"position": 16,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Time Interval"
},
"additionalFields": []
}
- 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éthode | Ce Qu'elle Fait | Quand l'utiliser |
|---|---|---|
| getAttributes() | Récupérer tous les objets d'ensembles d'attributs. | |
| getAttributesByMarker() | Récupérer tous les attributs par marqueur avec des données de l'ensemble d'attributs. | |
| getAttributeSetByMarker() | Récupérer un seul objet d'ensemble d'attributs par marqueur. | |
| 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, prend en charge 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, les comptes, les âges. - float - Nombres décimaux :
19.99, 4.5, -0.25. Utilisez pour les prix, les évaluations, les 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 marqueurs 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" // ← Ceci 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 :
-
Est-ce du texte ?
- Court (< 255 caractères) ? →
string - Long avec formatage ? →
text - Nécessite un titre ? →
textWithHeader
- Court (< 255 caractères) ? →
-
Est-ce un nombre ?
- Pas de décimales ? →
integer - A des décimales ? →
float - Précision scientifique ? →
real
- Pas de décimales ? →
-
Est-ce un choix ?
- Choisissez une option ? →
radioButton - Menu déroulant ? →
list
- Choisissez une option ? →
-
Est-ce un fichier ?
- Image ? →
imageougroupOfImages - Document ? →
file
- Image ? →
-
Est-ce une date ?
- Juste la date ? →
date - Date + heure ? →
dateTime - Période de temps ? →
timeInterval
- Juste la date ? →
Puis-je avoir des attributs imbriqués (attributs à l'intérieur d'attributs) ?
Pas directement, mais vous pouvez utiliser :
- entity type pour lier à d'autres contenus
- json type pour stocker des données structurées
- Plusieurs ensembles d'attributs pour organiser des champs connexes
Comment ajouter des règles de validation ?
Dans le panneau d'administration de OneEntry :
- Allez à votre ensemble d'attributs
- Cliquez sur un attribut
- Ajoutez des validateurs (requis, min/max, regex, etc.)
- 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 marqueurs descriptifs (
product_pricepaspp) - 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