{% extends 'FrontBundle/layout_shop.html.twig' %}
{% block title %}{{ app_sitename }} - {{ product.nameLocale(app.request.locale) }}{% endblock %}
{% block description %}{{ product.descriptionLocale(app.request.locale)|replace({'\r\n': ' '})|raw }}{% endblock %}
{% block google %}
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=AW-11336737773">
</script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'AW-11336737773');
</script>
{% endblock %}
{% block extra_class %}stack{% endblock %}
{# {% block menu_min %}200{% endblock %} #}
{# {% block menu_max %}2636{% endblock %} #}
{% block stylesheets %}
<link href="/front/css/owl.carousel.min.css" rel="stylesheet">
<link href="/front/css/owl.theme.default.min.css" rel="stylesheet">
<link href="/front/css/nouislider.css" rel="stylesheet">
<style>
.option-content{
border-radius: 14px;
background: #931517;
display: flex;
justify-content: center;
align-items: center;
width: 119px;
height: 19px;
flex-shrink: 0;
margin: 1.5rem auto 0.5rem auto;
color: #fff;
padding: 0.5rem 1rem;
font-size: 13px;
font-weight: 600;
}
.page_boutique-produit #product .options .col-md-6 li
{
background-color: #FFFFFF;
border-radius: 15px;
padding: 5px;
margin: 12px;
width: calc(25% - -59px);
float: left;
position: relative;
height: 74px;
border: 1px solid #FFFFFF;
}
.page_boutique-produit #product .options ul{
padding: 0;
}
.page_boutique-produit #product .options .title span.sub {
width: 100%;
display: inline-block;
font-size: 11px;
}
.page_boutique-produit #product .options .price{
margin: 3px 0 0 0 ;
}
.bon-cadeau-17 .bon-cadeau-option-block1,
.bon-cadeau-18 .bon-cadeau-option-block1,
.bon-cadeau-19 .bon-cadeau-option-block1,
.bon-cadeau-20 .bon-cadeau-option-block1,
.bon-cadeau-6 .bon-cadeau-option-block1,
.bon-cadeau-7 .bon-cadeau-option-block1,
.bon-cadeau-8 .bon-cadeau-option-block1,
.bon-cadeau-9 .bon-cadeau-option-block1 {
display: none;
}
.btn-primary.active,
.btn-primary:hover {
color: #ffffff;
text-decoration: none;
border: 1px solid var(--red);
background-color: var(--red);
}
</style>
{% endblock %}
{% block body %}
<section id="product" class="espace-content full mb-5 pb-5" style="margin-top: 60px;" data-id="{{ product.id }}">
<div class="content pt-5 pb-5 mt-5" style="padding: 0 150px">
<div class="row">
<a href="{{ path('framework_front_shop_cat', {'category_slug': product.category.slug, 'locale': app.request.locale}) }}" class="link-back mb-4"><img src="/front/img/button-arrow-r-l.svg" alt="back" width="25px" class="me-2" />{{ 'shop_product_back'|tr(tr)|raw }} {{ product.category.nameLocale(app.request.locale)|lower }}</a>
<div class="col-md-12">
<ul class="breadcrumb">
<li><a href="/{{app.request.locale }}/{{ 'boutique'|getUrl(app.request.locale) }}">{{ 'shop_title'|tr(tr)|raw }}</a></li>
<li><a href="/{{app.request.locale }}/{{ 'boutique'|getUrl(app.request.locale) }}/articles/{{ product.category.slug }}">{{ product.category.nameLocale(app.request.locale) }}</a></li>
<li><span>{{ product.nameLocale(app.request.locale) }}</span></li>
</ul>
<a href="#" class="favoris trigger-modal {{ (is_granted('IS_AUTHENTICATED_REMEMBERED')) ? 'bookmark' : 'not-logged-in' }} {{ (saved) ? 'saved' : '' }}" data-id="{{ product.id }}"><i></i></a>
</div>
<div class="col-md-5">
<div class="owl-carousel product mt-5">
{% for image in product.allImages %}
<div class="item"><img src="/uploads/products/{{product.id}}/{{image}}" alt="product" /></div>
{% endfor %}
</div>
<div class="row ">
<div class="col-9 mx-auto">
{% if product.published %}
<a href="#" class="btn-sm btn-primary active add-cart mb-3" data-type="bons" data-id="{{ product.id }}"><img src="/front/img/cart.svg" alt="cart" class="me-2" /> {{ 'shop_product_cart_add'|tr(tr)|raw }}</a>
<a href="/{{app.request.locale}}/boutique/panier" class="btn-sm btn-primary text w-100 text-center">{{ 'shop_product_cart_view'|tr(tr)|raw }}</a>
{% else %}
<h6 class="text-center">{{ 'shop_nostock'|tr(tr)|raw }}</h6>
{% endif %}
</div>
</div>
</div>
<div class="col-md-7 description mt-5 pt-0">
<div class="row">
<div class="col-12"><h1 class="title" style="letter-spacing: initial;">{{ product.nameLocale(app.request.locale) }}</h1></div>
<div class="col-12 to-cart mt-3 mb-3">
<p class="price mt-2 me-4" data-price="{{ product.price }}"><i>{{ product.priceFr }}</i> €</p>
<p class="qty me-4"><i class="qty-bons-before">{{ 'shop_product_for'|tr(tr)|raw }}</i><a href="#" data-action="minus">-</a><span>1</span><a href="#" data-action="plus">+</a><i class="qty-bons-after">{{ 'shop_product_for1'|tr(tr)|raw }}</i></p>
<p class="per-person p-0">{% if product.category.slug == 'bon-cadeau' %}<span>{{ 'shop_product_price'|tr(tr)|raw }}</span>{% endif %}</p>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="desc mb-3">
{# <label>Description :</label> #}
<p>{{ product.descriptionLocale(app.request.locale)|replace({'\r\n': '<br>'})|raw }}</p>
</div>
<div class="additional mb-3">
{{ product.additionalLocale(app.request.locale)|raw }}
</div>
<div class="usecase">
<p class="mb-2">{{ (product.slug == 'bon-cadeau-34') ? '' : 'shop_product_use'|tr(tr)|raw }} {{ product.usecaseLocale(app.request.locale) }}</p>
<p class="mb-5 text-xs">{{ 'shop_product_use2'|tr(tr)|raw }}</p>
</div>
{# <div class="info mt-5 mb-5">
<label>Informations complémentaires :</label>
<p>{{ product.additionalLocale(app.request.locale)|replace({'\r\n': '<br>'})|raw }}</p>
</div> #}
<div id="bloc2" class="row mb-5"></div>
{% if product.category.slug == 'bon-cadeau' %}
<div class="options {{ product.slug }}">
<label>{{ 'shop_product_options_title'|tr(tr)|raw }}</label>
<div class="row">
<div class="col-md-6 bon-cadeau-option-block1">
<span class="option-content">
Restaurant
</span>
<ul class="mt-3">
{% for option in options %}
{% if option.restaurant == true %}
<li class="option-{{option.id}}" style="height: 85px">
{% if option.desc != '' %}<span class="infos" data-desc="{{ option.desc }}" title="{{ option.desc }}">i</span>{% endif %}
<p class="title">{{ option.name }}<br>{% if option.sub != '' %} <span class="sub">{{ option.sub }}</span> {% endif %}</p>
<p class="price" {% if not option.lounge and option.id < 3 %}style="margin: 5px 0 5px 0 !important;"{% endif %} {% if option.price == 64 %} style="margin: 13px 0 5px 0 !important;"{% endif %}>(+ {{ option.price }} €)</p>
<p class="qty" data-price="{{ option.price }}" data-id="{{ option.id }}"><a href="#" data-action="minus">-</a><span>0</span><a href="#" data-action="plus">+</a></p>
</li>
{% endif %}
{% endfor %}
</ul>
</div>
<div class="col-md-6 bon-cadeau-option-block3">
<span class="option-content">
{{ 'cadeau_title'|tr(tr)|raw }}
</span>
<ul class="mt-3">
{% for option in options %}
{% if option.boutique == true %}
<li class="option-{{option.id}}">
{% if option.desc != '' %}<span class="infos" data-desc="{{ option.desc }}" title="{{ option.desc }}">i</span>{% endif %}
<p class="title">{{ option.name }}<br>{% if option.lounge %}<span>Lounge Club</span>{% endif %}</p>
<p class="price" {% if not option.lounge and option.id < 3 %}style="margin-top: 10px;"{% endif %}>(+ {{ option.price }} €)</p>
<p class="qty" data-price="{{ option.price }}" data-id="{{ option.id }}"><a href="#" data-action="minus">-</a><span>0</span><a href="#" data-action="plus">+</a></p>
</li>
{% endif %}
{% endfor %}
</ul>
</div>
</div>
<div class="row">
<div class="col-md-6 bon-cadeau-option-block2">
<span class="option-content">
Lounge Club
</span>
<ul class="mt-3">
{% for option in options %}
{% if option.lounge == true %}
<li class="option-{{option.id}}">
{% if option.desc != '' %}<span class="infos" data-desc="{{ option.desc }}" title="{{ option.desc }}">i</span>{% endif %}
<p class="title">{{ option.name }}<br>{% if option.lounge %}<span>Lounge Club</span>{% endif %}</p>
<p class="price" {% if not option.lounge and option.id < 3 %}style="margin-top: 10px;"{% endif %}>(+ {{ option.price }} €)</p>
<p class="qty" data-price="{{ option.price }}" data-id="{{ option.id }}"><a href="#" data-action="minus">-</a><span>0</span><a href="#" data-action="plus">+</a></p>
</li>
{% endif %}
{% endfor %}
</ul>
</div>
</div>
</div>
{% endif %}
</div>
</div>
<div class="floating-cart"><img src="/front/img/cart.svg" alt="cart" /></div>
</div>
</div>
</div>
</section>
<section id="similar" class="espace-content full mb-5 pb-5" style="margin-top: 40px;">
<div class="content">
<h2 class="pt-5 mb-3 no-bar">{{ 'shop_product_similar_title'|tr(tr)|upper|raw }}<span class="full-bar"></span></h2>
</div>
</section>
<section class="items-slider espace-content p-0 mt-5 mb-5">
<div class="content pt-5 pb-5 mt-5">
<div class="owl-carousel related p-0">
{% for item in similar %}
{% if item.id > 31 and item.published %}
<div class="item row">
<div class="col-12 ">
<a href="/{{app.request.locale}}/{{ 'boutique'|getUrl(app.request.locale) }}/produit/{{ item.slug }}">
<img alt="slug" class="cover" src="/uploads/products/{{item.id}}/{{ item.mainImage }}" />
</a>
<a href="/{{app.request.locale}}/{{ 'boutique'|getUrl(app.request.locale) }}/produit/{{ item.slug }}">
<span class="name">{{ item.nameLocale(app.request.locale) }}</span>
<span class="price">{{ item.priceFr }} €</span>
</a>
<a href="/{{app.request.locale}}/{{ 'boutique'|getUrl(app.request.locale) }}/produit/{{ item.slug }}">
<span class="category">{{ item.category.nameLocale(app.request.locale) }}</span>
</a>
</div>
</div>
{% endif %}
{% endfor %}
</div>
<div class="horizontal-bar-container">
<div class="horizontal-bar"></div>
<div class="horizontal-bar-ctrl"></div>
</div>
</div>
</section>
<section class="actu-content newsletter" style="margin-bottom: 180px;">
<div class="content mt-5 pt-5">
<h2 class="mb-5 no-bar">{{ 'newsletter_title'|tr(tr)|upper|raw }}<span class="full-bar"></span></h2>
<div class="pt-5">
<form>
<p class="title">{{ 'newsletter_subtitle'|tr(tr)|raw }}</p>
<p class="desc">{{ 'newsletter_desc'|tr(tr)|raw }}</p>
<div class="email-input">
<input type="text" value="" placeholder="{{ 'newsletter_email'|tr(tr)|raw }}" class="email mt-3" />
<a href="#" class="register"> </a>
</div>
<div class="row">
<div class="col-12 mt-4">
<input type="checkbox" id="confirm" class="apple-switch" checked="checked" />
<label for="confirm">{{ 'newsletter_agree'|tr(tr)|raw }}</label>
<p class="text-center mt-4" id="message_newsletter"></p>
</div>
</div>
</form>
</div>
</div>
</section>
{% include ('FrontBundle/Partial/modal.html.twig') %}
{% include 'FrontBundle/Partial/footer.html.twig' %}
{% endblock %}
{% block javascripts %}
<script src="/front/js/owl.carousel.min.js"></script>
<script type="text/javascript">
function updatePrice(){
console.log('updateprice')
var product_price = parseFloat($('#product .price').data('price'));
var qty = parseInt($('.to-cart span').text());
var options_prices = 0;
var option_qty_save = 0;
var price = 0;
$('#product .options li .qty').each(function(index, value) {
var option_price = parseFloat($(this).data('price'));
var option_qty = parseInt($(this).find('span').text());
if(option_qty > 0){
options_prices = options_prices + (option_price * option_qty);
option_qty_save = option_qty
}
}).promise().done( function(){
// price = (product_price + options_prices) * qty;
price = (product_price * qty) + options_prices; //NOUVEAU CALCUL
$('#product .price i').text(price.toFixed(2).replace( '.', ',' ));
if(option_qty_save == 0 && qty == 1){
$('.per-person').fadeIn();
} else {
$('.per-person').fadeOut();
}
});
}
$( document ).ready(function() {
if( window.innerWidth <= 1024 ){
$('#product .col-md-5').addClass('col-md-4');
$('#product .col-md-5').removeClass('col-md-5');
$('#product .col-md-7').addClass('col-md-8');
$('#product .col-md-7').removeClass('col-md-7');
$('#bloc2').append($('.to-cart'));
}
// HIDE FORFAITS DUO
var product_slug = '{{product.slug}}';
var slugs = ['bon-cadeau-6', 'bon-cadeau-7', 'bon-cadeau-8', 'bon-cadeau-9'];
if(jQuery.inArray(product_slug, slugs) != -1) {
$('.options .option-1').hide();
$('.options .option-2').hide();
}
// END HIDE FORFAITS DUO
$('.additional li').each(function(index, value) {
if($(this).data('info')){
var add_desc = '';
if( $(this).data('info') == 'sp-ga' ){
/*add_desc = "{{ 'shop_bons_desc1'|tr(tr)|raw }}".replace(/'/g, "\\'");*/
add_desc = "{{ 'shop_bons_desc1'|tr(tr)|raw }}";
} else if( $(this).data('info') == 'mj-m1' ){
/*add_desc = "{{ 'shop_bons_desc2'|tr(tr)|raw }}".replace(/'/g, "\\'");*/
add_desc = "{{ 'shop_bons_desc2'|tr(tr)|raw }}";
} else if( $(this).data('info') == 'mj-m2' ){
/*add_desc = "{{ 'shop_bons_desc3'|tr(tr)|raw }}".replace(/'/g, "\\'");*/
add_desc = "{{ 'shop_bons_desc3'|tr(tr)|raw }}";
} else if( $(this).data('info') == 've-m1' ){
/*add_desc = "{{ 'shop_bons_desc4'|tr(tr)|raw }}".replace(/'/g, "\\'");*/
add_desc = "{{ 'shop_bons_desc4'|tr(tr)|raw }}";
} else if( $(this).data('info') == 've-m2' ){
/*add_desc = "{{ 'shop_bons_desc5'|tr(tr)|raw }}".replace(/'/g, "\\'");*/
add_desc = "{{ 'shop_bons_desc5'|tr(tr)|raw }}";
}
$(this).append('<span class="infos" data-desc="'+add_desc+'">i</span>')
}
});
$('.infos').each(function(index, value) {
$(this).tooltipster({
content: $(this).data('desc'),
delay: 200,
contentAsHTML: true,
trigger: 'click'
});
});
$('#product .bookmark').click(function(e){
e.preventDefault();
if( $(this).hasClass('saved') ){
var action = 'unsave';
} else {
var action = 'save';
}
$.ajax({
type: "POST",
url: "/shop/product/"+action+"/{{ product.id }}",
data: null,
dataType: "json",
success: function(response) {
if( action == 'save' ){
$('#product .bookmark').addClass('saved');
$('#product .bookmark span').text('Produit sauvegardé');
} else {
$('#product .bookmark').removeClass('saved');
$('#product .bookmark span').text('Ajouter aux favoris');
}
}
});
});
$('.options .qty a').click(function(e){
e.preventDefault();
var element = $(this).parents('.qty');
var count = parseInt(element.find('span').text());
if( $(this).data('action') == 'plus' ){
// BLOCK FORFAITS DUO EN FONCTION DU NOMBRE DE PARTICIPANTS
console.log('check forfait duo');
var qtyPres = parseInt($('.to-cart span').text());
var maxDuo = parseInt((qtyPres / 2)+(qtyPres % 2));
var currentDuo = parseInt($('.qty[data-id="1"] span').text()) + parseInt($('.qty[data-id="2"] span').text()) + 1;
var refFix = parseInt(element.data('id'));
// console.log('max forfait duo : '+maxDuo);
// console.log('currentDuo : '+currentDuo);
// console.log('ref : '+refFix);
if(refFix == 1 || refFix == 2){
if(currentDuo > maxDuo){
// console.log('ok block');
return 0;
}
}
// FIN BLOCK FORFAITS DUO EN FONCTION DU NOMBRE DE PARTICIPANTS
count++;
} else {
count--;
if(count < 0){
count = 0;
}
}
if(count > 0){
$(this).parents('li').addClass('active');
} else {
$(this).parents('li').removeClass('active');
}
element.find('span').text(count);
updatePrice();
});
$('.to-cart .qty a').click(function(e){
e.preventDefault();
var element = $(this).parents('.qty');
var count = parseInt(element.find('span').text());
if( $(this).data('action') == 'plus' ){
count++;
} else {
count--;
if(count < 1){
count = 1;
}
}
element.find('span').text(count);
updatePrice();
});
$('.owl-carousel.product').owlCarousel({
loop:false,
margin:34,
nav:false,
dots:false,
responsive:{
0:{
items:1
},
600:{
items:1
},
1920:{
items:1
}
}
});
var owl = $('.owl-carousel.related');
owl.owlCarousel({
loop:false,
margin:110,
nav:true,
responsive:{
0:{
items:1
},
768:{
items:2
},
1024:{
items:3
},
1920:{
items:4
}
}
});
owl.on('changed.owl.carousel', function(event) {
var itemsNbr = owl.data()['owl.carousel'].settings.items;
var itemsTotal = event.item.count;
var itemsIndex = event.item.index;
var pagesNbr = itemsTotal - itemsNbr;
var horizontalBar = $('.horizontal-bar').outerWidth();
var horizontalBarCtrl = $('.horizontal-bar-ctrl').outerWidth();
var courseLength = $('.horizontal-bar').outerWidth() - $('.horizontal-bar-ctrl').outerWidth();
var left = itemsIndex * 100 / pagesNbr; // percent
left = left * courseLength / 100;
$('.horizontal-bar-ctrl').css('left', left+'px');
});
});
</script>
<!-- script pour gérer la connexion lors de la demande d'ajout de favoris --->
<script>
$(document).ready(function() {
$('.trigger-modal').on('click', function(e) {
e.preventDefault(); // Empêche le comportement par défaut du lien
const url = "/" + $("html").attr("lang") + "/user/connected";
$.ajax({
url: url,
success: function(data) {
if (!data.isLoggedIn) {
const locale = data.locale;
let modalTitle, modalContent, modalButtonText;
if(locale === "fr") {
modalTitle = "Connexion nécessaire";
modalContent = "Pour réaliser cette action vous devez être connecté. Si vous n'avez pas encore de compte, vous pouvez en créer un.";
modalButtonText = "Se connecter";
} else if(locale === "en") {
modalTitle = "Connection required";
modalContent = "You must be logged in to perform this action. If you don't have an account yet, you can create one.";
modalButtonText = "Sign in";
} else if (locale === "de") {
modalTitle = "Verbindung erforderlich";
modalContent = "Um diese Aktion durchzuführen, müssen Sie angemeldet sein. Wenn Sie noch kein Konto haben, können Sie eines erstellen.";
modalButtonText = "Sich anmelden";
}
// Mise à jour du texte du bouton
$(".modalbutton").text(modalButtonText);
// Mise à jour du titre et du contenu de la modale
$("#modalLoginReminderLabel").text(modalTitle);
$("#modalLoginReminder .modal-body").text(modalContent);
// Affichage de la modale
$("#modalLoginReminder").modal('show');
}
}
});
});
});
</script>
{% endblock %}