templates/main/index.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block body %}
  3.     <style>
  4.         body {
  5.             background-color: #0d3b79 !important;
  6.             font-family: "Montserrat", sans-serif;
  7.             font-size: 15px;
  8.             background-image: url("/assets/images/general-background.jpg");
  9.             background-repeat: no-repeat;
  10.             background-position: top center;
  11.             background-size: 100%;
  12.         }
  13.         .headerTop {
  14.             color: #FFF;
  15.             width: 100%;
  16.             height: 34px;
  17.             background-color: #161d3f;
  18.             font-family: "Montserrat", sans-serif;
  19.         }
  20.         .headerTopContent {
  21.             width: 100%;
  22.             margin-left: auto;
  23.             margin-right: auto;
  24.             padding-left: 100px;
  25.             padding-right: 100px;
  26.         }
  27.         .headerTopContent DIV {
  28.             padding-top: 5px;
  29.             float: left;
  30.         }
  31.         .headerTopContent IMG {
  32.             margin-top: -3px;
  33.         }
  34.         .headerBottom {
  35.             color: #FFF;
  36.             width: 100%;
  37.             height: 98px;
  38.             font-size: 15px !important;
  39.             background-color: rgba(0, 60, 140, 0.6);
  40.             /* Fond transparent */
  41.         }
  42.         .headerBottomContent {
  43.             padding-top: 10px;
  44.             width: 100%;
  45.             margin-left: auto;
  46.             margin-right: auto;
  47.             padding-left: 100px;
  48.             padding-right: 100px;
  49.             font-family: "Lato", sans-serif;
  50.             text-transform: uppercase;
  51.         }
  52.         a {
  53.             text-decoration: none !important;
  54.         }
  55.         #footer-copyright {
  56.             color: #003c8c !important;
  57.         }
  58.         main {
  59.             min-height: 80vh !important;
  60.         }
  61.         footer {
  62.             background: #ecf0f1;
  63.             padding-bottom: 2em;
  64.             padding-top: 2em;
  65.             display: block;
  66.         }
  67.         .contentPage {
  68.             background-color: #FFF;
  69.             color: #0d3b79;
  70.             width: 98%;
  71.             margin-left: auto;
  72.             margin-right: auto;
  73.             margin-top: 175px;
  74.         }
  75.         .texteBleu A {
  76.             color: #78c8e6 !important;
  77.         }
  78.         .texteBlanc A {
  79.             color: #FFFFFF !important;
  80.         }
  81.         .navbar-light .navbar-nav .nav-link {
  82.             color: #78c8e6;
  83.         }
  84.         .nav-item a {
  85.             color: #78c8e6;
  86.         }
  87.         .souligne-title::after {
  88.             content: "";
  89.             position: relative;
  90.             bottom: 0px;
  91.             left: 0px;
  92.             width: 80px;
  93.             /* Longueur de la barre bleue */
  94.             height: 6px;
  95.             /* Épaisseur de la barre bleue */
  96.             background-color: #006ec8;
  97.             /* Couleur de la barre bleue */
  98.             display: block;
  99.         }
  100.         .souligne::after {
  101.             content: "";
  102.             position: relative;
  103.             top: 32px;
  104.             width: 70px;
  105.             /* Longueur de la barre bleue */
  106.             height: 4px;
  107.             /* Épaisseur de la barre bleue */
  108.             background-color: #006ec8;
  109.             /* Couleur de la barre bleue */
  110.             display: block;
  111.         }
  112.         .souligne, .souligne-tile {
  113.             margin-bottom: 10px;
  114.         }
  115.         h1 {
  116.             font-family: "Montserrat", sans-serif;
  117.             font-size: 32pt !important;
  118.             font-weight: bold;
  119.             color: #FFF;
  120.         }
  121.         h2 {
  122.             font-family: "Montserrat", sans-serif;
  123.             font-size: 22pt;
  124.             font-weight: normal;
  125.             color: #003c8c;
  126.         }
  127.         h3 {
  128.             color: #FFF;
  129.         }
  130.         label {
  131.             color: #FFF;
  132.         }
  133.         .contact-container {
  134.             color: #FFF;
  135.         }
  136.         .contact-container label {
  137.             color: #003c8c !important;
  138.         }
  139.         .info-sav {
  140.             font-family: "Montserrat", sans-serif;
  141.             font-size: 22pt;
  142.             color: #FFF;
  143.         }
  144.         .blocContact {
  145.             padding: 10px;
  146.             background-color: #FFF;
  147.             color: #0c2352;
  148.         }
  149.         .blocContact input {
  150.             background-color: #FFF;
  151.         !important;
  152.             border-radius: 0px !important;
  153.             border: solid 1px #e5e5e5 !important;
  154.         }
  155.         .blocContact label {
  156.             font-weight: normal;
  157.         }
  158.         .blocFormHeader {
  159.             text-align: left !important;
  160.             padding-left: 40px;
  161.             padding-right: 40px;
  162.         }
  163.         .logo-reseaux {
  164.             margin-left: 15px;
  165.         }
  166.         .btnContact, .btnFormBlue {
  167.             margin-top: 10px;
  168.             background-color: #006ec8 !important;
  169.             border-radius: 30px !important;
  170.             border: 0px !important;
  171.             margin: 5px;
  172.         }
  173.         .navbar-default {
  174.             margin-top: 55px;
  175.             background-color: transparent;
  176.             border-color: transparent;
  177.         }
  178.         .page {
  179.             margin-top: 175px;
  180.             background-color: rgba(239, 239, 239, 0.5);
  181.             padding: 15px;
  182.             width: 80%;
  183.         }
  184.         .center {
  185.             text-align: center;
  186.             margin-left: auto;
  187.             margin-right: auto;
  188.         }
  189.         .body-container {
  190.             flex: 1;
  191.             min-height: 600px;
  192.         }
  193.         .container-min {
  194.             margin-left: auto;
  195.             margin-right: auto;
  196.             padding-left: 15px;
  197.             padding-right: 15px;
  198.         }
  199.         .contact-container {
  200.             color: #FFF;
  201.             background-color: #153065;
  202.             padding-top: 15px;
  203.         }
  204.         .contact-container label {
  205.             color: #003c8c !important;
  206.         }
  207.         .info-sav {
  208.             font-family: "Montserrat", sans-serif;
  209.             font-size: 22pt;
  210.             color: #FFF;
  211.         }
  212.         .blocForm {
  213.             padding: 35px;
  214.             width: 100%;
  215.             max-width: 1024px;
  216.             margin-left: auto;
  217.             margin-right: auto;
  218.             background-color: #FFF;
  219.         }
  220.         .blocForm input, .blocForm textarea, .blocForm select {
  221.             background-color: #e2f3fa !important;
  222.             border-radius: 30px !important;
  223.             border: 0px !important;
  224.             color: #003c8c !important;
  225.         }
  226.         .blocContact {
  227.             padding: 10px;
  228.             background-color: #FFF;
  229.             color: #0c2352;
  230.         }
  231.         .blocContact input {
  232.             background-color: #FFF;
  233.         !important;
  234.             border-radius: 0px !important;
  235.             border: solid 1px #e5e5e5 !important;
  236.         }
  237.         .blocContact label {
  238.             font-weight: normal;
  239.         }
  240.         .blocFormHeader {
  241.             text-align: left !important;
  242.             padding-left: 40px;
  243.             padding-right: 40px;
  244.         }
  245.         .logo-reseaux {
  246.             margin-left: 15px;
  247.         }
  248.         .btnContact, .btnFormBlue {
  249.             margin-top: 10px;
  250.             background-color: #006ec8 !important;
  251.             border-radius: 30px !important;
  252.             border: 0px !important;
  253.             margin: 5px;
  254.         }
  255.     </style>
  256.     <style>
  257.         body {
  258.             font-family: Varela, sans-serif;
  259.             color: #2b4b78;
  260.         }
  261.         .container {
  262.             padding-right: 85px;
  263.             padding-left: 85px;
  264.         }
  265.         h1 {
  266.             font-family: "Montserrat", sans-serif;
  267.             font-size: 44pt;
  268.             font-weight: bold;
  269.             color: #003c8c;
  270.         }
  271.         h2 {
  272.             font-family: "Montserrat", sans-serif;
  273.             font-size: 20pt;
  274.             font-weight: normal !important;
  275.             color: #003c8c;
  276.         }
  277.         h3 {
  278.             color: #003c8c;
  279.         }
  280.         label {
  281.             font-family: "Montserrat", sans-serif;
  282.             color: #003c8c;
  283.             font-size: 14pt;
  284.             font-weight: bold;
  285.         }
  286.         #search_products_form_submit {
  287.             background-color: #003c8c;
  288.         }
  289.         .headerTxt {
  290.             font-size: 18pt;
  291.             font-family: "Montserrat", sans-serif;
  292.             color: #003c8c;
  293.         }
  294.         .mainReference {
  295.             font-family: "Montserrat", sans-serif;
  296.             background-color: #003c8c;
  297.             color: #FFF;
  298.             padding: 5px;
  299.             font-size: 22pt;
  300.         }
  301.         .spacerTop {
  302.             margin-top: 15px
  303.         }
  304.         .options {
  305.             font-family: "Montserrat", sans-serif;
  306.             font-size: 13pt;
  307.             color: #003c8c;
  308.             font-weight: bold;
  309.             border-bottom: solid 1px #78c8e6;
  310.         }
  311.         .collapsible {
  312.             background-color: #FFF;
  313.             font-family: "Montserrat", sans-serif;
  314.             font-size: 13pt;
  315.             color: #003c8c;
  316.             cursor: pointer;
  317.             padding: 18px;
  318.             width: 100%;
  319.             border: none;
  320.             text-align: left;
  321.             outline: none;
  322.         }
  323.         .activeCollapsible, .collapsible:hover {
  324.             font-weight: bolder;
  325.         }
  326.         .collapsible:after {
  327.             content: '\002B';
  328.             color: #003c8c;
  329.             font-weight: bold;
  330.             float: right;
  331.             margin-left: 5px;
  332.         }
  333.         .activeCollapsible:after {
  334.             content: "\2212";
  335.         }
  336.         .content {
  337.             padding: 0 18px;
  338.             max-height: 0;
  339.             overflow: hidden;
  340.             transition: max-height 0.2s ease-out;
  341.         }
  342.         .productTable {
  343.             font-family: "Montserrat", sans-serif;
  344.             font-size: 12pt;
  345.             color: #505050;
  346.             background-color: #FFF;
  347.             border-spacing: 2px;
  348.             border-collapse: separate;
  349.         }
  350.         .productTable TH {
  351.             background-color: #e5e5e5;
  352.             text-align: center;
  353.             padding: 3px;
  354.             font-weight: bold;
  355.         }
  356.         .productTable TD {
  357.             margin: 2px;
  358.             text-align: center;
  359.             border-bottom: solid 1px #e5e5e5;
  360.         }
  361.         .productTable TR {
  362.             border-bottom: solid 1px #e5e5e5;
  363.         }
  364.         .padding-header {
  365.             padding-top: 75px !important;
  366.         }
  367.         #search_products_form_submit {
  368.             display: none;
  369.         }
  370.     </style>
  371.     <style>
  372.         /* Grille résultats : produits à gauche, accessoires à droite */
  373.         .result-row {
  374.             display: flex;
  375.             gap: 30px;
  376.             align-items: flex-start;
  377.             margin-bottom: 40px;
  378.             clear: both;
  379.         }
  380.         .result-row .col-produits,
  381.         .result-row .col-accessoires {
  382.             flex: 1 1 0;
  383.             min-width: 0;
  384.         }
  385.         .result-row .card {
  386.             width: 100%;
  387.             max-width: 400px;
  388.             height: auto;
  389.             margin-bottom: 20px;
  390.         }
  391.         .result-row .card img.card-img-top {
  392.             width: 100%;
  393.             height: 220px;
  394.             object-fit: contain;
  395.             padding: 15px;
  396.         }
  397.         @media (max-width: 768px) {
  398.             .result-row {
  399.                 flex-direction: column;
  400.             }
  401.         }
  402.         /* ── Mobile et tablette ──
  403.            Ces deux valeurs sont posées plus haut dans ce même fichier et
  404.            l'emportent sur `base.html.twig` : c'est donc ici qu'il faut les
  405.            corriger, pas dans le gabarit parent.
  406.            - `h1` à 32pt (42px) tient sur trois lignes et occupe la moitié de
  407.              l'écran d'un téléphone. 20pt le ramène à deux lignes.
  408.            - `.padding-header` ajoutait 75px de rembourrage blanc à l'intérieur
  409.              du bloc, en plus des marges de `base.html.twig`. C'est la seule des
  410.              trois valeurs qu'on peut réduire : les marges au-dessus laissent
  411.              voir le bandeau photo de fond entre l'en-tête fixe et le bloc blanc,
  412.              les toucher le ferait disparaître. */
  413.         @media screen and (max-width: 1184px) {
  414.             h1 {
  415.                 font-size: 20pt !important;
  416.                 line-height: 1.25;
  417.             }
  418.             .padding-header {
  419.                 /* Marge et rembourrage sont tous deux à l'intérieur du bloc blanc :
  420.                    les réduire ne rogne pas le bandeau photo, qui s'arrête au début
  421.                    de `.contentPage`. */
  422.                 margin-top: 8px !important;
  423.                 padding-top: 16px !important;
  424.             }
  425.         }
  426.     </style>
  427.     <main class="container padding-header">
  428.         <section class="row">
  429.             <div class="col-12 spacerTop">
  430.                 <h1><span class="souligne-title">Bienvenue dans le LORRAIN SELECT </span></h1>
  431.             </div>
  432.             <div class="blocForm">
  433.                 {{ form_start(searchProductsForm, {'attr': {'id': 'search_products_form'}}) }}
  434.                 <div class="mb3">
  435.                     {% set valeursDistinctesColA = [] %}
  436.                     {# Boucle à travers les éléments de l'objet catalogueImports #}
  437.                     {% for element in catalogueImports %}
  438.                         {# Vérifie si la valeur de colA n'est pas déjà dans le tableau des valeurs distinctes #}
  439.                         {% if element.colA not in valeursDistinctesColA and element.colA is not empty %}
  440.                             {# Ajoutez la valeur de colA au tableau des valeurs distinctes #}
  441.                             {% set valeursDistinctesColA = valeursDistinctesColA|merge([element.colA]) %}
  442.                         {% endif %}
  443.                     {% endfor %}
  444.                     <label id="labelA" class="form-label" for="questionA">Quel produit recherchez-vous ?</label>
  445.                     <select id="questionA" name="questionA" class="form-select">
  446.                         <option value="">Choisir une option</option>
  447.                         {% for valeurDistinctesColA in valeursDistinctesColA %}
  448.                             <option {% if questionAValue == valeurDistinctesColA %} selected="selected"{% endif %}
  449.                                     value="{{ valeurDistinctesColA }}">{{ valeurDistinctesColA }}</option>
  450.                         {% endfor %}
  451.                     </select>
  452.                     {% if isAnswerBEnabled is not empty %}
  453.                         {% set valeursDistinctesColB = [] %}
  454.                         {# Boucle à travers les éléments de l'objet catalogueImports #}
  455.                         {% for element in catalogueImports %}
  456.                             {% if isAnswerBEnabled %}
  457.                                 {% if questionAValue == element.colA %}
  458.                                     {# Vérifie si la valeur de colB n'est pas déjà dans le tableau des valeurs distinctes #}
  459.                                     {% if element.colB not in valeursDistinctesColB and element.colB is not empty %}
  460.                                         {# Ajoutez la valeur de colB au tableau des valeurs distinctes #}
  461.                                         {% set valeursDistinctesColB = valeursDistinctesColB|merge([element.colB]) %}
  462.                                     {% endif %}
  463.                                 {% endif %}
  464.                             {% endif %}
  465.                         {% endfor %}
  466.                         {% if valeursDistinctesColB|length > 0 %}
  467.                             <label id="labelB" class="form-label" for="questionB">
  468.                                 {% if questionAValue == "Chalumeau" %}
  469.                                     Quelles actions souhaitez vous réaliser ?
  470.                                 {% else %}
  471.                                     Quelle application souhaitez vous réaliser ?
  472.                                 {% endif %}
  473.                             </label>
  474.                             <select id="questionB" name="questionB" class="form-select">
  475.                                 <option value="">Choisir une option</option>
  476.                                 {% set valeursDistinctesColBTriees = valeursDistinctesColB|sort %}
  477.                                 {% for valeurDistinctesColB in valeursDistinctesColBTriees %}
  478.                                     <option {% if questionBValue == valeurDistinctesColB %} selected="selected"{% endif %}
  479.                                             value="{{ valeurDistinctesColB }}">{{ valeurDistinctesColB }}</option>
  480.                                 {% endfor %}
  481.                             </select>
  482.                         {% endif %}
  483.                     {% endif %}
  484.                     {% if isAnswerCEnabled is not empty %}
  485.                         {% set valeursDistinctesColC = [] %}
  486.                         {# Boucle à travers les éléments de l'objet catalogueImports #}
  487.                         {% for element in catalogueImports %}
  488.                             {% if isAnswerCEnabled %}
  489.                                 {% if questionAValue == element.colA and questionBValue == element.colB %}
  490.                                     {# Vérifie si la valeur de colC n'est pas déjà dans le tableau des valeurs distinctes #}
  491.                                     {% if element.colC not in valeursDistinctesColC and element.colC is not empty %}
  492.                                         {# Ajoutez la valeur de colC au tableau des valeurs distinctes #}
  493.                                         {% set valeursDistinctesColC = valeursDistinctesColC|merge([element.colC]) %}
  494.                                     {% endif %}
  495.                                 {% endif %}
  496.                             {% endif %}
  497.                         {% endfor %}
  498.                         {% if questionAValue != "Chalumeau" or (questionAValue == "Chalumeau" and questionCValue != "-") %}
  499.                             {% if valeursDistinctesColC|length > 0 %}
  500.                                 <label id="labelC" class="form-label" for="questionC">
  501.                                     {% if questionAValue == "Chalumeau" %}
  502.                                         Oxygène de coupe avec robinet ou gâchette ?
  503.                                     {% else %}
  504.                                         Quel est le gaz utilisé ?
  505.                                     {% endif %}
  506.                                 </label>
  507.                                 <select id="questionC" name="questionC" class="form-select">
  508.                                     <option value="">Choisir une option</option>
  509.                                     {% set valeursDistinctesColCTriees = valeursDistinctesColC|sort %}
  510.                                     {% if questionAValue == "Chalumeau" %}
  511.                                         {% set valeursDistinctesColCTriees = valeursDistinctesColC
  512.                                             |map(v => v|replace({',': '.'}))
  513.                                             |map(v => v matches '/^\d+(\.\d+)?$/' ? (v + 0) : v)
  514.                                             |sort
  515.                                             |map(v => v|replace({'.': ','})) %}
  516.                                     {% endif %}
  517.                                     {% for valeurDistinctesColC in valeursDistinctesColCTriees %}
  518.                                         <option {% if questionCValue == valeurDistinctesColC %} selected="selected"{% endif %}
  519.                                                 value="{{ valeurDistinctesColC }}">{{ valeurDistinctesColC }}</option>
  520.                                     {% endfor %}
  521.                                 </select>
  522.                             {% endif %}
  523.                         {% endif %}
  524.                     {% endif %}
  525.                     {% if isAnswerDEnabled is not empty %}
  526.                         {% set valeursDistinctesColD = [] %}
  527.                         {% set catalogueImportsTrie = catalogueImports|sort((a, b) => a.sortD <=> b.sortD) %}
  528.                         {# Boucle à travers les éléments de l'objet catalogueImports #}
  529.                         {% for element in catalogueImportsTrie %}
  530.                             {% if isAnswerDEnabled %}
  531.                                 {% if questionAValue == element.colA and questionBValue == element.colB and (questionCValue == element.colC or questionCValue == "-") %}
  532.                                     {# Vérifie si la valeur de colD n'est pas déjà dans le tableau des valeurs distinctes #}
  533.                                     {% if element.colD not in valeursDistinctesColD and element.colD is not null and element.colD is not empty %}
  534.                                         {# Ajoutez la valeur de colD au tableau des valeurs distinctes #}
  535.                                         {% set valeursDistinctesColD = valeursDistinctesColD|merge([element.colD]) %}
  536.                                     {% endif %}
  537.                                 {% endif %}
  538.                             {% endif %}
  539.                         {% endfor %}
  540.                         {% if valeursDistinctesColD|length > 0 %}
  541.                             <label id="labelD" class="form-label" for="questionD">
  542.                                 {% if questionAValue == "Chalumeau" %}
  543.                                     Quel est le gaz utilisé ?
  544.                                 {% else %}
  545.                                     Quelle pression est utilisée ?
  546.                                 {% endif %}
  547.                             </label>
  548.                             <select id="questionD" name="questionD" class="form-select">
  549.                                 <option value="">Choisir une option</option>
  550.                                 {% set valeursDistinctesColDTriees = valeursDistinctesColD %}
  551.                                 {% for valeurDistinctesColD in valeursDistinctesColDTriees %}
  552.                                     <option {% if questionDValue == valeurDistinctesColD %} selected="selected"{% endif %}
  553.                                             value="{{ valeurDistinctesColD }}">{{ valeurDistinctesColD }}</option>
  554.                                 {% endfor %}
  555.                             </select>
  556.                         {% endif %}
  557.                     {% endif %}
  558.                     {% if isAnswerEEnabled is not empty or (valeursDistinctesColD is defined and valeursDistinctesColD|length < 1) %}
  559.                         {% set valeursDistinctesColE = [] %}
  560.                         {# Boucle à travers les éléments de l'objet catalogueImports #}
  561.                         {% set catalogueImportsTrie = catalogueImports|sort((a, b) => a.sortE <=> b.sortE) %}
  562.                         {% for element in catalogueImportsTrie %}
  563.                             {% if isAnswerEEnabled is not empty or (valeursDistinctesColD is defined and valeursDistinctesColD|length < 1) %}
  564.                                 {% if questionAValue == element.colA
  565.                                     and questionBValue == element.colB
  566.                                     and (questionCValue == element.colC or questionCValue == "-")
  567.                                     and questionDValue == element.colD %}
  568.                                     {# Vérifie si la valeur de colE n'est pas déjà dans le tableau des valeurs distinctes #}
  569.                                     {% if element.colE not in valeursDistinctesColE and element.colE is not empty %}
  570.                                         {# Ajoutez la valeur de colE au tableau des valeurs distinctes #}
  571.                                         {% set valeursDistinctesColE = valeursDistinctesColE|merge([element.colE]) %}
  572.                                     {% endif %}
  573.                                 {% endif %}
  574.                             {% endif %}
  575.                         {% endfor %}
  576.                         {% if valeursDistinctesColE|length > 0 %}
  577.                             <label id="labelE" class="form-label" for="questionE">
  578.                                 {% if questionAValue == "Chalumeau" %}
  579.                                     Quelle épaisseur maximum à souder/chauffer/braser en mm ?
  580.                                 {% else %}
  581.                                     Quel débit est nécessaire ?
  582.                                 {% endif %}
  583.                             </label>
  584.                             <select id="questionE" name="questionE" class="form-select">
  585.                                 <option value="">Choisir une option</option>
  586.                                 {% set valeursDistinctesColETriees = valeursDistinctesColE %}
  587.                                 {% for valeurDistinctesColE in valeursDistinctesColETriees %}
  588.                                     <option {% if questionEValue == valeurDistinctesColE %} selected="selected"{% endif %}
  589.                                             value="{{ valeurDistinctesColE }}">{{ valeurDistinctesColE }}</option>
  590.                                 {% endfor %}
  591.                             </select>
  592.                         {% endif %}
  593.                     {% endif %}
  594.                     {% if (isAnswerFEnabled is not empty) or (valeursDistinctesColE is defined and valeursDistinctesColE|length < 1) %}
  595.                         {% set valeursAvecSortF = [] %}
  596.                         {% set catalogueImportsTrie = catalogueImports|sort((a, b) => a.sortF <=> b.sortF) %}
  597.                         {% for element in catalogueImportsTrie %}
  598.                             {% if isAnswerFEnabled or (valeursDistinctesColE is defined and valeursDistinctesColE|length < 1) %}
  599.                                 {% if questionAValue == element.colA
  600.                                     and questionBValue == element.colB
  601.                                     and (questionCValue == element.colC or questionCValue == "-")
  602.                                     and questionDValue == element.colD
  603.                                     and questionEValue == element.colE %}
  604.                                     {% if element.colF is not empty and not (element.colF in valeursAvecSortF|column(0)) %}
  605.                                         {% set valeursAvecSortF = valeursAvecSortF|merge([[element.colF, element.sortF]]) %}
  606.                                     {% endif %}
  607.                                 {% endif %}
  608.                             {% endif %}
  609.                         {% endfor %}
  610.                         {# Extraire uniquement les colF triés #}
  611.                         {% set valeursDistinctesColF = valeursAvecSortF|map(v => v[0]) %}
  612.                         {% if valeursDistinctesColF|length > 0 %}
  613.                             <label id="labelF" class="form-label" for="questionF">
  614.                                 {% if questionAValue == "Chalumeau" %}
  615.                                     Avec ou sans ARPF (Anti-Retour Pare Flamme) ?
  616.                                 {% else %}
  617.                                     Quelle opération souhaitez-vous réaliser ?
  618.                                 {% endif %}
  619.                             </label>
  620.                             <select id="questionF" name="questionF" class="form-select">
  621.                                 <option value="">Choisir une option</option>
  622.                                 {% for valeurDistinctesColF in valeursDistinctesColF %}
  623.                                     <option {% if questionFValue == valeurDistinctesColF %} selected="selected"{% endif %}
  624.                                             value="{{ valeurDistinctesColF }}">{{ valeurDistinctesColF }}</option>
  625.                                 {% endfor %}
  626.                             </select>
  627.                         {% endif %}
  628.                     {% endif %}
  629.                     {% if isAnswerGEnabled is not empty or (valeursDistinctesColF is defined and valeursDistinctesColF|length < 1) %}
  630.                         {% set valeursDistinctesColG = [] %}
  631.                         {# Boucle à travers les éléments de l'objet catalogueImports #}
  632.                         {% set catalogueImportsTrie = catalogueImports|sort((a, b) => a.sortG <=> b.sortG) %}
  633.                         {% for element in catalogueImportsTrie %}
  634.                             {% if isAnswerGEnabled or (valeursDistinctesColF is defined and valeursDistinctesColF|length < 1) %}
  635.                                 {% if questionAValue == element.colA
  636.                                     and questionBValue == element.colB
  637.                                     and (questionCValue == element.colC or questionCValue == "-")
  638.                                     and questionDValue == element.colD
  639.                                     and questionEValue == element.colE
  640.                                     and (questionFValue == element.colF or questionFValue == "-") %}
  641.                                     {# Vérifie si la valeur de colG n'est pas déjà dans le tableau des valeurs distinctes #}
  642.                                     {% if element.colG not in valeursDistinctesColG and element.colG is not empty %}
  643.                                         {# Ajoutez la valeur de colG au tableau des valeurs distinctes #}
  644.                                         {% set valeursDistinctesColG = valeursDistinctesColG|merge([element.colG]) %}
  645.                                     {% endif %}
  646.                                 {% endif %}
  647.                             {% endif %}
  648.                         {% endfor %}
  649.                         {% if valeursDistinctesColG|length > 0 %}
  650.                             <label id="labelG" class="form-label" for="questionG">
  651.                                 {% if questionAValue == "Chalumeau" %}
  652.                                     Quelle est l'inclinaison du coude en degrés ?
  653.                                 {% else %}
  654.                                     Où souhaitez-vous réaliser votre opération ?
  655.                                 {% endif %}
  656.                             </label>
  657.                             <select id="questionG" name="questionG" class="form-select">
  658.                                 <option value="">Choisir une option</option>
  659.                                 {% set valeursDistinctesColGTriees = valeursDistinctesColG %}
  660.                                 {% for valeurDistinctesColG in valeursDistinctesColGTriees %}
  661.                                     <option {% if questionGValue == valeurDistinctesColG %} selected="selected"{% endif %}
  662.                                             value="{{ valeurDistinctesColG }}">{{ valeurDistinctesColG }}</option>
  663.                                 {% endfor %}
  664.                             </select>
  665.                         {% endif %}
  666.                     {% endif %}
  667.                     {% if isAnswerHEnabled is not empty  %}
  668.                         {% set valeursDistinctesColH = [] %}
  669.                         {# Boucle à travers les éléments de l'objet catalogueImports #}
  670.                         {% set catalogueImportsTrie = catalogueImports|sort((a, b) => a.sortH <=> b.sortH) %}
  671.                         {% for element in catalogueImportsTrie %}
  672.                             {% if isAnswerHEnabled %}
  673.                                 {% if questionAValue == element.colA
  674.                                     and questionBValue == element.colB
  675.                                     and (questionCValue == element.colC or questionCValue == "-")
  676.                                     and questionDValue == element.colD
  677.                                     and questionEValue == element.colE
  678.                                     and (questionFValue == element.colF or questionFValue == "-")
  679.                                     and questionGValue == element.colG %}
  680.                                     {# Vérifie si la valeur de colH n'est pas déjà dans le tableau des valeurs distinctes #}
  681.                                     {% if element.colH not in valeursDistinctesColH and element.colH is not empty %}
  682.                                         {# Ajoutez la valeur de colH au tableau des valeurs distinctes #}
  683.                                         {% set valeursDistinctesColH = valeursDistinctesColH|merge([element.colH]) %}
  684.                                     {% endif %}
  685.                                 {% endif %}
  686.                             {% endif %}
  687.                         {% endfor %}
  688.                         {% if valeursDistinctesColH|length > 0 %}
  689.                             <label id="labelH" class="form-label" for="questionH">
  690.                                 {% if questionAValue == "Chalumeau" %}
  691.                                     Quelle longueur chalumeau en mm ?
  692.                                 {% else %}
  693.                                     Sur quelle installation travaillez-vous ?
  694.                                 {% endif %}
  695.                             </label>
  696.                             <select id="questionH" name="questionH" class="form-select">
  697.                                 <option value="">Choisir une option</option>
  698.                                 {% set valeursDistinctesColHTriees = valeursDistinctesColH %}
  699.                                 {% for valeurDistinctesColH in valeursDistinctesColHTriees %}
  700.                                     <option {% if questionHValue == valeurDistinctesColH %} selected="selected"{% endif %}
  701.                                             value="{{ valeurDistinctesColH }}">{{ valeurDistinctesColH }}</option>
  702.                                 {% endfor %}
  703.                             </select>
  704.                         {% endif %}
  705.                     {% endif %}
  706.                     {% if isAnswerIEnabled is not empty or (questionAValue != "Chalumeau" and valeursDistinctesColH is defined and valeursDistinctesColH|length < 1) %}
  707.                         {% set valeursDistinctesColI = [] %}
  708.                         {# Boucle à travers les éléments de l'objet catalogueImports #}
  709.                         {% for element in catalogueImports %}
  710.                             {% if isAnswerIEnabled or (valeursDistinctesColH is defined and valeursDistinctesColH|length < 1) %}
  711.                                 {% if questionAValue == element.colA
  712.                                     and questionBValue == element.colB
  713.                                     and (questionCValue == element.colC or questionCValue == "-")
  714.                                     and questionDValue == element.colD
  715.                                     and questionEValue == element.colE
  716.                                     and (questionFValue == element.colF or questionFValue == "-")
  717.                                     and questionGValue == element.colG
  718.                                     and questionHValue == element.colH %}
  719.                                     {# Vérifie si la valeur de colI n'est pas déjà dans le tableau des valeurs distinctes #}
  720.                                     {% if element.colI not in valeursDistinctesColI and element.colI is not empty %}
  721.                                         {# Ajoutez la valeur de colI au tableau des valeurs distinctes #}
  722.                                         {% set valeursDistinctesColI = valeursDistinctesColI|merge([element.colI]) %}
  723.                                     {% endif %}
  724.                                 {% endif %}
  725.                             {% endif %}
  726.                         {% endfor %}
  727.                         {% if valeursDistinctesColI|length > 0 %}
  728.                             <label id="labelI" class="form-label" for="questionI">
  729.                                 {% if questionAValue == "Chalumeau" %}
  730.                                     Quelle longueur chalumeau en mm ?
  731.                                 {% else %}
  732.                                     Comment voulez-vous travailler ?
  733.                                 {% endif %}
  734.                             </label>
  735.                             <select id="questionI" name="questionI" class="form-select">
  736.                                 <option value="">Choisir une option</option>
  737.                                 {% set valeursDistinctesColITriees = valeursDistinctesColI|sort %}
  738.                                 {% for valeurDistinctesColI in valeursDistinctesColITriees %}
  739.                                     <option {% if questionIValue == valeurDistinctesColI %} selected="selected"{% endif %}
  740.                                             value="{{ valeurDistinctesColI }}">{{ valeurDistinctesColI }}</option>
  741.                                 {% endfor %}
  742.                             </select>
  743.                         {% endif %}
  744.                     {% endif %}
  745.                     {% if isAnswerJEnabled is not empty or (valeursDistinctesColI is defined and valeursDistinctesColI|length < 1) %}
  746.                         {% set valeursDistinctesColJ = [] %}
  747.                         {# Boucle à travers les éléments de l'objet catalogueImports #}
  748.                         {% for element in catalogueImports %}
  749.                             {% if isAnswerJEnabled or (valeursDistinctesColI is defined and valeursDistinctesColI|length < 1) %}
  750.                                 {% if questionAValue == element.colA
  751.                                     and questionBValue == element.colB
  752.                                     and (questionCValue == element.colC or questionCValue == "-")
  753.                                     and questionDValue == element.colD
  754.                                     and questionEValue == element.colE
  755.                                     and (questionFValue == element.colF or questionFValue == "-")
  756.                                     and questionGValue == element.colG
  757.                                     and (questionIValue == element.colI or questionIValue == "-") %}
  758.                                     {# Vérifie si la valeur de colJ n'est pas déjà dans le tableau des valeurs distinctes #}
  759.                                     {% if element.colJ not in valeursDistinctesColJ and element.colJ is not empty %}
  760.                                         {# Ajoutez la valeur de colJ au tableau des valeurs distinctes #}
  761.                                         {% set valeursDistinctesColJ = valeursDistinctesColJ|merge([element.colJ]) %}
  762.                                     {% endif %}
  763.                                 {% endif %}
  764.                             {% endif %}
  765.                         {% endfor %}
  766.                         {% if valeursDistinctesColJ|length > 0 %}
  767.                             <label id="labelJ" class="form-label" for="questionJ">
  768.                                 {% if questionAValue == "Chalumeau" %}
  769.                                     ACCESSOIRE
  770.                                 {% else %}
  771.                                     Quel raccord de sortie avez-vous besoin ?
  772.                                 {% endif %}
  773.                             </label>
  774.                             <select id="questionJ" name="questionJ" class="form-select">
  775.                                 <option value="">Choisir une option</option>
  776.                                 {% set valeursDistinctesColJTriees = valeursDistinctesColJ|sort %}
  777.                                 {% for valeurDistinctesColJ in valeursDistinctesColJTriees %}
  778.                                     <option {% if questionJValue == valeurDistinctesColJ %} selected="selected"{% endif %}
  779.                                             value="{{ valeurDistinctesColJ }}">{{ valeurDistinctesColJ }}</option>
  780.                                 {% endfor %}
  781.                             </select>
  782.                         {% endif %}
  783.                     {% endif %}
  784.                     {% if isAnswerKEnabled is not empty or (valeursDistinctesColJ is defined and valeursDistinctesColJ|length < 1) %}
  785.                         <input type="hidden" name="lastEmpty" value="empty">
  786.                     {% endif %}
  787.                     {% if isAnswerKEnabled is not empty %}
  788.                         {% set valeursDistinctesColK = [] %}
  789.                         {# Boucle à travers les éléments de l'objet catalogueImports #}
  790.                         {% for element in catalogueImports %}
  791.                             {% if isAnswerKEnabled %}
  792.                                 {% if questionAValue == element.colA
  793.                                     and questionBValue == element.colB
  794.                                     and (questionCValue == element.colC or questionCValue == "-")
  795.                                     and questionDValue == element.colD
  796.                                     and questionEValue == element.colE
  797.                                     and (questionFValue == element.colF or questionFValue == "-")
  798.                                     and questionGValue == element.colG
  799.                                     and questionHValue == element.colH
  800.                                     and (questionIValue == element.colI or questionIValue == "-")
  801.                                     and questionJValue == element.colJ %}
  802.                                     {# Vérifie si la valeur de colK n'est pas déjà dans le tableau des valeurs distinctes #}
  803.                                     {% if element.colK not in valeursDistinctesColK and element.colK is not empty %}
  804.                                         {# Ajoutez la valeur de colK au tableau des valeurs distinctes #}
  805.                                         {% set valeursDistinctesColK = valeursDistinctesColK|merge([element.colK]) %}
  806.                                     {% endif %}
  807.                                 {% endif %}
  808.                             {% endif %}
  809.                         {% endfor %}
  810.                         {% if valeursDistinctesColK|length > 0 %}
  811.                             <label id="labelK" class="form-label" for="questionK">Quel produit recherchez-vous ?</label>
  812.                             <select id="questionK" name="questionK" class="form-select">
  813.                                 <option value="">Choisir une option</option>
  814.                                 {% set valeursDistinctesColKTriees = valeursDistinctesColK|sort %}
  815.                                 {% for valeurDistinctesColK in valeursDistinctesColKTriees %}
  816.                                     <option {% if questionKValue == valeurDistinctesColK %} selected="selected"{% endif %}
  817.                                             value="{{ valeurDistinctesColK }}">{{ valeurDistinctesColK }}</option>
  818.                                 {% endfor %}
  819.                             </select>
  820.                         {% endif %}
  821.                     {% endif %}
  822.                     <input type="hidden" id="productSelected" name="productSelected">
  823.                 </div>
  824.                 {{ form_end(searchProductsForm) }}
  825.             </div>
  826.             <div id="blocProductDetail">
  827.                 {# ---- Retour rapide sur la pertinence de la recommandation ----
  828.                      Affiché seulement s'il y a effectivement quelque chose à juger. #}
  829.                 {% if trackedSearch is defined and trackedSearch is not null
  830.                     and ((products is not null and products is not empty)
  831.                          or (products2 is not null and products2 is not empty)) %}
  832.                     <div id="select-feedback" data-search-id="{{ trackedSearch.id }}">
  833.                         <p class="sf-question">Cette recommandation vous a-t-elle été utile&nbsp;?</p>
  834.                         <div class="sf-buttons">
  835.                             <button type="button" class="sf-btn" data-value="1">
  836.                                 <span aria-hidden="true">👍</span> Oui, elle correspond à mon besoin
  837.                             </button>
  838.                             <button type="button" class="sf-btn" data-value="-1">
  839.                                 <span aria-hidden="true">👎</span> Non, elle ne correspond pas
  840.                             </button>
  841.                         </div>
  842.                         <p class="sf-thanks" hidden>Merci, votre retour est enregistré.</p>
  843.                     </div>
  844.                     <style>
  845.                         #select-feedback {
  846.                             background: #fff; border: 1px solid #e5e5e5; border-radius: 10px;
  847.                             padding: 16px 20px; margin: 0 0 24px; text-align: center;
  848.                         }
  849.                         #select-feedback .sf-question {
  850.                             margin: 0 0 12px; font-weight: 600; color: #0d3b79; font-size: 0.95rem;
  851.                         }
  852.                         #select-feedback .sf-buttons {
  853.                             display: flex; gap: 12px; justify-content: center; flex-wrap: wrap;
  854.                         }
  855.                         #select-feedback .sf-btn {
  856.                             border: 1px solid #006ec8; background: #fff; color: #006ec8;
  857.                             border-radius: 6px; padding: 8px 16px; font-size: 0.88rem;
  858.                             cursor: pointer; transition: background .15s ease, color .15s ease;
  859.                         }
  860.                         #select-feedback .sf-btn:hover { background: #006ec8; color: #fff; }
  861.                         #select-feedback .sf-btn[disabled] { opacity: .45; cursor: default; }
  862.                         #select-feedback .sf-btn.sf-chosen { background: #006ec8; color: #fff; }
  863.                         #select-feedback .sf-thanks {
  864.                             margin: 12px 0 0; font-size: 0.85rem; color: #198754; font-weight: 600;
  865.                         }
  866.                     </style>
  867.                 {% endif %}
  868.                 {% if products is not null and products is not empty %}
  869.                     {% for product in products %}
  870.                         {% if product.slug is not empty %}
  871.                             {# ---- Ligne : produit principal (gauche) + accessoires (droite) ---- #}
  872.                             <div class="result-row">
  873.                                 <div class="col-produits">
  874.                                     <h3>NOTRE RECOMMANDATION</h3>
  875.                                     <article class="card">
  876.                                         {% if product.images|length > 0 %}
  877.                                             <img src="{{ asset('assets/uploads/products/mini/' ~ product.images[0].name) }}"
  878.                                                  class="card-img-top" alt="{{ product.name }}">
  879.                                         {% endif %}
  880.                                         <div class="card-body">
  881.                                             <h2 class="card-title">Référence : {{ product.slug }}</h2>
  882.                                             <h2 class="card-title"><strong>{{ product.name }}</strong></h2>
  883.                                             <div class="letters100"
  884.                                                  style="font-weight:bold; color: grey">{{ product.header|raw }}</div>
  885.                                             <br>
  886.                                             <a href="{{ catalogue_urls[app.request.host]|default(catalogue_default_url) }}/produits/{{ product.slug }}" data-reco-slug="{{ product.slug }}"
  887.                                                class="btn btn-primary" target="_blank">Voir les détails</a>
  888.                                         </div>
  889.                                     </article>
  890.                                 </div>
  891.                                 {% if accessories is not null and accessories is not empty %}
  892.                                     <div class="col-accessoires">
  893.                                         <h3>Accessoire(s) conseillé</h3>
  894.                                         {% for accessoire in accessories %}
  895.                                             {% set found = false %}
  896.                                             {% for paacc in tabProductAccessories %}
  897.                                                 {% set found = false %}
  898.                                                 {% if questionAValue == "Chalumeau" %}
  899.                                                     {% if paacc.colI == product.slug and paacc.colK == accessoire.slug %}
  900.                                                         {% set found = true %}
  901.                                                     {% endif %}
  902.                                                 {% endif %}
  903.                                                 {% if questionAValue == "Chalumeau" %}
  904.                                                     {% if paacc.colI == product.slug and paacc.colN == "" and paacc.colP == accessoire.slug %}
  905.                                                         {% set found = true %}
  906.                                                     {% endif %}
  907.                                                 {% endif %}
  908.                                                 {% if questionAValue != "Chalumeau" %}
  909.                                                     {% if paacc.colK == product.slug and paacc.colM == accessoire.slug %}
  910.                                                         {% set found = true %}
  911.                                                     {% endif %}
  912.                                                 {% endif %}
  913.                                             {% endfor %}
  914.                                             {% if found %}
  915.                                                 <article class="card">
  916.                                                     {% if accessoire.images|length > 0 %}
  917.                                                         <img src="{{ asset('assets/uploads/products/mini/' ~ accessoire.images[0].name) }}"
  918.                                                              class="card-img-top" alt="{{ accessoire.name }}">
  919.                                                     {% endif %}
  920.                                                     <div class="card-body">
  921.                                                         <h2 class="card-title">Référence : {{ accessoire.slug }}</h2>
  922.                                                         <h2 class="card-title"><strong>Catégorie : {{ accessoire.title|raw }}</strong></h2>
  923.                                                         {% if accessoire.subTitle is not null %}
  924.                                                             <h2 class="card-title"><strong>{{ accessoire.subTitle }}</strong></h2>
  925.                                                         {% endif %}
  926.                                                         <a href="{{ catalogue_urls[app.request.host]|default(catalogue_default_url) }}/produits/{{ accessoire.slug }}" data-reco-slug="{{ accessoire.slug }}"
  927.                                                            class="btn btn-primary" target="_blank">Voir les détails</a>
  928.                                                     </div>
  929.                                                 </article>
  930.                                             {% endif %}
  931.                                         {% endfor %}
  932.                                     </div>
  933.                                 {% endif %}
  934.                             </div>
  935.                             {# ---- Lignes : produits similaires (gauche) + accessoires (droite) ---- #}
  936.                             {% if products2 is not null and products2 is not empty %}
  937.                                 {% for product2 in products2 %}
  938.                                     {% if product2.slug is not empty %}
  939.                                         {% set found = false %}
  940.                                         {% for pa2 in tabProductsProducts2 %}
  941.                                             {% if questionAValue == "Chalumeau" %}
  942.                                                 {% if pa2.colI == product.slug %}
  943.                                                     {% set found = true %}
  944.                                                 {% endif %}
  945.                                             {% endif %}
  946.                                             {% if questionAValue != "Chalumeau" %}
  947.                                                 {% if pa2.colK == product.slug %}
  948.                                                     {% set found = true %}
  949.                                                 {% endif %}
  950.                                             {% endif %}
  951.                                         {% endfor %}
  952.                                         {% if found %}
  953.                                             <div class="result-row">
  954.                                                 <div class="col-produits">
  955.                                                     <h3>PRODUIT SIMILAIRE</h3>
  956.                                                     <article class="card">
  957.                                                         {% if product2.images|length > 0 %}
  958.                                                             <img src="{{ asset('assets/uploads/products/mini/' ~ product2.images[0].name) }}"
  959.                                                                  class="card-img-top" alt="{{ product2.name }}">
  960.                                                         {% endif %}
  961.                                                         <div class="card-body">
  962.                                                             <h2 class="card-title">Référence : {{ product2.slug }}</h2>
  963.                                                             <h2 class="card-title"><strong>{{ product2.name }}</strong></h2>
  964.                                                             <div class="letters100"
  965.                                                                  style="font-weight:bold; color: grey">{{ product2.header|raw }}</div>
  966.                                                             <br>
  967.                                                             <a href="{{ catalogue_urls[app.request.host]|default(catalogue_default_url) }}/produits/{{ product2.slug }}" data-reco-slug="{{ product2.slug }}"
  968.                                                                class="btn btn-primary" target="_blank">Voir les détails</a>
  969.                                                         </div>
  970.                                                     </article>
  971.                                                 </div>
  972.                                                 {% if accessories is not null and accessories is not empty %}
  973.                                                     <div class="col-accessoires">
  974.                                                         <h3>Accessoire(s) conseillé</h3>
  975.                                                         {% for accessoire in accessories %}
  976.                                                             {% set found = false %}
  977.                                                             {% for paacc in tabProductAccessories %}
  978.                                                                 {% if questionAValue == "Chalumeau" %}
  979.                                                                     {% if paacc.colN == product2.slug and paacc.colP == accessoire.slug %}
  980.                                                                         {% set found = true %}
  981.                                                                     {% endif %}
  982.                                                                 {% endif %}
  983.                                                                 {% if questionAValue != "Chalumeau" %}
  984.                                                                     {% if paacc.colL == product2.slug and paacc.colN == accessoire.slug %}
  985.                                                                         {% set found = true %}
  986.                                                                     {% endif %}
  987.                                                                 {% endif %}
  988.                                                             {% endfor %}
  989.                                                             {% if found %}
  990.                                                                 <article class="card">
  991.                                                                     {% if accessoire.images|length > 0 %}
  992.                                                                         <img src="{{ asset('assets/uploads/products/mini/' ~ accessoire.images[0].name) }}"
  993.                                                                              class="card-img-top" alt="{{ accessoire.name }}">
  994.                                                                     {% endif %}
  995.                                                                     <div class="card-body">
  996.                                                                         <h2 class="card-title">Référence : {{ accessoire.slug }}</h2>
  997.                                                                         <h2 class="card-title"><strong>Catégorie : {{ accessoire.title|raw }}</strong></h2>
  998.                                                                         {% if accessoire.subTitle is not null %}
  999.                                                                             <h2 class="card-title"><strong>{{ accessoire.subTitle }}</strong></h2>
  1000.                                                                         {% endif %}
  1001.                                                                         <a href="{{ catalogue_urls[app.request.host]|default(catalogue_default_url) }}/produits/{{ accessoire.slug }}" data-reco-slug="{{ accessoire.slug }}"
  1002.                                                                            class="btn btn-primary" target="_blank">Voir les détails</a>
  1003.                                                                     </div>
  1004.                                                                 </article>
  1005.                                                             {% endif %}
  1006.                                                         {% endfor %}
  1007.                                                     </div>
  1008.                                                 {% endif %}
  1009.                                             </div>
  1010.                                         {% endif %}
  1011.                                     {% endif %}
  1012.                                 {% endfor %}
  1013.                             {% endif %}
  1014.                         {% endif %}
  1015.                     {% endfor %}
  1016.                 {% endif %}
  1017.             </div>
  1018.         </section>
  1019.     </main>
  1020.     <script>
  1021.         // Empêche le navigateur de restaurer un scroll au rechargement
  1022.         if ('scrollRestoration' in history) {
  1023.             history.scrollRestoration = 'manual';
  1024.         }
  1025.         document.addEventListener("DOMContentLoaded", function () {
  1026.             const form = document.getElementById('search_products_form');
  1027.             const selects = Array.from(form.querySelectorAll('.form-select'));
  1028.             // Re-soumission du formulaire à chaque changement de combobox.
  1029.             //
  1030.             // Les listes sont imbriquées : le contenu de chacune dépend des réponses
  1031.             // précédentes. Revenir en arrière et changer une réponse sans rien faire
  1032.             // d'autre reposterait les réponses suivantes, devenues incohérentes —
  1033.             // `MainController::index()` les accepte telles quelles, puisqu'il se
  1034.             // contente de tester `if ($request->get('questionX'))`.
  1035.             //
  1036.             // On remet donc à vide toutes les listes situées après celle qui vient de
  1037.             // changer, avant de poster. Une valeur vide est falsy côté PHP : les étapes
  1038.             // correspondantes sont simplement désactivées, et le questionnaire reprend
  1039.             // à partir du point modifié.
  1040.             selects.forEach((select, index) => {
  1041.                 select.addEventListener('change', function () {
  1042.                     for (let i = index + 1; i < selects.length; i++) {
  1043.                         selects[i].value = '';
  1044.                     }
  1045.                     form.submit();
  1046.                 });
  1047.             });
  1048.             // Au (re)chargement : centrer la page sur le dernier combobox affiché
  1049.             if (selects.length > 0) {
  1050.                 const dernier = selects[selects.length - 1];
  1051.                 dernier.scrollIntoView({ block: 'center' });
  1052.             }
  1053.         });
  1054.         document.addEventListener("DOMContentLoaded", () => {
  1055.             const paragraphs = document.querySelectorAll("div.letters100");
  1056.             paragraphs.forEach((paragraph) => {
  1057.                 const originalContent = paragraph.innerHTML;
  1058.                 const textContent = paragraph.textContent.trim();
  1059.                 if (textContent.length > 100) {
  1060.                     let visibleLength = 0;
  1061.                     let truncatedHTML = "";
  1062.                     function truncateNodes(nodes) {
  1063.                         nodes.forEach((node) => {
  1064.                             if (visibleLength >= 100) return;
  1065.                             if (node.nodeType === Node.TEXT_NODE) {
  1066.                                 const remainingLength = 100 - visibleLength;
  1067.                                 if (node.textContent.length > remainingLength) {
  1068.                                     truncatedHTML += node.textContent.slice(0, remainingLength);
  1069.                                     visibleLength = 100;
  1070.                                 } else {
  1071.                                     truncatedHTML += node.textContent;
  1072.                                     visibleLength += node.textContent.length;
  1073.                                 }
  1074.                             } else if (node.nodeType === Node.ELEMENT_NODE) {
  1075.                                 const outerHTMLStart = `<${node.nodeName.toLowerCase()}${[...node.attributes]
  1076.                                     .map((attr) => ` ${attr.name}="${attr.value}"`)
  1077.                                     .join("")}>`;
  1078.                                 truncatedHTML += outerHTMLStart;
  1079.                                 truncateNodes([...node.childNodes]);
  1080.                                 if (visibleLength < 100 || node.innerHTML.trim() === "") {
  1081.                                     truncatedHTML += `</${node.nodeName.toLowerCase()}>`;
  1082.                                 }
  1083.                             }
  1084.                         });
  1085.                     }
  1086.                     truncateNodes([...paragraph.childNodes]);
  1087.                     truncatedHTML += "[...]";
  1088.                     paragraph.innerHTML = truncatedHTML;
  1089.                 }
  1090.             });
  1091.         });
  1092.         document.addEventListener("DOMContentLoaded", () => {
  1093.             const paragraphs = document.querySelectorAll("div.letters200");
  1094.             paragraphs.forEach((paragraph) => {
  1095.                 const originalContent = paragraph.innerHTML;
  1096.                 const textContent = paragraph.textContent.trim();
  1097.                 if (textContent.length > 200) {
  1098.                     let visibleLength = 0;
  1099.                     let truncatedHTML = "";
  1100.                     function truncateNodes(nodes) {
  1101.                         nodes.forEach((node) => {
  1102.                             if (visibleLength >= 200) return;
  1103.                             if (node.nodeType === Node.TEXT_NODE) {
  1104.                                 const remainingLength = 200 - visibleLength;
  1105.                                 if (node.textContent.length > remainingLength) {
  1106.                                     truncatedHTML += node.textContent.slice(0, remainingLength);
  1107.                                     visibleLength = 200;
  1108.                                 } else {
  1109.                                     truncatedHTML += node.textContent;
  1110.                                     visibleLength += node.textContent.length;
  1111.                                 }
  1112.                             } else if (node.nodeType === Node.ELEMENT_NODE) {
  1113.                                 const outerHTMLStart = `<${node.nodeName.toLowerCase()}${[...node.attributes]
  1114.                                     .map((attr) => ` ${attr.name}="${attr.value}"`)
  1115.                                     .join("")}>`;
  1116.                                 truncatedHTML += outerHTMLStart;
  1117.                                 truncateNodes([...node.childNodes]);
  1118.                                 if (visibleLength < 200 || node.innerHTML.trim() === "") {
  1119.                                     truncatedHTML += `</${node.nodeName.toLowerCase()}>`;
  1120.                                 }
  1121.                             }
  1122.                         });
  1123.                     }
  1124.                     truncateNodes([...paragraph.childNodes]);
  1125.                     truncatedHTML += "[...]";
  1126.                     paragraph.innerHTML = truncatedHTML;
  1127.                 }
  1128.             });
  1129.         });
  1130.     </script>
  1131.     {# ---- Indicateurs SELECT : avis et clics « Voir les détails » ---- #}
  1132.     {% if trackedSearch is defined and trackedSearch is not null and recoBySlug is not empty %}
  1133.         <script>
  1134.             (function () {
  1135.                 // Correspondance slug produit -> identifiant de recommandation
  1136.                 var recoBySlug = {{ recoBySlug|json_encode|raw }};
  1137.                 // Avis sur la pertinence
  1138.                 var box = document.getElementById('select-feedback');
  1139.                 if (box) {
  1140.                     var searchId = box.dataset.searchId;
  1141.                     var thanks = box.querySelector('.sf-thanks');
  1142.                     box.querySelectorAll('.sf-btn').forEach(function (btn) {
  1143.                         btn.addEventListener('click', function () {
  1144.                             var value = parseInt(btn.dataset.value, 10);
  1145.                             fetch('{{ path('select_feedback', {id: 'PLACEHOLDER'}) }}'.replace('PLACEHOLDER', searchId), {
  1146.                                 method: 'POST',
  1147.                                 headers: {'Content-Type': 'application/json'},
  1148.                                 body: JSON.stringify({feedback: value})
  1149.                             }).then(function (r) {
  1150.                                 return r.ok ? r.json() : Promise.reject(r);
  1151.                             }).then(function () {
  1152.                                 box.querySelectorAll('.sf-btn').forEach(function (b) { b.disabled = true; });
  1153.                                 btn.classList.add('sf-chosen');
  1154.                                 if (thanks) { thanks.hidden = false; }
  1155.                             }).catch(function () {
  1156.                                 if (thanks) {
  1157.                                     thanks.textContent = 'Votre retour n\'a pas pu être enregistré.';
  1158.                                     thanks.style.color = '#dc3545';
  1159.                                     thanks.hidden = false;
  1160.                                 }
  1161.                             });
  1162.                         });
  1163.                     });
  1164.                 }
  1165.                 // Clics « Voir les détails » : sendBeacon pour ne pas retarder la navigation
  1166.                 document.querySelectorAll('a[data-reco-slug]').forEach(function (link) {
  1167.                     link.addEventListener('click', function () {
  1168.                         var id = recoBySlug[link.dataset.recoSlug];
  1169.                         if (!id || !navigator.sendBeacon) { return; }
  1170.                         navigator.sendBeacon(
  1171.                             '{{ path('select_detail_click', {id: 'PLACEHOLDER'}) }}'.replace('PLACEHOLDER', id)
  1172.                         );
  1173.                     });
  1174.                 });
  1175.             })();
  1176.         </script>
  1177.     {% endif %}
  1178. {% endblock %}