diff --git a/migrations/Version20260127075804.php b/migrations/Version20260127075804.php
new file mode 100644
index 0000000..8abc511
--- /dev/null
+++ b/migrations/Version20260127075804.php
@@ -0,0 +1,36 @@
+addSql('ALTER TABLE product ADD dim_h DOUBLE PRECISION DEFAULT NULL');
+ $this->addSql('ALTER TABLE product ADD dim_p DOUBLE PRECISION DEFAULT NULL');
+ $this->addSql('ALTER TABLE product RENAME COLUMN installation TO dim_w');
+ }
+
+ public function down(Schema $schema): void
+ {
+ // this down() migration is auto-generated, please modify it to your needs
+ $this->addSql('CREATE SCHEMA public');
+ $this->addSql('ALTER TABLE product DROP dim_h');
+ $this->addSql('ALTER TABLE product DROP dim_p');
+ $this->addSql('ALTER TABLE product RENAME COLUMN dim_w TO installation');
+ }
+}
diff --git a/src/Entity/Product.php b/src/Entity/Product.php
index f13a1be..deb8408 100644
--- a/src/Entity/Product.php
+++ b/src/Entity/Product.php
@@ -78,6 +78,15 @@ class Product
#[ORM\OneToMany(targetEntity: ProductDoc::class, mappedBy: 'product')]
private Collection $productDocs;
+ #[ORM\Column]
+ private ?float $dimW = null;
+
+ #[ORM\Column(nullable: true)]
+ private ?float $dimH = null;
+
+ #[ORM\Column(nullable: true)]
+ private ?float $dimP = null;
+
public function __construct()
{
$this->devisLines = new ArrayCollection();
@@ -354,4 +363,40 @@ class Product
return $this;
}
+
+ public function getDimW(): ?float
+ {
+ return $this->dimW;
+ }
+
+ public function setDimW(float $dimW): static
+ {
+ $this->dimW = $dimW;
+
+ return $this;
+ }
+
+ public function getDimH(): ?float
+ {
+ return $this->dimH;
+ }
+
+ public function setDimH(?float $dimH): static
+ {
+ $this->dimH = $dimH;
+
+ return $this;
+ }
+
+ public function getDimP(): ?float
+ {
+ return $this->dimP;
+ }
+
+ public function setDimP(?float $dimP): static
+ {
+ $this->dimP = $dimP;
+
+ return $this;
+ }
}
diff --git a/src/Form/ProductType.php b/src/Form/ProductType.php
index 50052d2..891adb8 100644
--- a/src/Form/ProductType.php
+++ b/src/Form/ProductType.php
@@ -59,6 +59,22 @@ class ProductType extends AbstractType
'required' => true,
'html5' => true,
])
+
+ ->add('dimW',NumberType::class,[
+ 'label' => 'Largeur',
+ 'required' => true,
+ 'html5' => true,
+ ])
+ ->add('dimP',NumberType::class,[
+ 'label' => 'Longeur',
+ 'required' => true,
+ 'html5' => true,
+ ])
+ ->add('dimH',NumberType::class,[
+ 'label' => 'Hauteur',
+ 'required' => true,
+ 'html5' => true,
+ ])
->add('imageFile',FileType::class,[
'label' => 'Image du produit',
'required' => false,
diff --git a/templates/dashboard/products/add.twig b/templates/dashboard/products/add.twig
index 1da5ca8..98e5ec9 100644
--- a/templates/dashboard/products/add.twig
+++ b/templates/dashboard/products/add.twig
@@ -108,6 +108,48 @@
{% endif %}
+ {# 02. DIMENSIONS DU PRODUIT #}
+
+
+ 02
+ Dimensions de la Structure
+
+
+
+ {# Largeur #}
+
+ {{ form_label(form.dimW, 'Largeur (m)', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
+
+
+ W
+
+ {{ form_widget(form.dimW, {'attr': {'placeholder': '0.00', 'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-white font-mono focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 pl-10 pr-5'}}) }}
+
+
+
+ {# Longueur #}
+
+ {{ form_label(form.dimP, 'Longueur (m)', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
+
+
+ L
+
+ {{ form_widget(form.dimP, {'attr': {'placeholder': '0.00', 'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-white font-mono focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 pl-10 pr-5'}}) }}
+
+
+
+ {# Hauteur #}
+
+ {{ form_label(form.dimH, 'Hauteur (m)', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
+
+
+ H
+
+ {{ form_widget(form.dimH, {'attr': {'placeholder': '0.00', 'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-white font-mono focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 pl-10 pr-5'}}) }}
+
+
+
+
{# COLONNE DROITE : TARIFICATION #}
diff --git a/templates/revervation/produit.twig b/templates/revervation/produit.twig
index cf5c21d..9f461cd 100644
--- a/templates/revervation/produit.twig
+++ b/templates/revervation/produit.twig
@@ -8,33 +8,30 @@
Tarif : {{ product.priceDay }}€/jour. Installation et livraison dans l'Aisne (02).
{{ product.description|striptags|slice(0, 130) }}... Réservez votre date !
{% endblock %}
+
{% block jsonld %}
{% endblock %}
+
{% block breadcrumb_json %}
,{
"@type": "ListItem",
@@ -50,7 +47,6 @@
{% endblock %}
{% block body %}
- {# --- TRACKING ÉVÉNEMENT --- #}
@@ -81,19 +77,19 @@
{# --- COLONNE GAUCHE : VISUEL --- #}
-
+
{% if product.imageName %}
 | imagine_filter('webp') }})
+ class="w-full h-full object-contain p-4 md:p-8">
{% else %}
-
 }})
+
{% endif %}
-
-
+
+
{{ product.category }}
@@ -102,191 +98,182 @@
{# --- COLONNE DROITE : CONTENU --- #}
-
-
+
+
Référence : {{ product.ref }}
-
+
{{ product.name }}
-
+
{# Prix principal #}
-
-
{{ product.priceDay }}€
-
La première journée
+
+ {{ product.priceDay }}€
+ La première journée
- {# Prix supplémentaire #}
-
- + {{ product.priceSup }}€
- Par journée supplémentaire
-
-
-
{{ product.caution }}€
-
LA CAUTION
+ {# Grille de badges Tarifs/Caution #}
+
+
+ + {{ product.priceSup }}€
+ Jour supplémentaire
+
+
+ {{ product.caution }}€
+ LA CAUTION
+
-
+ {# Message Caution Stripe #}
+
-
+
Caution
- Cette somme sera prélevée et pourra être bloquée pour un maximum de 4 jours selon les politiques de Stripe.
-
+ Cette somme sera prélevée sur votre compte bancaire et pourra être bloquée pour un maximum de
4 jours selon les politiques de
Stripe.
{# --- DESCRIPTION --- #}
-
+
{{ product.description|raw }}
-
-
- {# Badge Âge #}
-
- Âge conseillé
- {{ product.category }}
-
-
- {# SÉLECTEUR DE PÉRIODE --- #}
-
-
Planifiez votre événement
-
-
-
-
+ {# --- DIMENSIONS (Version Responsive) --- #}
+ {% if product.dimP is not empty and product.dimP != "" %}
+
+
Dimensions de la structure
+
+
+ {# Visuel Schématique #}
+
-
-
-
+ {# Chiffres #}
+
+
+ Largeur
+ {{ product.dimW }} m
+
+
+ Profondeur
+ {{ product.dimP }} m
+
+
+ Hauteur
+ {{ product.dimH }} m
+
+ {% endif %}
+
+
+
+
+ Âge conseillé
+ {{ product.category }}
+
+
- {% if product.category == "2-7 ans" %}
- {# --- BLOC CONDITION SPÉCIALE (STYLE ÉPURÉ) --- #}
-
-
-
h
- La réservation de cette structure est soumise à des conditions spéciales.
-
-
- Merci de nous contacter pour la réserver.
+ {# --- ACTIONS FINALES --- #}
+
-
- {% else %}
- {# --- ACTION FINALE ORIGINALE --- #}
-
- {% endif %}
+
+ Devis gratuit • Ludikevent • Qualité Pro
+
+
-
- {# --- DOCUMENTS PUBLICS (NOTICES, PDF) --- #}
+
+ {# --- DOCUMENTS PUBLICS --- #}
{% set publicDocs = product.productDocs|filter(doc => doc.isPublic) %}
{% if publicDocs|length > 0 %}
-
-
Ressources techniques
-
+
+
Ressources techniques
+
{% for doc in publicDocs %}
-
{% endif %}
- {# --- SECTION SUGGESTIONS (CROSS-SELLING) --- #}
+ {# --- SUGGESTIONS --- #}