{% sw_extends '@Storefront/storefront/page/product-detail/index.html.twig' %}
{% block base_content %}
{% block page_product_detail %}
{% if page.confi is defined %}
{# <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"#}
{# integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"#}
{# crossorigin="anonymous">#}
<style>
/*.cf .row {*/
/* display: block;*/
/*}*/
/*.cf .hidden {*/
/* display: none;*/
/*}*/
/*confiapp, .cf, .cf #cf-body {*/
/* min-height: 2000px;*/
/*}*/
/*.cf #cf-preview {*/
/* float: left;*/
/*}*/
.modal-backdrop.modal-backdrop-open{
opacity: 0.6;
}
.fade {
opacity: initial;
}
</style>
<div>
{{ page.confi.css|raw }}
{{ page.confi.js|raw }}
{{ page.confi.body|raw }}
<form
id="productDetailPageBuyProductForm"
action="{% block page_product_detail_buy_form_action %}{{ path('frontend.checkout.line-item.add') }}{% endblock %}"
method="post"
class="buy-widget"
data-add-to-cart="true">
{% block page_product_detail_buy_form_inner_csrf %}
{{ sw_csrf('frontend.checkout.line-item.add') }}
{% endblock %}
{# {% set buyable = product.available and product.childCount <= 0 and product.calculatedMaxPurchase > 0 %}#}
{# {% block page_product_detail_buy_container %}#}
{# {% if buyable %}#}
{# <div class="{{ formRowClass }} buy-widget-container">#}
{# {% block page_product_detail_buy_quantity_container %}#}
{# <div class="col-4">#}
{# {% block page_product_detail_buy_quantity %}#}
{# <select name="lineItems[{{ product.id }}][quantity]"#}
{# class="{{ formSelectClass }} product-detail-quantity-select">#}
{# {% for quantity in range(product.minPurchase, product.calculatedMaxPurchase, product.purchaseSteps) %}#}
{# <option value="{{ quantity }}">#}
{# {{ quantity }}#}
{# {% if quantity == 1 %}#}
{# {% if product.translated.packUnit %} {{ product.translated.packUnit }}{% endif %}#}
{# {% else %}#}
{# {% if product.translated.packUnitPlural %}#}
{# {{ product.translated.packUnitPlural }}#}
{# {% elseif product.translated.packUnit %}#}
{# {{ product.translated.packUnit }}#}
{# {% endif %}#}
{# {% endif %}#}
{# </option>#}
{# {% endfor %}#}
{# </select>#}
{# {% endblock %}#}
{# </div>#}
{# {% endblock %}#}
{# {% block page_product_detail_buy_redirect_input %}#}
{# #}{# fallback redirect back to detail page is deactivated via js #}
{# <input type="hidden"#}
{# name="redirectTo"#}
{# value="frontend.detail.page">#}
{# <input type="hidden"#}
{# name="redirectParameters"#}
{# data-redirect-parameters="true"#}
{# value='{"productId": "{{ product.id }}"}'>#}
{# {% endblock %}#}
{# {% block page_product_detail_buy_product_buy_info %}#}
{# <input type="hidden"#}
{# name="lineItems[{{ product.id }}][id]"#}
{# value="{{ product.id }}">#}
{# <input type="hidden"#}
{# name="lineItems[{{ product.id }}][type]"#}
{# value="product">#}
{# <input type="hidden"#}
{# name="lineItems[{{ product.id }}][referencedId]"#}
{# value="{{ product.id }}">#}
{# <input type="hidden"#}
{# name="lineItems[{{ product.id }}][stackable]"#}
{# value="1">#}
{# <input type="hidden"#}
{# name="lineItems[{{ product.id }}][removable]"#}
{# value="1">#}
{# {% endblock %}#}
{# {% block page_product_detail_product_buy_meta %}#}
{# <input type="hidden"#}
{# name="product-name"#}
{# value="{{ product.translated.name }}">#}
{# <input type="hidden"#}
{# name="brand-name"#}
{# value="{{ product.manufacturer.getName() }}">#}
{# {% endblock %}#}
{# {% block page_product_detail_buy_button_container %}#}
{# <div class="col-8">#}
{# {% block page_product_detail_buy_button %}#}
{# #}{# @deprecated tag:v6.5.0 - Bootstrap v5 removes `btn-block` class, use `d-grid` wrapper instead #}
{# {% if feature('v6.5.0.0') %}#}
{# <div class="d-grid">#}
{# <button class="btn btn-primary btn-buy"#}
{# title="{{ "detail.addProduct"|trans|striptags }}"#}
{# aria-label="{{ "detail.addProduct"|trans|striptags }}">#}
{# {{ "detail.addProduct"|trans|sw_sanitize }}#}
{# </button>#}
{# </div>#}
{# {% else %}#}
{# <button class="btn btn-primary btn-block btn-buy"#}
{# title="{{ "detail.addProduct"|trans|striptags }}"#}
{# aria-label="{{ "detail.addProduct"|trans|striptags }}">#}
{# {{ "detail.addProduct"|trans|sw_sanitize }}#}
{# </button>#}
{# {% endif %}#}
{# {% endblock %}#}
{# </div>#}
{# {% endblock %}#}
{# </div>#}
{# {% endif %}#}
{# {% endblock %}#}
</form>
</div>
<script>
function is(className, object) {
return Object.prototype.toString.call(object) === '[object '+ className +']';
}
const DataEncoder = function() {
this.levels = [];
this.actualKey = null;
}
DataEncoder.prototype.__dataEncoding = function(data) {
let uriPart = '';
const levelsSize = this.levels.length;
if (levelsSize) {
uriPart = this.levels[0];
for(let c = 1; c < levelsSize; c++) {
uriPart += '[' + this.levels[c] + ']';
}
}
let finalString = '';
if (is('Object', data)) {
const keys = Object.keys(data);
const l = keys.length;
for(let a = 0; a < l; a++) {
const key = keys[a];
let value = data[key];
this.actualKey = key;
this.levels.push(this.actualKey);
finalString += this.__dataEncoding(value);
}
} else if (is('Array', data)) {
if (!this.actualKey) throw new Error("Directly passed array does not work")
const aSize = data.length;
for (let b = 0; b < aSize; b++) {
let aVal = data[b];
this.levels.push(b);
finalString += this.__dataEncoding(aVal);
}
} else {
finalString += uriPart + '=' + encodeURIComponent(data) + '&';
}
this.levels.pop();
return finalString;
}
DataEncoder.prototype.encode = function(data) {
if (!is('Object', data) || !Object.keys(data).length) return null;
return this.__dataEncoding(data).slice(0, -1);
}
window.addEventListener('DOMContentLoaded', (event) => {
confi = {
addToCart: function (config, thumbnail) {
// var loading = '<div id="loading" style="z-index: 999; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: rgba(255,255,255,0.7);"><img src="" style="position: fixed; width: 40px; height: 40px; margin-top: -20px; margin-left: -20px; top: 50%; left: 50%;"/></div>';
// $('.content-main').append(loading);
var configurated = JSON.parse(config);
var quantity = configurated.configurator.qty;
var myData = {
'_csrf_token': '{{ sw_csrf('frontend.confi.addtocart.controller', {"mode": "token"}) }}',
'config': configurated,
'thumbnail': thumbnail,
'id': '{{ page.product.id }}',
'quantity': quantity
};
const encoder = new DataEncoder();
var uri = encoder.encode(myData);
var request = new XMLHttpRequest();
request.open('POST', '/addtocart', true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;');
request.onload = function () {
if (this.status >= 200 && this.status < 400) {
const plugin = window.PluginManager.getPluginInstanceFromElement(document.querySelector('[data-add-to-cart]'), 'AddToCart');
plugin._openOffCanvasCarts('/checkout/offcanvas', '');
plugin.$emitter.publish('openOffCanvasCart');
} else {
console.log(this.response);
}
};
request.onerror = function() {
// Connection error
};
request.send(uri);
{#$.ajax({#}
{# type: "POST",#}
{# cache: false,#}
{# url: '/addtocart',#}
{# async: true,#}
{# data: {#}
{# '_csrf_token': '{{ sw_csrf('frontend.confi.addtocart.controller', {"mode": "token"}) }}',#}
{# 'config': configurated,#}
{# 'thumbnail': thumbnail,#}
{# 'id': '{{ page.product.id }}',#}
{# 'quantity': quantity#}
{# },#}
{# success: function (data) {#}
{# console.log(document.querySelector('[data-add-to-cart]'));#}
{# const plugin = window.PluginManager.getPluginInstanceFromElement(document.querySelector('[data-add-to-cart]'), 'AddToCart');#}
{# plugin._openOffCanvasCarts('/checkout/offcanvas', '');#}
{# plugin.$emitter.publish('openOffCanvasCart');#}
{# }, error: function (xhr, ajaxOptions, thrownError) {#}
{# console.log(thrownError);#}
{# }#}
{#});#}
}
};
});
</script>
{% endif %}
<div class="product-detail"
itemscope
itemtype="https://schema.org/Product">
{% block page_product_detail_inner %}
{% block page_product_detail_content %}
<div class="product-detail-content">
{% block page_product_detail_headline %}
{# {% if page.confi is not defined %}#}
<div class="row align-items-center product-detail-headline">
{% sw_include '@Storefront/storefront/page/product-detail/headline.html.twig' %}
</div>
{# {% endif %}#}
{% endblock %}
{% set mediaItems = page.product.media.media %}
{% block page_product_detail_main %}
{% if page.confi is not defined %}
<div class="row product-detail-main">
{% block page_product_detail_media %}
<div class="col-lg-7 product-detail-media">
{% if page.product.media %}
{% sw_include '@Storefront/storefront/element/cms-element-image-gallery.html.twig' with {
'mediaItems': mediaItems,
'zoom': true,
'zoomModal': true,
'displayMode': 'contain',
'gutter': 5,
'minHeight': '430px',
'navigationArrows': 'inside',
'navigationDots': 'inside',
'galleryPosition': 'left',
'isProduct': true,
'fallbackImageTitle': page.product.translated.name,
'startIndexThumbnails': 1,
'startIndexSlider': 1,
'keepAspectRatioOnZoom': false
} %}
{% endif %}
</div>
{% endblock %}
{% block page_product_detail_buy %}
<div class="col-lg-5 product-detail-buy">
{% sw_include '@Storefront/storefront/page/product-detail/buy-widget.html.twig' %}
</div>
{% endblock %}
</div>
{% endif %}
{% endblock %}
</div>
{% endblock %}
{% block page_product_detail_tabs %}
<div class="product-detail-tabs">
{% sw_include '@Storefront/storefront/page/product-detail/tabs.html.twig' %}
</div>
{% endblock %}
{% block page_product_detail_cross_selling %}
{% if page.crossSellings.elements is defined and page.crossSellings.elements|filter(item => item.total > 0)|length > 0 %}
<div class="product-detail-tabs product-detail-cross-selling">
{% sw_include '@Storefront/storefront/page/product-detail/cross-selling/tabs.html.twig' with {
crossSellings: page.crossSellings
} %}
</div>
{% endif %}
{% endblock %}
{% endblock %}
</div>
{% endblock %}
{% endblock %}