{% extends 'base.html.twig' %}
{% block body %}
<style>
body {
background-color: #0d3b79 !important;
font-family: "Montserrat", sans-serif;
font-size: 15px;
background-image: url("/assets/images/general-background.jpg");
background-repeat: no-repeat;
background-position: top center;
background-size: 100%;
}
.headerTop {
color: #FFF;
width: 100%;
height: 34px;
background-color: #161d3f;
font-family: "Montserrat", sans-serif;
}
.headerTopContent {
width: 100%;
margin-left: auto;
margin-right: auto;
padding-left: 100px;
padding-right: 100px;
}
.headerTopContent DIV {
padding-top: 5px;
float: left;
}
.headerTopContent IMG {
margin-top: -3px;
}
.headerBottom {
color: #FFF;
width: 100%;
height: 98px;
font-size: 15px !important;
background-color: rgba(0, 60, 140, 0.6);
/* Fond transparent */
}
.headerBottomContent {
padding-top: 10px;
width: 100%;
margin-left: auto;
margin-right: auto;
padding-left: 100px;
padding-right: 100px;
font-family: "Lato", sans-serif;
text-transform: uppercase;
}
a {
text-decoration: none !important;
}
#footer-copyright {
color: #003c8c !important;
}
main {
min-height: 80vh !important;
}
footer {
background: #ecf0f1;
padding-bottom: 2em;
padding-top: 2em;
display: block;
}
.contentPage {
background-color: #FFF;
color: #0d3b79;
width: 98%;
margin-left: auto;
margin-right: auto;
margin-top: 175px;
}
.texteBleu A {
color: #78c8e6 !important;
}
.texteBlanc A {
color: #FFFFFF !important;
}
.navbar-light .navbar-nav .nav-link {
color: #78c8e6;
}
.nav-item a {
color: #78c8e6;
}
.souligne-title::after {
content: "";
position: relative;
bottom: 0px;
left: 0px;
width: 80px;
/* Longueur de la barre bleue */
height: 6px;
/* Épaisseur de la barre bleue */
background-color: #006ec8;
/* Couleur de la barre bleue */
display: block;
}
.souligne::after {
content: "";
position: relative;
top: 32px;
width: 70px;
/* Longueur de la barre bleue */
height: 4px;
/* Épaisseur de la barre bleue */
background-color: #006ec8;
/* Couleur de la barre bleue */
display: block;
}
.souligne, .souligne-tile {
margin-bottom: 10px;
}
h1 {
font-family: "Montserrat", sans-serif;
font-size: 32pt !important;
font-weight: bold;
color: #FFF;
}
h2 {
font-family: "Montserrat", sans-serif;
font-size: 22pt;
font-weight: normal;
color: #003c8c;
}
h3 {
color: #FFF;
}
label {
color: #FFF;
}
.contact-container {
color: #FFF;
}
.contact-container label {
color: #003c8c !important;
}
.info-sav {
font-family: "Montserrat", sans-serif;
font-size: 22pt;
color: #FFF;
}
.blocContact {
padding: 10px;
background-color: #FFF;
color: #0c2352;
}
.blocContact input {
background-color: #FFF;
!important;
border-radius: 0px !important;
border: solid 1px #e5e5e5 !important;
}
.blocContact label {
font-weight: normal;
}
.blocFormHeader {
text-align: left !important;
padding-left: 40px;
padding-right: 40px;
}
.logo-reseaux {
margin-left: 15px;
}
.btnContact, .btnFormBlue {
margin-top: 10px;
background-color: #006ec8 !important;
border-radius: 30px !important;
border: 0px !important;
margin: 5px;
}
.navbar-default {
margin-top: 55px;
background-color: transparent;
border-color: transparent;
}
.page {
margin-top: 175px;
background-color: rgba(239, 239, 239, 0.5);
padding: 15px;
width: 80%;
}
.center {
text-align: center;
margin-left: auto;
margin-right: auto;
}
.body-container {
flex: 1;
min-height: 600px;
}
.container-min {
margin-left: auto;
margin-right: auto;
padding-left: 15px;
padding-right: 15px;
}
.contact-container {
color: #FFF;
background-color: #153065;
padding-top: 15px;
}
.contact-container label {
color: #003c8c !important;
}
.info-sav {
font-family: "Montserrat", sans-serif;
font-size: 22pt;
color: #FFF;
}
.blocForm {
padding: 35px;
width: 100%;
max-width: 1024px;
margin-left: auto;
margin-right: auto;
background-color: #FFF;
}
.blocForm input, .blocForm textarea, .blocForm select {
background-color: #e2f3fa !important;
border-radius: 30px !important;
border: 0px !important;
color: #003c8c !important;
}
.blocContact {
padding: 10px;
background-color: #FFF;
color: #0c2352;
}
.blocContact input {
background-color: #FFF;
!important;
border-radius: 0px !important;
border: solid 1px #e5e5e5 !important;
}
.blocContact label {
font-weight: normal;
}
.blocFormHeader {
text-align: left !important;
padding-left: 40px;
padding-right: 40px;
}
.logo-reseaux {
margin-left: 15px;
}
.btnContact, .btnFormBlue {
margin-top: 10px;
background-color: #006ec8 !important;
border-radius: 30px !important;
border: 0px !important;
margin: 5px;
}
</style>
<style>
body {
font-family: Varela, sans-serif;
color: #2b4b78;
}
.container {
padding-right: 85px;
padding-left: 85px;
}
h1 {
font-family: "Montserrat", sans-serif;
font-size: 44pt;
font-weight: bold;
color: #003c8c;
}
h2 {
font-family: "Montserrat", sans-serif;
font-size: 20pt;
font-weight: normal !important;
color: #003c8c;
}
h3 {
color: #003c8c;
}
label {
font-family: "Montserrat", sans-serif;
color: #003c8c;
font-size: 14pt;
font-weight: bold;
}
#search_products_form_submit {
background-color: #003c8c;
}
.headerTxt {
font-size: 18pt;
font-family: "Montserrat", sans-serif;
color: #003c8c;
}
.mainReference {
font-family: "Montserrat", sans-serif;
background-color: #003c8c;
color: #FFF;
padding: 5px;
font-size: 22pt;
}
.spacerTop {
margin-top: 15px
}
.options {
font-family: "Montserrat", sans-serif;
font-size: 13pt;
color: #003c8c;
font-weight: bold;
border-bottom: solid 1px #78c8e6;
}
.collapsible {
background-color: #FFF;
font-family: "Montserrat", sans-serif;
font-size: 13pt;
color: #003c8c;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
}
.activeCollapsible, .collapsible:hover {
font-weight: bolder;
}
.collapsible:after {
content: '\002B';
color: #003c8c;
font-weight: bold;
float: right;
margin-left: 5px;
}
.activeCollapsible:after {
content: "\2212";
}
.content {
padding: 0 18px;
max-height: 0;
overflow: hidden;
transition: max-height 0.2s ease-out;
}
.productTable {
font-family: "Montserrat", sans-serif;
font-size: 12pt;
color: #505050;
background-color: #FFF;
border-spacing: 2px;
border-collapse: separate;
}
.productTable TH {
background-color: #e5e5e5;
text-align: center;
padding: 3px;
font-weight: bold;
}
.productTable TD {
margin: 2px;
text-align: center;
border-bottom: solid 1px #e5e5e5;
}
.productTable TR {
border-bottom: solid 1px #e5e5e5;
}
.padding-header {
padding-top: 75px !important;
}
#search_products_form_submit {
display: none;
}
</style>
<style>
/* Grille résultats : produits à gauche, accessoires à droite */
.result-row {
display: flex;
gap: 30px;
align-items: flex-start;
margin-bottom: 40px;
clear: both;
}
.result-row .col-produits,
.result-row .col-accessoires {
flex: 1 1 0;
min-width: 0;
}
.result-row .card {
width: 100%;
max-width: 400px;
height: auto;
margin-bottom: 20px;
}
.result-row .card img.card-img-top {
width: 100%;
height: 220px;
object-fit: contain;
padding: 15px;
}
@media (max-width: 768px) {
.result-row {
flex-direction: column;
}
}
/* ── Mobile et tablette ──
Ces deux valeurs sont posées plus haut dans ce même fichier et
l'emportent sur `base.html.twig` : c'est donc ici qu'il faut les
corriger, pas dans le gabarit parent.
- `h1` à 32pt (42px) tient sur trois lignes et occupe la moitié de
l'écran d'un téléphone. 20pt le ramène à deux lignes.
- `.padding-header` ajoutait 75px de rembourrage blanc à l'intérieur
du bloc, en plus des marges de `base.html.twig`. C'est la seule des
trois valeurs qu'on peut réduire : les marges au-dessus laissent
voir le bandeau photo de fond entre l'en-tête fixe et le bloc blanc,
les toucher le ferait disparaître. */
@media screen and (max-width: 1184px) {
h1 {
font-size: 20pt !important;
line-height: 1.25;
}
.padding-header {
/* Marge et rembourrage sont tous deux à l'intérieur du bloc blanc :
les réduire ne rogne pas le bandeau photo, qui s'arrête au début
de `.contentPage`. */
margin-top: 8px !important;
padding-top: 16px !important;
}
}
</style>
<main class="container padding-header">
<section class="row">
<div class="col-12 spacerTop">
<h1><span class="souligne-title">Bienvenue dans le LORRAIN SELECT </span></h1>
</div>
<div class="blocForm">
{{ form_start(searchProductsForm, {'attr': {'id': 'search_products_form'}}) }}
<div class="mb3">
{% set valeursDistinctesColA = [] %}
{# Boucle à travers les éléments de l'objet catalogueImports #}
{% for element in catalogueImports %}
{# Vérifie si la valeur de colA n'est pas déjà dans le tableau des valeurs distinctes #}
{% if element.colA not in valeursDistinctesColA and element.colA is not empty %}
{# Ajoutez la valeur de colA au tableau des valeurs distinctes #}
{% set valeursDistinctesColA = valeursDistinctesColA|merge([element.colA]) %}
{% endif %}
{% endfor %}
<label id="labelA" class="form-label" for="questionA">Quel produit recherchez-vous ?</label>
<select id="questionA" name="questionA" class="form-select">
<option value="">Choisir une option</option>
{% for valeurDistinctesColA in valeursDistinctesColA %}
<option {% if questionAValue == valeurDistinctesColA %} selected="selected"{% endif %}
value="{{ valeurDistinctesColA }}">{{ valeurDistinctesColA }}</option>
{% endfor %}
</select>
{% if isAnswerBEnabled is not empty %}
{% set valeursDistinctesColB = [] %}
{# Boucle à travers les éléments de l'objet catalogueImports #}
{% for element in catalogueImports %}
{% if isAnswerBEnabled %}
{% if questionAValue == element.colA %}
{# Vérifie si la valeur de colB n'est pas déjà dans le tableau des valeurs distinctes #}
{% if element.colB not in valeursDistinctesColB and element.colB is not empty %}
{# Ajoutez la valeur de colB au tableau des valeurs distinctes #}
{% set valeursDistinctesColB = valeursDistinctesColB|merge([element.colB]) %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{% if valeursDistinctesColB|length > 0 %}
<label id="labelB" class="form-label" for="questionB">
{% if questionAValue == "Chalumeau" %}
Quelles actions souhaitez vous réaliser ?
{% else %}
Quelle application souhaitez vous réaliser ?
{% endif %}
</label>
<select id="questionB" name="questionB" class="form-select">
<option value="">Choisir une option</option>
{% set valeursDistinctesColBTriees = valeursDistinctesColB|sort %}
{% for valeurDistinctesColB in valeursDistinctesColBTriees %}
<option {% if questionBValue == valeurDistinctesColB %} selected="selected"{% endif %}
value="{{ valeurDistinctesColB }}">{{ valeurDistinctesColB }}</option>
{% endfor %}
</select>
{% endif %}
{% endif %}
{% if isAnswerCEnabled is not empty %}
{% set valeursDistinctesColC = [] %}
{# Boucle à travers les éléments de l'objet catalogueImports #}
{% for element in catalogueImports %}
{% if isAnswerCEnabled %}
{% if questionAValue == element.colA and questionBValue == element.colB %}
{# Vérifie si la valeur de colC n'est pas déjà dans le tableau des valeurs distinctes #}
{% if element.colC not in valeursDistinctesColC and element.colC is not empty %}
{# Ajoutez la valeur de colC au tableau des valeurs distinctes #}
{% set valeursDistinctesColC = valeursDistinctesColC|merge([element.colC]) %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{% if questionAValue != "Chalumeau" or (questionAValue == "Chalumeau" and questionCValue != "-") %}
{% if valeursDistinctesColC|length > 0 %}
<label id="labelC" class="form-label" for="questionC">
{% if questionAValue == "Chalumeau" %}
Oxygène de coupe avec robinet ou gâchette ?
{% else %}
Quel est le gaz utilisé ?
{% endif %}
</label>
<select id="questionC" name="questionC" class="form-select">
<option value="">Choisir une option</option>
{% set valeursDistinctesColCTriees = valeursDistinctesColC|sort %}
{% if questionAValue == "Chalumeau" %}
{% set valeursDistinctesColCTriees = valeursDistinctesColC
|map(v => v|replace({',': '.'}))
|map(v => v matches '/^\d+(\.\d+)?$/' ? (v + 0) : v)
|sort
|map(v => v|replace({'.': ','})) %}
{% endif %}
{% for valeurDistinctesColC in valeursDistinctesColCTriees %}
<option {% if questionCValue == valeurDistinctesColC %} selected="selected"{% endif %}
value="{{ valeurDistinctesColC }}">{{ valeurDistinctesColC }}</option>
{% endfor %}
</select>
{% endif %}
{% endif %}
{% endif %}
{% if isAnswerDEnabled is not empty %}
{% set valeursDistinctesColD = [] %}
{% set catalogueImportsTrie = catalogueImports|sort((a, b) => a.sortD <=> b.sortD) %}
{# Boucle à travers les éléments de l'objet catalogueImports #}
{% for element in catalogueImportsTrie %}
{% if isAnswerDEnabled %}
{% if questionAValue == element.colA and questionBValue == element.colB and (questionCValue == element.colC or questionCValue == "-") %}
{# Vérifie si la valeur de colD n'est pas déjà dans le tableau des valeurs distinctes #}
{% if element.colD not in valeursDistinctesColD and element.colD is not null and element.colD is not empty %}
{# Ajoutez la valeur de colD au tableau des valeurs distinctes #}
{% set valeursDistinctesColD = valeursDistinctesColD|merge([element.colD]) %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{% if valeursDistinctesColD|length > 0 %}
<label id="labelD" class="form-label" for="questionD">
{% if questionAValue == "Chalumeau" %}
Quel est le gaz utilisé ?
{% else %}
Quelle pression est utilisée ?
{% endif %}
</label>
<select id="questionD" name="questionD" class="form-select">
<option value="">Choisir une option</option>
{% set valeursDistinctesColDTriees = valeursDistinctesColD %}
{% for valeurDistinctesColD in valeursDistinctesColDTriees %}
<option {% if questionDValue == valeurDistinctesColD %} selected="selected"{% endif %}
value="{{ valeurDistinctesColD }}">{{ valeurDistinctesColD }}</option>
{% endfor %}
</select>
{% endif %}
{% endif %}
{% if isAnswerEEnabled is not empty or (valeursDistinctesColD is defined and valeursDistinctesColD|length < 1) %}
{% set valeursDistinctesColE = [] %}
{# Boucle à travers les éléments de l'objet catalogueImports #}
{% set catalogueImportsTrie = catalogueImports|sort((a, b) => a.sortE <=> b.sortE) %}
{% for element in catalogueImportsTrie %}
{% if isAnswerEEnabled is not empty or (valeursDistinctesColD is defined and valeursDistinctesColD|length < 1) %}
{% if questionAValue == element.colA
and questionBValue == element.colB
and (questionCValue == element.colC or questionCValue == "-")
and questionDValue == element.colD %}
{# Vérifie si la valeur de colE n'est pas déjà dans le tableau des valeurs distinctes #}
{% if element.colE not in valeursDistinctesColE and element.colE is not empty %}
{# Ajoutez la valeur de colE au tableau des valeurs distinctes #}
{% set valeursDistinctesColE = valeursDistinctesColE|merge([element.colE]) %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{% if valeursDistinctesColE|length > 0 %}
<label id="labelE" class="form-label" for="questionE">
{% if questionAValue == "Chalumeau" %}
Quelle épaisseur maximum à souder/chauffer/braser en mm ?
{% else %}
Quel débit est nécessaire ?
{% endif %}
</label>
<select id="questionE" name="questionE" class="form-select">
<option value="">Choisir une option</option>
{% set valeursDistinctesColETriees = valeursDistinctesColE %}
{% for valeurDistinctesColE in valeursDistinctesColETriees %}
<option {% if questionEValue == valeurDistinctesColE %} selected="selected"{% endif %}
value="{{ valeurDistinctesColE }}">{{ valeurDistinctesColE }}</option>
{% endfor %}
</select>
{% endif %}
{% endif %}
{% if (isAnswerFEnabled is not empty) or (valeursDistinctesColE is defined and valeursDistinctesColE|length < 1) %}
{% set valeursAvecSortF = [] %}
{% set catalogueImportsTrie = catalogueImports|sort((a, b) => a.sortF <=> b.sortF) %}
{% for element in catalogueImportsTrie %}
{% if isAnswerFEnabled or (valeursDistinctesColE is defined and valeursDistinctesColE|length < 1) %}
{% if questionAValue == element.colA
and questionBValue == element.colB
and (questionCValue == element.colC or questionCValue == "-")
and questionDValue == element.colD
and questionEValue == element.colE %}
{% if element.colF is not empty and not (element.colF in valeursAvecSortF|column(0)) %}
{% set valeursAvecSortF = valeursAvecSortF|merge([[element.colF, element.sortF]]) %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{# Extraire uniquement les colF triés #}
{% set valeursDistinctesColF = valeursAvecSortF|map(v => v[0]) %}
{% if valeursDistinctesColF|length > 0 %}
<label id="labelF" class="form-label" for="questionF">
{% if questionAValue == "Chalumeau" %}
Avec ou sans ARPF (Anti-Retour Pare Flamme) ?
{% else %}
Quelle opération souhaitez-vous réaliser ?
{% endif %}
</label>
<select id="questionF" name="questionF" class="form-select">
<option value="">Choisir une option</option>
{% for valeurDistinctesColF in valeursDistinctesColF %}
<option {% if questionFValue == valeurDistinctesColF %} selected="selected"{% endif %}
value="{{ valeurDistinctesColF }}">{{ valeurDistinctesColF }}</option>
{% endfor %}
</select>
{% endif %}
{% endif %}
{% if isAnswerGEnabled is not empty or (valeursDistinctesColF is defined and valeursDistinctesColF|length < 1) %}
{% set valeursDistinctesColG = [] %}
{# Boucle à travers les éléments de l'objet catalogueImports #}
{% set catalogueImportsTrie = catalogueImports|sort((a, b) => a.sortG <=> b.sortG) %}
{% for element in catalogueImportsTrie %}
{% if isAnswerGEnabled or (valeursDistinctesColF is defined and valeursDistinctesColF|length < 1) %}
{% if questionAValue == element.colA
and questionBValue == element.colB
and (questionCValue == element.colC or questionCValue == "-")
and questionDValue == element.colD
and questionEValue == element.colE
and (questionFValue == element.colF or questionFValue == "-") %}
{# Vérifie si la valeur de colG n'est pas déjà dans le tableau des valeurs distinctes #}
{% if element.colG not in valeursDistinctesColG and element.colG is not empty %}
{# Ajoutez la valeur de colG au tableau des valeurs distinctes #}
{% set valeursDistinctesColG = valeursDistinctesColG|merge([element.colG]) %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{% if valeursDistinctesColG|length > 0 %}
<label id="labelG" class="form-label" for="questionG">
{% if questionAValue == "Chalumeau" %}
Quelle est l'inclinaison du coude en degrés ?
{% else %}
Où souhaitez-vous réaliser votre opération ?
{% endif %}
</label>
<select id="questionG" name="questionG" class="form-select">
<option value="">Choisir une option</option>
{% set valeursDistinctesColGTriees = valeursDistinctesColG %}
{% for valeurDistinctesColG in valeursDistinctesColGTriees %}
<option {% if questionGValue == valeurDistinctesColG %} selected="selected"{% endif %}
value="{{ valeurDistinctesColG }}">{{ valeurDistinctesColG }}</option>
{% endfor %}
</select>
{% endif %}
{% endif %}
{% if isAnswerHEnabled is not empty %}
{% set valeursDistinctesColH = [] %}
{# Boucle à travers les éléments de l'objet catalogueImports #}
{% set catalogueImportsTrie = catalogueImports|sort((a, b) => a.sortH <=> b.sortH) %}
{% for element in catalogueImportsTrie %}
{% if isAnswerHEnabled %}
{% if questionAValue == element.colA
and questionBValue == element.colB
and (questionCValue == element.colC or questionCValue == "-")
and questionDValue == element.colD
and questionEValue == element.colE
and (questionFValue == element.colF or questionFValue == "-")
and questionGValue == element.colG %}
{# Vérifie si la valeur de colH n'est pas déjà dans le tableau des valeurs distinctes #}
{% if element.colH not in valeursDistinctesColH and element.colH is not empty %}
{# Ajoutez la valeur de colH au tableau des valeurs distinctes #}
{% set valeursDistinctesColH = valeursDistinctesColH|merge([element.colH]) %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{% if valeursDistinctesColH|length > 0 %}
<label id="labelH" class="form-label" for="questionH">
{% if questionAValue == "Chalumeau" %}
Quelle longueur chalumeau en mm ?
{% else %}
Sur quelle installation travaillez-vous ?
{% endif %}
</label>
<select id="questionH" name="questionH" class="form-select">
<option value="">Choisir une option</option>
{% set valeursDistinctesColHTriees = valeursDistinctesColH %}
{% for valeurDistinctesColH in valeursDistinctesColHTriees %}
<option {% if questionHValue == valeurDistinctesColH %} selected="selected"{% endif %}
value="{{ valeurDistinctesColH }}">{{ valeurDistinctesColH }}</option>
{% endfor %}
</select>
{% endif %}
{% endif %}
{% if isAnswerIEnabled is not empty or (questionAValue != "Chalumeau" and valeursDistinctesColH is defined and valeursDistinctesColH|length < 1) %}
{% set valeursDistinctesColI = [] %}
{# Boucle à travers les éléments de l'objet catalogueImports #}
{% for element in catalogueImports %}
{% if isAnswerIEnabled or (valeursDistinctesColH is defined and valeursDistinctesColH|length < 1) %}
{% if questionAValue == element.colA
and questionBValue == element.colB
and (questionCValue == element.colC or questionCValue == "-")
and questionDValue == element.colD
and questionEValue == element.colE
and (questionFValue == element.colF or questionFValue == "-")
and questionGValue == element.colG
and questionHValue == element.colH %}
{# Vérifie si la valeur de colI n'est pas déjà dans le tableau des valeurs distinctes #}
{% if element.colI not in valeursDistinctesColI and element.colI is not empty %}
{# Ajoutez la valeur de colI au tableau des valeurs distinctes #}
{% set valeursDistinctesColI = valeursDistinctesColI|merge([element.colI]) %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{% if valeursDistinctesColI|length > 0 %}
<label id="labelI" class="form-label" for="questionI">
{% if questionAValue == "Chalumeau" %}
Quelle longueur chalumeau en mm ?
{% else %}
Comment voulez-vous travailler ?
{% endif %}
</label>
<select id="questionI" name="questionI" class="form-select">
<option value="">Choisir une option</option>
{% set valeursDistinctesColITriees = valeursDistinctesColI|sort %}
{% for valeurDistinctesColI in valeursDistinctesColITriees %}
<option {% if questionIValue == valeurDistinctesColI %} selected="selected"{% endif %}
value="{{ valeurDistinctesColI }}">{{ valeurDistinctesColI }}</option>
{% endfor %}
</select>
{% endif %}
{% endif %}
{% if isAnswerJEnabled is not empty or (valeursDistinctesColI is defined and valeursDistinctesColI|length < 1) %}
{% set valeursDistinctesColJ = [] %}
{# Boucle à travers les éléments de l'objet catalogueImports #}
{% for element in catalogueImports %}
{% if isAnswerJEnabled or (valeursDistinctesColI is defined and valeursDistinctesColI|length < 1) %}
{% if questionAValue == element.colA
and questionBValue == element.colB
and (questionCValue == element.colC or questionCValue == "-")
and questionDValue == element.colD
and questionEValue == element.colE
and (questionFValue == element.colF or questionFValue == "-")
and questionGValue == element.colG
and (questionIValue == element.colI or questionIValue == "-") %}
{# Vérifie si la valeur de colJ n'est pas déjà dans le tableau des valeurs distinctes #}
{% if element.colJ not in valeursDistinctesColJ and element.colJ is not empty %}
{# Ajoutez la valeur de colJ au tableau des valeurs distinctes #}
{% set valeursDistinctesColJ = valeursDistinctesColJ|merge([element.colJ]) %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{% if valeursDistinctesColJ|length > 0 %}
<label id="labelJ" class="form-label" for="questionJ">
{% if questionAValue == "Chalumeau" %}
ACCESSOIRE
{% else %}
Quel raccord de sortie avez-vous besoin ?
{% endif %}
</label>
<select id="questionJ" name="questionJ" class="form-select">
<option value="">Choisir une option</option>
{% set valeursDistinctesColJTriees = valeursDistinctesColJ|sort %}
{% for valeurDistinctesColJ in valeursDistinctesColJTriees %}
<option {% if questionJValue == valeurDistinctesColJ %} selected="selected"{% endif %}
value="{{ valeurDistinctesColJ }}">{{ valeurDistinctesColJ }}</option>
{% endfor %}
</select>
{% endif %}
{% endif %}
{% if isAnswerKEnabled is not empty or (valeursDistinctesColJ is defined and valeursDistinctesColJ|length < 1) %}
<input type="hidden" name="lastEmpty" value="empty">
{% endif %}
{% if isAnswerKEnabled is not empty %}
{% set valeursDistinctesColK = [] %}
{# Boucle à travers les éléments de l'objet catalogueImports #}
{% for element in catalogueImports %}
{% if isAnswerKEnabled %}
{% if questionAValue == element.colA
and questionBValue == element.colB
and (questionCValue == element.colC or questionCValue == "-")
and questionDValue == element.colD
and questionEValue == element.colE
and (questionFValue == element.colF or questionFValue == "-")
and questionGValue == element.colG
and questionHValue == element.colH
and (questionIValue == element.colI or questionIValue == "-")
and questionJValue == element.colJ %}
{# Vérifie si la valeur de colK n'est pas déjà dans le tableau des valeurs distinctes #}
{% if element.colK not in valeursDistinctesColK and element.colK is not empty %}
{# Ajoutez la valeur de colK au tableau des valeurs distinctes #}
{% set valeursDistinctesColK = valeursDistinctesColK|merge([element.colK]) %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{% if valeursDistinctesColK|length > 0 %}
<label id="labelK" class="form-label" for="questionK">Quel produit recherchez-vous ?</label>
<select id="questionK" name="questionK" class="form-select">
<option value="">Choisir une option</option>
{% set valeursDistinctesColKTriees = valeursDistinctesColK|sort %}
{% for valeurDistinctesColK in valeursDistinctesColKTriees %}
<option {% if questionKValue == valeurDistinctesColK %} selected="selected"{% endif %}
value="{{ valeurDistinctesColK }}">{{ valeurDistinctesColK }}</option>
{% endfor %}
</select>
{% endif %}
{% endif %}
<input type="hidden" id="productSelected" name="productSelected">
</div>
{{ form_end(searchProductsForm) }}
</div>
<div id="blocProductDetail">
{# ---- Retour rapide sur la pertinence de la recommandation ----
Affiché seulement s'il y a effectivement quelque chose à juger. #}
{% if trackedSearch is defined and trackedSearch is not null
and ((products is not null and products is not empty)
or (products2 is not null and products2 is not empty)) %}
<div id="select-feedback" data-search-id="{{ trackedSearch.id }}">
<p class="sf-question">Cette recommandation vous a-t-elle été utile ?</p>
<div class="sf-buttons">
<button type="button" class="sf-btn" data-value="1">
<span aria-hidden="true">👍</span> Oui, elle correspond à mon besoin
</button>
<button type="button" class="sf-btn" data-value="-1">
<span aria-hidden="true">👎</span> Non, elle ne correspond pas
</button>
</div>
<p class="sf-thanks" hidden>Merci, votre retour est enregistré.</p>
</div>
<style>
#select-feedback {
background: #fff; border: 1px solid #e5e5e5; border-radius: 10px;
padding: 16px 20px; margin: 0 0 24px; text-align: center;
}
#select-feedback .sf-question {
margin: 0 0 12px; font-weight: 600; color: #0d3b79; font-size: 0.95rem;
}
#select-feedback .sf-buttons {
display: flex; gap: 12px; justify-content: center; flex-wrap: wrap;
}
#select-feedback .sf-btn {
border: 1px solid #006ec8; background: #fff; color: #006ec8;
border-radius: 6px; padding: 8px 16px; font-size: 0.88rem;
cursor: pointer; transition: background .15s ease, color .15s ease;
}
#select-feedback .sf-btn:hover { background: #006ec8; color: #fff; }
#select-feedback .sf-btn[disabled] { opacity: .45; cursor: default; }
#select-feedback .sf-btn.sf-chosen { background: #006ec8; color: #fff; }
#select-feedback .sf-thanks {
margin: 12px 0 0; font-size: 0.85rem; color: #198754; font-weight: 600;
}
</style>
{% endif %}
{% if products is not null and products is not empty %}
{% for product in products %}
{% if product.slug is not empty %}
{# ---- Ligne : produit principal (gauche) + accessoires (droite) ---- #}
<div class="result-row">
<div class="col-produits">
<h3>NOTRE RECOMMANDATION</h3>
<article class="card">
{% if product.images|length > 0 %}
<img src="{{ asset('assets/uploads/products/mini/' ~ product.images[0].name) }}"
class="card-img-top" alt="{{ product.name }}">
{% endif %}
<div class="card-body">
<h2 class="card-title">Référence : {{ product.slug }}</h2>
<h2 class="card-title"><strong>{{ product.name }}</strong></h2>
<div class="letters100"
style="font-weight:bold; color: grey">{{ product.header|raw }}</div>
<br>
<a href="{{ catalogue_urls[app.request.host]|default(catalogue_default_url) }}/produits/{{ product.slug }}" data-reco-slug="{{ product.slug }}"
class="btn btn-primary" target="_blank">Voir les détails</a>
</div>
</article>
</div>
{% if accessories is not null and accessories is not empty %}
<div class="col-accessoires">
<h3>Accessoire(s) conseillé</h3>
{% for accessoire in accessories %}
{% set found = false %}
{% for paacc in tabProductAccessories %}
{% set found = false %}
{% if questionAValue == "Chalumeau" %}
{% if paacc.colI == product.slug and paacc.colK == accessoire.slug %}
{% set found = true %}
{% endif %}
{% endif %}
{% if questionAValue == "Chalumeau" %}
{% if paacc.colI == product.slug and paacc.colN == "" and paacc.colP == accessoire.slug %}
{% set found = true %}
{% endif %}
{% endif %}
{% if questionAValue != "Chalumeau" %}
{% if paacc.colK == product.slug and paacc.colM == accessoire.slug %}
{% set found = true %}
{% endif %}
{% endif %}
{% endfor %}
{% if found %}
<article class="card">
{% if accessoire.images|length > 0 %}
<img src="{{ asset('assets/uploads/products/mini/' ~ accessoire.images[0].name) }}"
class="card-img-top" alt="{{ accessoire.name }}">
{% endif %}
<div class="card-body">
<h2 class="card-title">Référence : {{ accessoire.slug }}</h2>
<h2 class="card-title"><strong>Catégorie : {{ accessoire.title|raw }}</strong></h2>
{% if accessoire.subTitle is not null %}
<h2 class="card-title"><strong>{{ accessoire.subTitle }}</strong></h2>
{% endif %}
<a href="{{ catalogue_urls[app.request.host]|default(catalogue_default_url) }}/produits/{{ accessoire.slug }}" data-reco-slug="{{ accessoire.slug }}"
class="btn btn-primary" target="_blank">Voir les détails</a>
</div>
</article>
{% endif %}
{% endfor %}
</div>
{% endif %}
</div>
{# ---- Lignes : produits similaires (gauche) + accessoires (droite) ---- #}
{% if products2 is not null and products2 is not empty %}
{% for product2 in products2 %}
{% if product2.slug is not empty %}
{% set found = false %}
{% for pa2 in tabProductsProducts2 %}
{% if questionAValue == "Chalumeau" %}
{% if pa2.colI == product.slug %}
{% set found = true %}
{% endif %}
{% endif %}
{% if questionAValue != "Chalumeau" %}
{% if pa2.colK == product.slug %}
{% set found = true %}
{% endif %}
{% endif %}
{% endfor %}
{% if found %}
<div class="result-row">
<div class="col-produits">
<h3>PRODUIT SIMILAIRE</h3>
<article class="card">
{% if product2.images|length > 0 %}
<img src="{{ asset('assets/uploads/products/mini/' ~ product2.images[0].name) }}"
class="card-img-top" alt="{{ product2.name }}">
{% endif %}
<div class="card-body">
<h2 class="card-title">Référence : {{ product2.slug }}</h2>
<h2 class="card-title"><strong>{{ product2.name }}</strong></h2>
<div class="letters100"
style="font-weight:bold; color: grey">{{ product2.header|raw }}</div>
<br>
<a href="{{ catalogue_urls[app.request.host]|default(catalogue_default_url) }}/produits/{{ product2.slug }}" data-reco-slug="{{ product2.slug }}"
class="btn btn-primary" target="_blank">Voir les détails</a>
</div>
</article>
</div>
{% if accessories is not null and accessories is not empty %}
<div class="col-accessoires">
<h3>Accessoire(s) conseillé</h3>
{% for accessoire in accessories %}
{% set found = false %}
{% for paacc in tabProductAccessories %}
{% if questionAValue == "Chalumeau" %}
{% if paacc.colN == product2.slug and paacc.colP == accessoire.slug %}
{% set found = true %}
{% endif %}
{% endif %}
{% if questionAValue != "Chalumeau" %}
{% if paacc.colL == product2.slug and paacc.colN == accessoire.slug %}
{% set found = true %}
{% endif %}
{% endif %}
{% endfor %}
{% if found %}
<article class="card">
{% if accessoire.images|length > 0 %}
<img src="{{ asset('assets/uploads/products/mini/' ~ accessoire.images[0].name) }}"
class="card-img-top" alt="{{ accessoire.name }}">
{% endif %}
<div class="card-body">
<h2 class="card-title">Référence : {{ accessoire.slug }}</h2>
<h2 class="card-title"><strong>Catégorie : {{ accessoire.title|raw }}</strong></h2>
{% if accessoire.subTitle is not null %}
<h2 class="card-title"><strong>{{ accessoire.subTitle }}</strong></h2>
{% endif %}
<a href="{{ catalogue_urls[app.request.host]|default(catalogue_default_url) }}/produits/{{ accessoire.slug }}" data-reco-slug="{{ accessoire.slug }}"
class="btn btn-primary" target="_blank">Voir les détails</a>
</div>
</article>
{% endif %}
{% endfor %}
</div>
{% endif %}
</div>
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
</div>
</section>
</main>
<script>
// Empêche le navigateur de restaurer un scroll au rechargement
if ('scrollRestoration' in history) {
history.scrollRestoration = 'manual';
}
document.addEventListener("DOMContentLoaded", function () {
const form = document.getElementById('search_products_form');
const selects = Array.from(form.querySelectorAll('.form-select'));
// Re-soumission du formulaire à chaque changement de combobox.
//
// Les listes sont imbriquées : le contenu de chacune dépend des réponses
// précédentes. Revenir en arrière et changer une réponse sans rien faire
// d'autre reposterait les réponses suivantes, devenues incohérentes —
// `MainController::index()` les accepte telles quelles, puisqu'il se
// contente de tester `if ($request->get('questionX'))`.
//
// On remet donc à vide toutes les listes situées après celle qui vient de
// changer, avant de poster. Une valeur vide est falsy côté PHP : les étapes
// correspondantes sont simplement désactivées, et le questionnaire reprend
// à partir du point modifié.
selects.forEach((select, index) => {
select.addEventListener('change', function () {
for (let i = index + 1; i < selects.length; i++) {
selects[i].value = '';
}
form.submit();
});
});
// Au (re)chargement : centrer la page sur le dernier combobox affiché
if (selects.length > 0) {
const dernier = selects[selects.length - 1];
dernier.scrollIntoView({ block: 'center' });
}
});
document.addEventListener("DOMContentLoaded", () => {
const paragraphs = document.querySelectorAll("div.letters100");
paragraphs.forEach((paragraph) => {
const originalContent = paragraph.innerHTML;
const textContent = paragraph.textContent.trim();
if (textContent.length > 100) {
let visibleLength = 0;
let truncatedHTML = "";
function truncateNodes(nodes) {
nodes.forEach((node) => {
if (visibleLength >= 100) return;
if (node.nodeType === Node.TEXT_NODE) {
const remainingLength = 100 - visibleLength;
if (node.textContent.length > remainingLength) {
truncatedHTML += node.textContent.slice(0, remainingLength);
visibleLength = 100;
} else {
truncatedHTML += node.textContent;
visibleLength += node.textContent.length;
}
} else if (node.nodeType === Node.ELEMENT_NODE) {
const outerHTMLStart = `<${node.nodeName.toLowerCase()}${[...node.attributes]
.map((attr) => ` ${attr.name}="${attr.value}"`)
.join("")}>`;
truncatedHTML += outerHTMLStart;
truncateNodes([...node.childNodes]);
if (visibleLength < 100 || node.innerHTML.trim() === "") {
truncatedHTML += `</${node.nodeName.toLowerCase()}>`;
}
}
});
}
truncateNodes([...paragraph.childNodes]);
truncatedHTML += "[...]";
paragraph.innerHTML = truncatedHTML;
}
});
});
document.addEventListener("DOMContentLoaded", () => {
const paragraphs = document.querySelectorAll("div.letters200");
paragraphs.forEach((paragraph) => {
const originalContent = paragraph.innerHTML;
const textContent = paragraph.textContent.trim();
if (textContent.length > 200) {
let visibleLength = 0;
let truncatedHTML = "";
function truncateNodes(nodes) {
nodes.forEach((node) => {
if (visibleLength >= 200) return;
if (node.nodeType === Node.TEXT_NODE) {
const remainingLength = 200 - visibleLength;
if (node.textContent.length > remainingLength) {
truncatedHTML += node.textContent.slice(0, remainingLength);
visibleLength = 200;
} else {
truncatedHTML += node.textContent;
visibleLength += node.textContent.length;
}
} else if (node.nodeType === Node.ELEMENT_NODE) {
const outerHTMLStart = `<${node.nodeName.toLowerCase()}${[...node.attributes]
.map((attr) => ` ${attr.name}="${attr.value}"`)
.join("")}>`;
truncatedHTML += outerHTMLStart;
truncateNodes([...node.childNodes]);
if (visibleLength < 200 || node.innerHTML.trim() === "") {
truncatedHTML += `</${node.nodeName.toLowerCase()}>`;
}
}
});
}
truncateNodes([...paragraph.childNodes]);
truncatedHTML += "[...]";
paragraph.innerHTML = truncatedHTML;
}
});
});
</script>
{# ---- Indicateurs SELECT : avis et clics « Voir les détails » ---- #}
{% if trackedSearch is defined and trackedSearch is not null and recoBySlug is not empty %}
<script>
(function () {
// Correspondance slug produit -> identifiant de recommandation
var recoBySlug = {{ recoBySlug|json_encode|raw }};
// Avis sur la pertinence
var box = document.getElementById('select-feedback');
if (box) {
var searchId = box.dataset.searchId;
var thanks = box.querySelector('.sf-thanks');
box.querySelectorAll('.sf-btn').forEach(function (btn) {
btn.addEventListener('click', function () {
var value = parseInt(btn.dataset.value, 10);
fetch('{{ path('select_feedback', {id: 'PLACEHOLDER'}) }}'.replace('PLACEHOLDER', searchId), {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({feedback: value})
}).then(function (r) {
return r.ok ? r.json() : Promise.reject(r);
}).then(function () {
box.querySelectorAll('.sf-btn').forEach(function (b) { b.disabled = true; });
btn.classList.add('sf-chosen');
if (thanks) { thanks.hidden = false; }
}).catch(function () {
if (thanks) {
thanks.textContent = 'Votre retour n\'a pas pu être enregistré.';
thanks.style.color = '#dc3545';
thanks.hidden = false;
}
});
});
});
}
// Clics « Voir les détails » : sendBeacon pour ne pas retarder la navigation
document.querySelectorAll('a[data-reco-slug]').forEach(function (link) {
link.addEventListener('click', function () {
var id = recoBySlug[link.dataset.recoSlug];
if (!id || !navigator.sendBeacon) { return; }
navigator.sendBeacon(
'{{ path('select_detail_click', {id: 'PLACEHOLDER'}) }}'.replace('PLACEHOLDER', id)
);
});
});
})();
</script>
{% endif %}
{% endblock %}