{% set settingLabel = settingLabel|default(null) %} {% set settingHelp = settingHelp|default(attribute(setting, 'description') is defined ? attribute(setting, 'description') : null) %} {# templates/admin/website_settings/_field.html.twig #} {# ========================= 1- SEO — champs spécifiques ========================= #} {% if setting.key == 'title' %}
{% if settingHelp %}
{{ settingHelp }}
{% endif %}
{% elseif setting.key == 'description' %}
{% if settingHelp %}
{{ settingHelp }}
{% endif %}
{% elseif setting.key == 'keywords' %}
{% if settingHelp %}
{{ settingHelp }}
{% endif %}
{# --- Theme Vars (Couleurs) --- #} {# ========================= themeVars (json) = Couleurs + Typography ========================= #} {% elseif setting.key == 'themeVars' %} {# setting.value doit être un array (decoded) car type json -> setValue($decoded) #} {% set themeVars = setting.value is iterable ? setting.value : {} %} {# defaults + labels (comme details_company) #} {% set themeDefaults = { '--primary-color': '#2B2D2F', '--secondary-color': '#3F444A', '--secondary-color-dark': '#1F2327', '--secondary-color-light': '#E8E6E1', '--accent-color': '#C3A98B', '--text-color': '#1F1F1F', '--text-muted': '#7A7A7A', '--danger-color': '#B23A3A', '--border-color': '#E3E3E3', '--font-family-base': '"Space Grotesk", "Inter", system-ui, sans-serif', '--font-family-heading': '"Poppins", "Inter", sans-serif', '--font-family-meta': '"IBM Plex Sans", "Inter", sans-serif' } %} {% set themeLabels = { '--primary-color': 'Couleur principale', '--secondary-color': 'Couleur secondaire', '--secondary-color-dark': 'Secondaire foncée', '--secondary-color-light': 'Secondaire claire', '--accent-color': 'Couleur accent', '--text-color': 'Texte principal', '--text-muted': 'Texte secondaire', '--danger-color': 'Couleur alerte', '--border-color': 'Couleur bordure', '--font-family-base': 'Police principale', '--font-family-heading': 'Titres', '--font-family-meta': 'Texte secondaire' } %} {% set fontOptions = [ {'label':'Space Grotesk / Inter (Buttons & body)','value':'"Space Grotesk", "Inter", system-ui, sans-serif'}, {'label':'Poppins bold / Headings','value':'"Poppins", "Inter", sans-serif'}, {'label':'IBM Plex Sans / Meta','value':'"IBM Plex Sans", "Inter", sans-serif'}, {'label':'Neue Haas Grotesk','value':'"Neue Haas Grotesk", "Helvetica Neue", Helvetica, Arial, sans-serif'}, {'label':'Montserrat / modern','value':'"Montserrat", "Inter", system-ui, sans-serif'} ] %} {# valeurs courantes (fallback sur defaults) #} {% set currentBase = themeVars['--font-family-base']|default(themeDefaults['--font-family-base']) %} {% set currentHeading = themeVars['--font-family-heading']|default(themeDefaults['--font-family-heading']) %} {% set currentMeta = themeVars['--font-family-meta']|default(themeDefaults['--font-family-meta']) %}
{# ========= COULEURS (5 par ligne si ta CSS grid est réglée ainsi) ========= #}
{% for key, defaultValue in themeDefaults %} {% if key ends with 'color' or key in ['--text-color','--text-muted','--border-color','--danger-color','--accent-color','--primary-color','--secondary-color','--secondary-color-dark','--secondary-color-light'] %} {% set currentValue = themeVars[key]|default(defaultValue) %} {% set inputId = key|replace({'--':'', '-':'_'}) %}
{% endif %} {% endfor %}
Ces valeurs remplacent les variables CSS du thème front.

{# ========= TYPOGRAPHY ========= #}
Police utilisée pour les textes généraux.
Police utilisée pour les titres et les CTA.
Police pour descriptions, badges et notes.
{# ========= CHAMP UNIQUE POSTÉ ========= #} {% if settingHelp %}
{{ settingHelp }}
{% endif %}
{% elseif setting.key == 'freeDeliveryAmount' %}
Montant minimum de commande pour bénéficier de la livraison gratuite.
{% elseif setting.key == 'maxOrderQty' %}
Seuil maximum autorisé par article (fiche produit et panier).
{% elseif setting.key == 'homepageBenefits' %} {% set benefitsDefaults = [ {'title': 'Livraison rapide', 'url': path('delivery_information'), 'icon': 'fi-rs-truck'}, {'title': 'Retours faciles', 'url': path('return_and_exchange'), 'icon': 'fi-rs-refresh'}, {'title': 'Paiement sécurisé','url': path('terms_of_sales'), 'icon': 'fi-rs-credit-card'}, {'title': 'Support client', 'url': path('contact'), 'icon': 'fi-rs-headset'} ] %} {# setting.value contient déjà un array (json décodé) OU null #} {% set homepageBenefits = setting.value is not empty ? setting.value : benefitsDefaults %}
{% for benefit in homepageBenefits %}
{% endfor %}
{% if settingHelp %}
{{ settingHelp }}
{% endif %}
{% elseif setting.key == 'homepageMode' %} {% set currentMode = setting.value is not empty ? setting.value : 'category' %}
{% if settingHelp %}
{{ settingHelp }}
{% endif %}
{% elseif setting.key == 'homepageColumns' %} {% set currentColumns = (setting.value is not empty ? setting.value : 2)|default(2)|round(0, 'floor') %}
{% if settingHelp %}
{{ settingHelp }}
{% endif %}
{% elseif setting.key == 'homepageOrder' %} {% set currentOrder = (setting.value|default(6))|round(0, 'floor') %}
{% if settingHelp %}
{{ settingHelp }}
{% endif %}
{% elseif setting.key == 'categoryUrlType' %} {% set currentCategoryUrl = (setting.value is not empty ? setting.value : 0) + 0 %}
{% if settingHelp %}
{{ settingHelp }}
{% endif %}
{% elseif setting.key == 'mixedAspectRatio' %} {# valeur actuelle : 0.8 par défaut, affichée avec 1 décimale #} {% set rawValue = (setting.value is not null and setting.value != '') ? (setting.value ~ '') : '0.8' %} {% set normalizedValue = rawValue|replace({',':'.'})|trim %} {% set ratioValue = (normalizedValue matches '/^[0-9]+(\\.[0-9]+)?$/') ? (normalizedValue + 0) : 0.8 %} {% if ratioValue < 0.1 %} {% set ratioValue = 0.8 %} {% endif %} {% set currentRatio = ratioValue|number_format(1, '.', '') %}
{% if settingHelp %}
{{ settingHelp }}
{% else %}
Ex: 0.75 pour format vêtements.
{% endif %}
{% set ratios = [ { 'label': '1:1', 'desc': 'carré', 'val': '1.0', 'w': 26, 'h': 26 }, { 'label': '4:5', 'desc': 'portrait', 'val': '0.8', 'w': 26, 'h': 32 }, { 'label': '3:4', 'desc': 'vêtements', 'val': '0.75', 'w': 26, 'h': 34 }, { 'label': '5:4', 'desc': 'paysage', 'val': '1.25', 'w': 34, 'h': 26 }, { 'label': '16:9', 'desc': 'panorama', 'val': '1.6', 'w': 36, 'h': 22 } ] %} {% for r in ratios %}
{{ r.label }} {{ r.desc }}
{% endfor %}
{% elseif setting.key == 'showOutOfStock' %}
{% set isChecked = setting.value ? true : false %} Montrer les produits hors stock sur la home {# pour les bool: si non coché, rien n'est posté; ton controller gère déjà ce cas #}
{% if settingHelp %}
{{ settingHelp }}
{% endif %}
{% elseif setting.key == 'newProductDays' %} {% set _newProductDays = setting.value is not null ? (setting.value + 0) : 30 %} {% if _newProductDays < 1 %}{% set _newProductDays = 30 %}{% endif %}
{% if settingHelp %}
{{ settingHelp }}
{% else %}
Détermine la fenêtre (en jours) utilisée pour qualifier un produit de nouveauté.
{% endif %}
{% elseif setting.key == 'topSalesPeriod' %} {% set _topSalesPeriod = setting.value is not null ? (setting.value + 0) : 30 %} {% if _topSalesPeriod < 1 %}{% set _topSalesPeriod = 30 %}{% endif %}
{% if settingHelp %}
{{ settingHelp }}
{% else %}
Durée utilisée pour calculer la section « Top ventes » de la home. Laisser vide pour 30 jours.
{% endif %}
{% elseif setting.key == 'stockDisplayMode' %}
{% set currentMode = setting.value is not empty ? setting.value : 'exact' %}
Exemples (ce que le client verra sur la fiche produit) :
ExactStock : 12 (ou Restant : 2)
ApproximatifEn stock / Stock limité (sans afficher de chiffre)
Caché → aucune info de stock affichée
{% if settingHelp %}
{{ settingHelp }}
{% endif %}
{% elseif setting.key == 'headerTop' %} {# Valeur actuelle (array) #} {# headerTop (json) #} {% set headerTop = setting.value ?? setting.valueString ?? null %} {# IMPORTANT: pas de json_decode en Twig (filtre inexistant). Si headerTop n'est pas iterable (string JSON), on le remplace par {}. Le décodage doit être fait côté PHP/JS, pas Twig. #} {% if headerTop is not iterable %} {% set headerTop = {} %} {% endif %} {% set headerTopEnabled = headerTop.enabled is defined ? headerTop.enabled : true %} {% set headerTopMode = headerTop.mode is defined ? headerTop.mode : 'marquee' %} {% set headerTopSpeed = headerTop.speed is defined ? headerTop.speed : 4 %} {% set headerTopMessages = headerTop.messages is defined and headerTop.messages is iterable ? headerTop.messages : [] %}
{# Hidden JSON pour l'enregistrement #}
1 = lent • 10 = rapide

Messages
{% for msg in headerTopMessages %} {% set t = msg.type|default('brand') %} {% set txt = msg.text|default('') %}
Variables possibles : {{ '{{ freeDeliveryAmount }}' }}, {{ '{{ companyName }}' }}
{% endfor %}
{# Template JS pour nouvelle ligne #}
Tu peux utiliser des variables dynamiques dans les messages (elles seront remplacées côté front).
Exemples : {{ '{{ freeDeliveryAmount }}' }} → montant livraison gratuite, {{ '{{ companyName }}' }} → nom de l’entreprise.
{% if settingHelp %}
{{ settingHelp }}
{% endif %}
{# ========================= catalogListMode (product | declination) ========================= #} {% elseif setting.key == 'catalogListMode' %} {% set currentCatalogListMode = setting.value ?? setting.valueString ?? 'product' %}
Exemple : si vous vendez des baskets avec plusieurs pointures/couleurs, choisissez Déclinaisons pour lister directement chaque variation.
{# ========================= site_maintenance (bool) ========================= #} {% elseif setting.key == 'site_maintenance' %} {# valeur bool : peut arriver en bool, int, string #} {% set isMaintenance = (setting.value is same as(true)) or (setting.value == 1) or (setting.valueString|default('') in ['1','true','on','yes']) %}
Quand activé, le front peut afficher une page “Maintenance” (le back-office reste accessible).
{% elseif setting.key == 'returnPolicyText' %}
Affichage sur les fiches produit
Ce texte sera visible dans la fiche produit classique et dans la page de commande rapide.
Aperçu : {{ setting.valueString|default(setting.value|default('Politique de retour de 3 jours')) }}
{% else %} {# ========================= 2- Générique — tous les autres settings ========================= #}
{# ===== STRING ===== #} {% if setting.type == 'string' %} {% set isPassword = (setting.key == 'mailer_smtp_password') %}
{% if isPassword %} {% endif %}
{% if isPassword %} Le mot de passe SMTP reste caché. Laissez vide pour conserver la valeur existante. {% endif %} {# ===== TEXT ===== #} {% elseif setting.type == 'text' %} {# ===== INT ===== #} {% elseif setting.type == 'int' %} {# ===== FLOAT ===== #} {% elseif setting.type == 'float' %} {# ===== BOOL ===== #} {% elseif setting.type == 'bool' %}
{# ===== JSON ===== #} {% elseif setting.type == 'json' %} Format JSON valide requis. {% else %} {# fallback #} {% endif %} {% if settingHelp %}
{{ settingHelp }}
{% endif %}
{% endif %}