src/Controller/DefaultController.php line 14

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. class DefaultController extends AbstractController
  7. {
  8.     /**
  9.      * @Route("/", name="home")
  10.      */
  11.     public function index()
  12.     {
  13.     $slides = [
  14.     [
  15.         'title' => 'Nouveauté',
  16.         'subtitle' => 'Découvrez notre sélection 2025',
  17.         'image' => 'img/slides/slide-1.png',
  18.         'cta_text' => 'Voir la sélection',
  19.         'cta_link' => '/nouveautes'
  20.     ],
  21.      [
  22.         'title' => 'Nouveauté',
  23.         'subtitle' => 'Découvrez notre sélection 2025',
  24.         'image' => 'img/slides/slide-2.png',
  25.         'cta_text' => 'Voir la sélection',
  26.         'cta_link' => '/nouveautes'
  27.     ]
  28.     ];
  29.     $features = [
  30.   [
  31.     'icon' => 'img/picto/shield.png',
  32.     'title' => 'Sécurité Garantie',
  33.     'text' => 'Tous nos produits sont normés et certifiés CE',
  34.   ],
  35.   [
  36.     'icon' => 'img/picto/quality.png',
  37.     'title' => 'Engagement qualité',
  38.     'text' => 'Sélection rigoureuse des meilleurs équipements',
  39.   ],
  40.   [
  41.     'icon' => 'img/picto/stopclock.png',
  42.     'title' => 'Respect & Durabilité',
  43.     'text' => 'Produits respectant le développement durable et le respect de l’environnement.',
  44.   ],
  45. ];
  46. $products = [
  47.     [
  48.         'slug'             => 'harnais-antichute-5-points',
  49.         'name'             => 'Harnais antichute 5 points',
  50.         'image'            => 'img/products/produit-1.png',
  51.         'shortDescription' => 'Harnais complet EN 361, points dorsaux & sternaux.',
  52.         'price'            => 129.90,
  53.     ],
  54.     [
  55.         'slug'             => 'harnais-antichute-leger',
  56.         'name'             => 'Harnais antichute léger',
  57.         'image'            => 'img/products/produit-2.png',
  58.         'shortDescription' => 'Modèle compact pour travaux de courte durée, EN 361.',
  59.         'price'            => 89.50,
  60.     ],
  61.     [
  62.         'slug'             => 'gilet-haute-visibilite-cl2',
  63.         'name'             => 'Gilet haute visibilité classe 2',
  64.         'image'            => 'img/products/produit-3.png',
  65.         'shortDescription' => 'Polyester 120 g/m², bandes rétro-réfléchissantes 3M.',
  66.         'price'            => 9.90,
  67.     ],
  68.     [
  69.         'slug'             => 'lot-3-casques-abs',
  70.         'name'             => 'Lot de 3 casques ABS',
  71.         'image'            => 'img/products/produit-4.png',
  72.         'shortDescription' => 'Casques ventilés EN 397, jugulaire 4 points.',
  73.         'price'            => 59.00,
  74.     ],
  75. ];
  76. $categories = [
  77.     ['slug' => 'protection-tete',      'name' => 'Protection tête',         'image' => 'img/picto-3d/picto-tete.png'],
  78.     ['slug' => 'protection-main',      'name' => 'Protection main',         'image' => 'img/picto-3d/picto-main.png'],
  79.     ['slug' => 'protection-pied',      'name' => 'Protection pied',         'image' => 'img/picto-3d/picto-pied.png'],
  80.     ['slug' => 'protection-visuelle',  'name' => 'Protection visuelle',     'image' => 'img/picto-3d/picto-visuel.png'],
  81.     ['slug' => 'haute-visibilite',     'name' => 'Haute visibilité',        'image' => 'img/picto-3d/picto-visibilite.png'],
  82.     ['slug' => 'anti-chute',           'name' => 'Anti-chute',              'image' => 'img/picto-3d/picto-chute.png'],
  83.     ['slug' => 'protection-respiratoire','name' => 'Protection respiratoire','image' => 'img/picto-3d/picto-respiratoire.png'],
  84.     ['slug' => 'hss',                  'name' => 'HSS',                     'image' => 'img/picto-3d/picto-hss.png'],
  85.     ['slug' => 'protection-froid',     'name' => 'Protection froid',        'image' => 'img/picto-3d/picto-froid.png'],
  86.     ['slug' => 'multirisques',         'name' => 'Multirisques',            'image' => 'img/picto-3d/picto-multirisque.png'],
  87.     ['slug' => 'protection-pluie',     'name' => 'Protection pluie',        'image' => 'img/picto-3d/picto-pluie.png'],
  88.     ['slug' => 'vetements-travail',    'name' => 'Vêtements de travail',    'image' => 'img/picto-3d/picto-travail.png'],
  89.     ['slug' => 'anti-bruit',           'name' => 'Protection anti-bruit',   'image' => 'img/picto-3d/picto-bruit.png'],
  90.     ['slug' => 'jetable',              'name' => 'Jetable',                 'image' => 'img/picto-3d/picto-jetables.png'],
  91.     ['slug' => 'accessoires',          'name' => 'Accessoires',             'image' => 'img/picto-3d/picto-accessoires.png'],
  92. ];
  93.         return $this->render('default/index.html.twig', [
  94.             'slides' => $slides,
  95.             'features'=>$features,
  96.             'products'=>$products,
  97.             'categories'=>$categories
  98.         ]);
  99.     }
  100.     /**
  101.      * @Route("/categorie/produit", name="category.produit")
  102.      */
  103.     public function categoryProduit()
  104.     {
  105.     $products = [
  106.     [
  107.         'slug'            => 'harnais-antichute-5-points',
  108.         'name'            => 'Harnais antichute 5 points',
  109.         'image'           => 'img/products/produit-1.png',
  110.         'shortDescription'=> 'Harnais EN 361 avec points d’ancrage dorsaux et sternaux.',
  111.         'price'           => 129.90,
  112.     ],
  113.     [
  114.         'slug'            => 'corde-antichute-10m',
  115.         'name'            => 'Corde antichute 10 m',
  116.         'image'           => 'img/products/produit-8.png',
  117.         'shortDescription'=> 'Ligne de vie Ø 12 mm + absorbeur intégré, norme EN 353-2.',
  118.         'price'           => 54.00,
  119.     ],
  120.     [
  121.         'slug'            => 'longe-simple-absorbeur',
  122.         'name'            => 'Longe simple absorbeur',
  123.         'image'           => 'img/products/produit-7.png',
  124.         'shortDescription'=> 'Sangle polyamide 1,5 m, crochet et absorbeur – EN 355.',
  125.         'price'           => 29.50,
  126.     ],
  127.     [
  128.         'slug'            => 'mousqueton-acier-a-vis',
  129.         'name'            => 'Mousqueton acier à vis',
  130.         'image'           => 'img/products/produit-6.png',
  131.         'shortDescription'=> 'Ouverture 18 mm, résistance 25 kN (EN 362).',
  132.         'price'           => 6.30,
  133.     ],
  134.     [
  135.         'slug'            => 'poulie-rescue-aluminium',
  136.         'name'            => 'Poulie Rescue aluminium',
  137.         'image'           => 'img/products/produit-9.png',
  138.         'shortDescription'=> 'Pour cordes Ø 8-13 mm, roulement étanche.',
  139.         'price'           => 38.90,
  140.     ],
  141.     [
  142.         'slug'            => 'casque-chantier-abs',
  143.         'name'            => 'Casque de chantier ABS',
  144.         'image'           => 'img/products/produit-4.png',
  145.         'shortDescription'=> 'Casque ventilé avec jugulaire 4 points, norme EN 397.',
  146.         'price'           => 21.50,
  147.     ],
  148. ];
  149.     $subcategories = [
  150.     ['name' => 'protection occulaire'],
  151.     ['name' => 'protection pied'],
  152.     ['name' => 'protection main'],
  153.     ];
  154.         return $this->render('default/category.html.twig',[
  155.             'products'=>$products,
  156.             'subcategories'=>$subcategories
  157.         ]);
  158.     }
  159.     /**
  160.      * @Route("/categorie/produit/{slug}", name="produit")
  161.      */
  162.     public function produit($slug)
  163.     {   
  164.   /* ---------- Catalogue "hard-codé" pour la démo ---------- */
  165.         $products = [
  166.             'harnais-antichute-5-points' => [
  167.                 'id'    => 1,
  168.                 'name'  => 'Harnais antichute 5 points',
  169.                 'slug'  => 'harnais-antichute-5-points',
  170.                 'sku'   => 'HN-5001',
  171.                 'mainImage' => 'img/products/produit-1.png',
  172.                 'gallery'   => [
  173.                     'img/products/produit-1.png',
  174.                     'img/products/produit-1.png',
  175.                     'img/products/produit-1.png',
  176.                 ],
  177.                 'description' => 'Harnais de sécurité complet avec points d’ancrage dorsaux et sternaux. Confort optimal pour les travaux en hauteur. Norme EN 361.',
  178.                 'sizes'       => ['S''M''L''XL'],
  179.                 'price'       => 129.90,
  180.             ],
  181.             'harnais-antichute-leger' => [
  182.                 'id'    => 2,
  183.                 'name'  => 'Harnais antichute léger',
  184.                 'slug'  => 'harnais-antichute-leger',
  185.                 'sku'   => 'HN-5002',
  186.                 'mainImage' => 'img/products/produit-2.png',
  187.                 'gallery'   => [
  188.                     'img/products/produit-2.png',
  189.                     'img/products/produit-2.png',
  190.                 ],
  191.                 'description' => 'Modèle compact pour interventions rapides, réglages simplifiés. EN 361.',
  192.                 'sizes'       => ['M''L''XL'],
  193.                 'price'       => 89.50,
  194.             ],
  195.             'gilet-haute-visibilite-cl2' => [
  196.                 'id'    => 3,
  197.                 'name'  => 'Gilet haute visibilité classe 2',
  198.                 'slug'  => 'gilet-haute-visibilite-cl2',
  199.                 'sku'   => 'GHV-02',
  200.                 'mainImage' => 'img/products/produit-3.png',
  201.                 'gallery'   => [
  202.                     'img/products/produit-3.png',
  203.                     'img/products/produit-3.png',
  204.                 ],
  205.                 'description' => 'Polyester 120 g/m², bandes rétro-réfléchissantes 3M. Norme EN ISO 20471.',
  206.                 'sizes'       => ['M''L''XL''XXL'],
  207.                 'price'       => 9.90,
  208.             ],
  209.             'lot-3-casques-abs' => [
  210.                 'id'    => 4,
  211.                 'name'  => 'Lot de 3 casques ABS',
  212.                 'slug'  => 'lot-3-casques-abs',
  213.                 'sku'   => 'CS-3X',
  214.                 'mainImage' => 'img/products/produit-4.png',
  215.                 'gallery'   => [
  216.                     'img/products/produit-4.png',
  217.                 ],
  218.                 'description' => 'Casques ventilés EN 397 avec jugulaire 4 points. Coloris assortis.',
  219.                 'sizes'       => [],           // non pertinent ici
  220.                 'price'       => 59.00,
  221.             ],
  222.                'corde-antichute-10m' => [
  223.         'id'    => 5,
  224.         'name'  => 'Corde antichute 10 m',
  225.         'slug'  => 'corde-antichute-10m',
  226.         'sku'   => 'CD-10M',
  227.         'mainImage' => 'img/products/produit-8.png',
  228.         'gallery'   => [
  229.             'img/products/produit-8.png',
  230.             'img/products/produit-8.png',
  231.         ],
  232.         'description' => 'Ligne de vie Ø 12 mm avec absorbeur intégré. Norme EN 353-2.',
  233.         'sizes'       => [],
  234.         'price'       => 54.00,
  235.     ],
  236.     'longe-simple-absorbeur' => [
  237.         'id'    => 6,
  238.         'name'  => 'Longe simple absorbeur',
  239.         'slug'  => 'longe-simple-absorbeur',
  240.         'sku'   => 'LS-150',
  241.         'mainImage' => 'img/products/produit-7.png',
  242.         'gallery'   => [
  243.             'img/products/produit-7.png',
  244.             'img/products/produit-7.png',
  245.         ],
  246.         'description' => 'Sangle polyamide 1,5 m avec absorbeur. Crochet acier. Norme EN 355.',
  247.         'sizes'       => [],
  248.         'price'       => 29.50,
  249.     ],
  250.     'mousqueton-acier-a-vis' => [
  251.         'id'    => 7,
  252.         'name'  => 'Mousqueton acier à vis',
  253.         'slug'  => 'mousqueton-acier-a-vis',
  254.         'sku'   => 'MS-VIS',
  255.         'mainImage' => 'img/products/produit-6.png',
  256.         'gallery'   => [
  257.             'img/products/produit-6.png',
  258.             'img/products/produit-6.png',
  259.         ],
  260.         'description' => 'Mousqueton acier zingué avec verrouillage à vis. Résistance 25 kN. EN 362.',
  261.         'sizes'       => [],
  262.         'price'       => 6.30,
  263.     ],
  264.     'poulie-rescue-aluminium' => [
  265.         'id'    => 8,
  266.         'name'  => 'Poulie Rescue aluminium',
  267.         'slug'  => 'poulie-rescue-aluminium',
  268.         'sku'   => 'PR-ALU',
  269.         'mainImage' => 'img/products/produit-9.png',
  270.         'gallery'   => [
  271.             'img/products/produit-9.png',
  272.             'img/products/produit-9.png',
  273.         ],
  274.         'description' => 'Poulie pour cordes Ø 8 à 13 mm. Roulement étanche. Aluminium haute résistance.',
  275.         'sizes'       => [],
  276.         'price'       => 38.90,
  277.     ],
  278.         ];
  279.         /* ---------- Sélection du produit courant ---------- */
  280.         if (!isset($products[$slug])) {
  281.             throw $this->createNotFoundException('Produit introuvable.');
  282.         }
  283.         $product $products[$slug];
  284.         /* ---------- Produits liés (tous sauf le courant) ---------- */
  285.         $related array_values(
  286.             array_filter($products, fn ($p) => $p['slug'] !== $slug)
  287.         );
  288.         /* ---------- Breadcrumb minimal ---------- */
  289.     /*  $breadcrumbs = [
  290.             ['label' => 'Catégorie démo', 'url' => $this->generateUrl('category', ['slug' => 'demo'])],
  291.         ];*/
  292.   /*  $related = [
  293.     [
  294.         'slug'            => 'corde-antichute-10m',
  295.         'name'            => 'Corde antichute 10 m',
  296.         'image'           => 'images/products/corde-10m.jpg',
  297.         'shortDescription'=> 'Ligne de vie Ø 12 mm avec absorbeur intégré.',
  298.         'price'           => 54.00,
  299.     ],
  300.     [
  301.         'slug'            => 'longe-simple-absorbeur',
  302.         'name'            => 'Longe simple avec absorbeur',
  303.         'image'           => 'images/products/longe-absorbeur.jpg',
  304.         'shortDescription'=> 'Sangle polyamide 1,5 m – EN 355.',
  305.         'price'           => 29.50,
  306.     ],
  307.     [
  308.         'slug'            => 'mousqueton-acier-a-vis',
  309.         'name'            => 'Mousqueton acier à vis',
  310.         'image'           => 'images/products/mousqueton-vis.jpg',
  311.         'shortDescription'=> 'Ouverture 18 mm, résistance 25 kN.',
  312.         'price'           => 6.30,
  313.     ],
  314.     [
  315.         'slug'            => 'poulie-rescue-aluminium',
  316.         'name'            => 'Poulie Rescue aluminium',
  317.         'image'           => 'images/products/poulie-rescue.jpg',
  318.         'shortDescription'=> 'Pour cordes Ø 8-13 mm, roulement étanche.',
  319.         'price'           => 38.90,
  320.     ],
  321. ];*/
  322. $breadcrumbs = [
  323.     [
  324.         'label' => 'Anti-Chute',
  325.         'url'   => $this->generateUrl('category.produit', ['slug' => 'anti-chute']),
  326.     ],
  327.     [
  328.         'label' => 'Harnais',
  329.         'url'   => $this->generateUrl('category.produit', ['slug' => 'harnais']),
  330.     ],
  331. ]; 
  332.         return $this->render('default/produit.html.twig', [
  333.             'product'=>$product,
  334.             'related'=>$related,
  335.             'breadcrumbs'=>$breadcrumbs
  336.         ]);
  337.     }
  338.     /**
  339.      * @Route("/contact", name="contact")
  340.      */
  341.     public function contact()
  342.     {
  343.         return $this->render('default/contact.html.twig');
  344.     }
  345. }