| @@ -16,4 +16,5 @@ | |||||
| @import 'page/checkout/register'; | @import 'page/checkout/register'; | ||||
| @import 'page/checkout/cart'; | @import 'page/checkout/cart'; | ||||
| @import 'page/product-detail/product-detail'; | @import 'page/product-detail/product-detail'; | ||||
| @import 'page/product-detail/tabs'; | |||||
| @import 'page/product-detail/review'; | @import 'page/product-detail/review'; | ||||
| @@ -94,8 +94,14 @@ | |||||
| &.icon-instagram { | &.icon-instagram { | ||||
| padding: 5px; | padding: 5px; | ||||
| } | } | ||||
| } | |||||
| svg { | |||||
| color: $sw-color-brand-primary; | |||||
| svg { | |||||
| color: $sw-color-brand-primary; | |||||
| } | |||||
| &:hover { | |||||
| background-color: $sw-color-brand-primary; | |||||
| svg { | |||||
| color: #fff; | |||||
| } | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -2,7 +2,7 @@ | |||||
| .product-detail-media { | .product-detail-media { | ||||
| padding-right: 40px; | padding-right: 40px; | ||||
| .gallery-slider-image { | .gallery-slider-image { | ||||
| width: 100%; | |||||
| width: 100%; | |||||
| } | } | ||||
| .aku-cms-factory-element { | .aku-cms-factory-element { | ||||
| display: flex; | display: flex; | ||||
| @@ -20,7 +20,7 @@ | |||||
| padding: 9px 9px 6px 9px; | padding: 9px 9px 6px 9px; | ||||
| transition: border 0.2s ease-in-out; | transition: border 0.2s ease-in-out; | ||||
| &.active { | &.active { | ||||
| border-color: #b1c3d9; | |||||
| border-color: #b1c3d9; | |||||
| } | } | ||||
| img { | img { | ||||
| width: 55px; | width: 55px; | ||||
| @@ -69,12 +69,12 @@ | |||||
| } | } | ||||
| } | } | ||||
| .modal-content { | .modal-content { | ||||
| .modal-title { | |||||
| margin-bottom: 10px; | |||||
| } | |||||
| h2 { | |||||
| margin-top: 25px; | |||||
| } | |||||
| .modal-title { | |||||
| margin-bottom: 10px; | |||||
| } | |||||
| h2 { | |||||
| margin-top: 25px; | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -84,15 +84,20 @@ | |||||
| background-color: #E9F4FC; | background-color: #E9F4FC; | ||||
| padding-top: 40px; | padding-top: 40px; | ||||
| .product-detail-short-description { | .product-detail-short-description { | ||||
| border-bottom: 1px solid #B1C3D9; | |||||
| border-bottom: 1px solid #B1C3D9; | |||||
| } | } | ||||
| .product-detail-name { | .product-detail-name { | ||||
| font-size: 60px; | font-size: 60px; | ||||
| line-height: 54px; | line-height: 54px; | ||||
| color: $sw-color-brand-primary; | color: $sw-color-brand-primary; | ||||
| } | } | ||||
| .product-detail-price-container { | |||||
| display: flex; | |||||
| align-items: baseline; | |||||
| } | |||||
| .product-detail-price { | .product-detail-price { | ||||
| color: $sw-color-brand-primary; | color: $sw-color-brand-primary; | ||||
| margin-right: 15px; | |||||
| } | } | ||||
| .product-detail-tax-link { | .product-detail-tax-link { | ||||
| color: #222; | color: #222; | ||||
| @@ -101,6 +106,19 @@ | |||||
| text-decoration: none; | text-decoration: none; | ||||
| } | } | ||||
| } | } | ||||
| .product-detail-form-container { | |||||
| padding: 35px 0; | |||||
| margin-top: 25px; | |||||
| border-top: 1px solid #B1C3D9; | |||||
| border-bottom: 1px solid #B1C3D9; | |||||
| } | |||||
| .product-detail-delivery-information { | |||||
| margin-bottom: 0; | |||||
| } | |||||
| .product-wishlist { | |||||
| border-top: 1px solid #B1C3D9; | |||||
| padding: 25px 0; | |||||
| } | |||||
| .btn-primary { | .btn-primary { | ||||
| background: transparent; | background: transparent; | ||||
| color: $sw-color-brand-primary; | color: $sw-color-brand-primary; | ||||
| @@ -117,5 +135,11 @@ | |||||
| color: #fff; | color: #fff; | ||||
| } | } | ||||
| } | } | ||||
| .product-wishlist-btn-content { | |||||
| text-decoration: none; | |||||
| &:hover { | |||||
| text-decoration: underline; | |||||
| } | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,26 @@ | |||||
| .cms-block-product-description-reviews .cms-block-container { | |||||
| background: #e9f4fc; | |||||
| padding-top: 3rem; | |||||
| padding-bottom: 3rem; | |||||
| color: #222; | |||||
| } | |||||
| .card-tabs { | |||||
| .nav-link { | |||||
| text-transform: uppercase; | |||||
| letter-spacing: 1.6px; | |||||
| } | |||||
| .tab-content { | |||||
| h2 { | |||||
| font-family: $sw-font-family-base; | |||||
| font-size: 1.375rem; | |||||
| font-weight: 500; | |||||
| color: #222; | |||||
| } | |||||
| h3, h4, h5, h6 { | |||||
| color: #222; | |||||
| } | |||||
| .product-detail-description-text { | |||||
| max-width: 900px; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,46 @@ | |||||
| {% sw_extends '@Storefront/storefront/component/buy-widget/buy-widget-price.html.twig' %} | |||||
| {% block buy_widget_price_content %} | |||||
| {% set listPrice = price.listPrice %} | |||||
| <p class="product-detail-price{% if listPrice.percentage > 0 %} with-list-price{% endif %}"> | |||||
| {{ price.unitPrice|currency }}{{ "general.star"|trans|sw_sanitize }} | |||||
| </p> | |||||
| {% set weekProductCount = 0 %} | |||||
| {% if (product.customFields.custom_weightlossplan_day1_image != null) %}{% set weekProductCount = weekProductCount + 1 %}{% endif %} | |||||
| {% if (product.customFields.custom_weightlossplan_day2_image != null) %}{% set weekProductCount = weekProductCount + 1 %}{% endif %} | |||||
| {% if (product.customFields.custom_weightlossplan_day3_image != null) %}{% set weekProductCount = weekProductCount + 1 %}{% endif %} | |||||
| {% if (product.customFields.custom_weightlossplan_day4_image != null) %}{% set weekProductCount = weekProductCount + 1 %}{% endif %} | |||||
| {% if (product.customFields.custom_weightlossplan_day5_image != null) %}{% set weekProductCount = weekProductCount + 1 %}{% endif %} | |||||
| {% if (product.customFields.custom_weightlossplan_day6_image != null) %}{% set weekProductCount = weekProductCount + 1 %}{% endif %} | |||||
| {% if weekProductCount >= 1 %} | |||||
| <span class="spwn-week-count"><small>{{ (price.unitPrice / weekProductCount) | json_encode() | round(2) | number_format(2, ',', '.') }} € pro Tag</small></span> | |||||
| {% endif %} | |||||
| {% if listPrice.percentage > 0 %} | |||||
| {% block buy_widget_was_price %} | |||||
| {% block buy_widget_was_price_badge %} | |||||
| <span class="list-price-badge">%</span> | |||||
| {% endblock %} | |||||
| {% set afterListPriceSnippetExists = "listing.afterListPrice"|trans|length > 0 %} | |||||
| {% set beforeListPriceSnippetExists = "listing.beforeListPrice"|trans|length > 0 %} | |||||
| {% block buy_widget_was_price_wrapper %} | |||||
| <span class="product-detail-list-price-wrapper"> | |||||
| {% if beforeListPriceSnippetExists %}{{"listing.beforeListPrice"|trans|trim}}{% endif %} | |||||
| <span{% if not (afterListPriceSnippetExists or beforeListPriceSnippetExists) %} class="list-price-price"{% endif %}>{{ listPrice.price|currency }}{{ "general.star"|trans|sw_sanitize }}</span> | |||||
| {% if afterListPriceSnippetExists %} | |||||
| {{"listing.afterListPrice"|trans|trim}} | |||||
| {% endif %} | |||||
| <span class="list-price-percentage">{{ "detail.listPricePercentage"|trans({'%price%': listPrice.percentage })|sw_sanitize }}</span> | |||||
| </span> | |||||
| {% endblock %} | |||||
| {% endblock %} | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| @@ -1,21 +1,209 @@ | |||||
| {% sw_extends '@Storefront/storefront/component/buy-widget/buy-widget.html.twig' %} | {% sw_extends '@Storefront/storefront/component/buy-widget/buy-widget.html.twig' %} | ||||
| {% block buy_widget_price %} | |||||
| <div class="product-detail-price-container"> | |||||
| {% if page.product.translated.customFields.deposittype %} | |||||
| <div class="product-detail-deposittype"> | |||||
| {{ page.product.translated.customFields.deposittype }} | |||||
| </div> | |||||
| {% block buy_widget %} | |||||
| <div class="product-detail-buy{% if elementId %}-{{ elementId }}{% endif %} js-magnifier-zoom-image-container"> | |||||
| {% block buy_widget_rich_snippets %} | |||||
| {% block buy_widget_rich_snippets_brand %} | |||||
| {% if product.manufacturer %} | |||||
| <meta itemprop="brand" | |||||
| content="{{ product.manufacturer.translated.name }}"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_rich_snippets_gtin13 %} | |||||
| {% if product.ean %} | |||||
| <meta itemprop="gtin13" | |||||
| content="{{ product.ean }}"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_rich_snippets_mpn %} | |||||
| {% if product.manufacturerNumber %} | |||||
| <meta itemprop="mpn" | |||||
| content="{{ product.manufacturerNumber }}"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_rich_snippets_weight %} | |||||
| {% if product.weight %} | |||||
| <meta itemprop="weight" | |||||
| content="{{ product.weight }} kg"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_rich_snippets_height %} | |||||
| {% if product.height %} | |||||
| <meta itemprop="height" | |||||
| content="{{ product.height }} mm"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_rich_snippets_width %} | |||||
| {% if product.width %} | |||||
| <meta itemprop="width" | |||||
| content="{{ product.width }} mm"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_rich_snippets_depth %} | |||||
| {% if product.length %} | |||||
| <meta itemprop="depth" | |||||
| content="{{ product.length }} mm"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_rich_snippets_release_date %} | |||||
| <meta itemprop="releaseDate" | |||||
| content="{{ product.releaseDate|format_date(pattern="Y-MM-dd", locale=app.request.locale) }}"/> | |||||
| {% endblock %} | |||||
| {% endblock %} | |||||
| {% if not feature('FEATURE_NEXT_16992') %} | |||||
| {# @deprecated tag:v6.5.0 tag:)(FEATURE_NEXT_16992) - Block will be removed in v6.5.0 #} | |||||
| {% block buy_widget_not_available %} | |||||
| {% endblock %} | |||||
| {% endif %} | {% endif %} | ||||
| {{ parent() }} | |||||
| {% if page.product.translated.customFields.deposit %} | |||||
| {% set deposit = page.product.translated.customFields.deposit|currency %} | |||||
| <div class="product-detail-deposit"> | |||||
| {{ "FlowsiteDepositSystemBasic.plusDeposit"|trans({ | |||||
| '%deposit%': deposit | |||||
| })|sw_sanitize }} | |||||
| {% block buy_widget_buy_container %} | |||||
| <div itemprop="offers" | |||||
| itemscope | |||||
| itemtype="{% if product.calculatedPrices|length > 1 %}http://schema.org/AggregateOffer{% else %}http://schema.org/Offer{% endif %}"> | |||||
| {% block buy_widget_data %} | |||||
| {% block buy_widget_data_rich_snippet_url %} | |||||
| <meta itemprop="url" | |||||
| content="{{ seoUrl('frontend.detail.page', { productId: product.id }) }}"/> | |||||
| {% endblock %} | |||||
| {% block buy_widget_data_rich_snippet_price_range %} | |||||
| {% if product.calculatedPrices|length > 1 %} | |||||
| {% set lowestPrice = false %} | |||||
| {% set highestPrice = false %} | |||||
| {% for price in product.calculatedPrices %} | |||||
| {% if not lowestPrice or price.unitPrice < lowestPrice %} | |||||
| {% set lowestPrice = price.unitPrice %} | |||||
| {% endif %} | |||||
| {% if not highestPrice or price.unitPrice > highestPrice %} | |||||
| {% set highestPrice = price.unitPrice %} | |||||
| {% endif %} | |||||
| {% endfor %} | |||||
| <meta itemprop="lowPrice" content="{{ lowestPrice }}"/> | |||||
| <meta itemprop="highPrice" content="{{ highestPrice }}"/> | |||||
| <meta itemprop="offerCount" content="{{ product.calculatedPrices|length }}"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_data_rich_snippet_price_currency %} | |||||
| <meta itemprop="priceCurrency" | |||||
| content="{{ context.currency.translated.shortName }}"/> | |||||
| {% endblock %} | |||||
| {% block buy_widget_price %} | |||||
| <div class="product-detail-price-container"> | |||||
| {% sw_include '@Storefront/storefront/component/buy-widget/buy-widget-price.html.twig' %} | |||||
| </div> | |||||
| {% endblock %} | |||||
| {% block buy_widget_tax %} | |||||
| <div class="product-detail-tax-container"> | |||||
| {% if context.taxState == "gross" %} | |||||
| {% set taxText = "general.grossTaxInformation"|trans|sw_sanitize %} | |||||
| {% else %} | |||||
| {% set taxText = "general.netTaxInformation"|trans|sw_sanitize %} | |||||
| {% endif %} | |||||
| <p class="product-detail-tax"> | |||||
| {% block buy_widget_tax_link %} | |||||
| <a class="product-detail-tax-link" | |||||
| href="{{ path('frontend.cms.page',{ id: config('core.basicInformation.shippingPaymentInfoPage') }) }}" | |||||
| title="{{ taxText }}" | |||||
| data-toggle="modal" | |||||
| data-url="{{ path('frontend.cms.page',{ id: config('core.basicInformation.shippingPaymentInfoPage') }) }}"> | |||||
| {{ taxText }} | |||||
| </a> | |||||
| {% endblock %} | |||||
| </p> | |||||
| </div> | |||||
| {% endblock %} | |||||
| {% block buy_widget_deposit %} | |||||
| {% if page.product.translated.customFields.deposit %} | |||||
| {% set deposit = page.product.translated.customFields.deposit|currency %} | |||||
| <div class="product-detail-deposit"> | |||||
| {{ "FlowsiteDepositSystemBasic.plusDeposit"|trans({ | |||||
| '%deposit%': deposit | |||||
| })|sw_sanitize }} | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% set remoteClickOptions = { | |||||
| selector: "#review-tab-" ~ product.id, | |||||
| scrollToElement: true | |||||
| } %} | |||||
| {% set reviewTabHref = "#review-tab-" ~ product.id ~ "-pane" %} | |||||
| {% block buy_widget_reviews %} | |||||
| {% if product.ratingAverage > 0 and totalReviews > 0 and config('core.listing.showReview') %} | |||||
| <div class="product-detail-reviews"> | |||||
| {% sw_include '@Storefront/storefront/component/review/rating.html.twig' with { | |||||
| points: product.ratingAverage, | |||||
| style: 'text-primary' | |||||
| } %} | |||||
| <a data-toggle="tab" | |||||
| class="product-detail-reviews-link" | |||||
| data-offcanvas-tabs="true" | |||||
| data-remote-click="true" | |||||
| data-remote-click-options='{{ remoteClickOptions|json_encode }}' | |||||
| href="{{ reviewTabHref }}" | |||||
| aria-controls="review-tab-pane"> | |||||
| {{ totalReviews }} | |||||
| {{ "detail.reviewLinkText"|trans({'%count%': totalReviews})|sw_sanitize }} | |||||
| </a> | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_configurator_include %} | |||||
| {% if product.parentId and configuratorSettings|length > 0 %} | |||||
| <div class="product-detail-configurator-container"> | |||||
| {% sw_include '@Storefront/storefront/component/buy-widget/configurator.html.twig' %} | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_buy_form %} | |||||
| {% if product.active %} | |||||
| <div class="product-detail-form-container"> | |||||
| {% sw_include '@Storefront/storefront/component/buy-widget/buy-widget-form.html.twig' %} | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| </div> | </div> | ||||
| {% endblock %} | |||||
| {% block buy_widget_delivery_informations %} | |||||
| <div class="product-detail-delivery-information"> | |||||
| {% sw_include '@Storefront/storefront/component/delivery-information.html.twig' %} | |||||
| </div> | |||||
| {% endblock %} | |||||
| {% if config('core.cart.wishlistEnabled') %} | |||||
| {% block buy_widget_wishlist %} | |||||
| {% sw_include '@Storefront/storefront/component/product/card/wishlist.html.twig' with { | |||||
| showText: true, | |||||
| size: 'md', | |||||
| productId: product.id | |||||
| } %} | |||||
| {% endblock %} | |||||
| {% endif %} | {% endif %} | ||||
| {% block buy_widget_ordernumber_container %} | |||||
| {% endblock %} | |||||
| </div> | </div> | ||||
| {% endblock %} | {% endblock %} | ||||
| @@ -61,3 +61,6 @@ | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| {% endblock %} | {% endblock %} | ||||
| {% block page_checkout_cart_shipping_costs %} | |||||
| {% endblock %} | |||||
| @@ -0,0 +1,35 @@ | |||||
| {% sw_extends '@Storefront/storefront/page/product-detail/buy-widget-price.html.twig' %} | |||||
| {% block page_product_detail_price_content %} | |||||
| {% set listPrice = price.listPrice %} | |||||
| <p class="product-detail-price{% if listPrice.percentage > 0 %} with-list-price{% endif %}"> | |||||
| {{ price.unitPrice|currency }}{{ "general.star"|trans|sw_sanitize }} | |||||
| </p> | |||||
| {% if listPrice.percentage > 0 %} | |||||
| {% block page_product_detail_was_price %} | |||||
| {% block page_product_detail_was_price_badge %} | |||||
| <span class="list-price-badge">%</span> | |||||
| {% endblock %} | |||||
| {% set afterListPriceSnippetExists = "listing.afterListPrice"|trans|length > 0 %} | |||||
| {% set beforeListPriceSnippetExists = "listing.beforeListPrice"|trans|length > 0 %} | |||||
| {% block page_product_detail_was_price_wrapper %} | |||||
| <span class="product-detail-list-price-wrapper"> | |||||
| {% if beforeListPriceSnippetExists %}{{"listing.beforeListPrice"|trans|trim}}{% endif %} | |||||
| <span{% if not (afterListPriceSnippetExists or beforeListPriceSnippetExists) %} class="list-price-price"{% endif %}>{{ listPrice.price|currency }}{{ "general.star"|trans|sw_sanitize }}</span> | |||||
| {% if afterListPriceSnippetExists %} | |||||
| {{"listing.afterListPrice"|trans|trim}} | |||||
| {% endif %} | |||||
| <span class="list-price-percentage">{{ "detail.listPricePercentage"|trans({'%price%': listPrice.percentage })|sw_sanitize }}</span> | |||||
| </span> | |||||
| {% endblock %} | |||||
| {% endblock %} | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| @@ -0,0 +1,207 @@ | |||||
| {% sw_extends '@Storefront/storefront/page/product-detail/buy-widget.html.twig' %} | |||||
| {% block page_product_detail_buy_inner %} | |||||
| <div class="js-magnifier-zoom-image-container"> | |||||
| {% block page_product_detail_rich_snippets %} | |||||
| {% block page_product_detail_rich_snippets_brand %} | |||||
| {% if page.product.manufacturer %} | |||||
| <meta itemprop="brand" | |||||
| content="{{ page.product.manufacturer.translated.name }}"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_rich_snippets_gtin13 %} | |||||
| {% if page.product.ean %} | |||||
| <meta itemprop="gtin13" | |||||
| content="{{ page.product.ean }}"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_rich_snippets_mpn %} | |||||
| {% if page.product.manufacturerNumber %} | |||||
| <meta itemprop="mpn" | |||||
| content="{{ page.product.manufacturerNumber }}"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_rich_snippets_weight %} | |||||
| {% if page.product.weight %} | |||||
| <meta itemprop="weight" | |||||
| content="{{ page.product.weight }} kg"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_rich_snippets_height %} | |||||
| {% if page.product.height %} | |||||
| <meta itemprop="height" | |||||
| content="{{ page.product.height }} mm"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_rich_snippets_width %} | |||||
| {% if page.product.width %} | |||||
| <meta itemprop="width" | |||||
| content="{{ page.product.width }} mm"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_rich_snippets_depth %} | |||||
| {% if page.product.length %} | |||||
| <meta itemprop="depth" | |||||
| content="{{ page.product.length }} mm"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_rich_snippets_release_date %} | |||||
| <meta itemprop="releaseDate" | |||||
| content="{{ page.product.releaseDate|format_date(pattern="Y-MM-dd", locale=app.request.locale) }}"/> | |||||
| {% endblock %} | |||||
| {% endblock %} | |||||
| {% if not feature('FEATURE_NEXT_16992') %} | |||||
| {# @deprecated tag:v6.5.0 tag:)(FEATURE_NEXT_16992) - Block will be removed in v6.5.0 #} | |||||
| {% block page_product_detail_not_available %} | |||||
| {% endblock %} | |||||
| {% endif %} | |||||
| {% block page_product_detail_buy_container %} | |||||
| <div itemprop="offers" | |||||
| itemscope | |||||
| itemtype="{% if page.product.calculatedPrices|length > 1 %}http://schema.org/AggregateOffer{% else %}http://schema.org/Offer{% endif %}"> | |||||
| {% block page_product_detail_data %} | |||||
| {% block page_product_detail_data_rich_snippet_url %} | |||||
| <meta itemprop="url" | |||||
| content="{{ seoUrl('frontend.detail.page', { productId: page.product.id }) }}"/> | |||||
| {% endblock %} | |||||
| {% block page_product_detail_data_rich_snippet_price_range %} | |||||
| {% if page.product.calculatedPrices|length > 1 %} | |||||
| {% set lowestPrice = false %} | |||||
| {% set highestPrice = false %} | |||||
| {% for price in page.product.calculatedPrices %} | |||||
| {% if not lowestPrice or price.unitPrice < lowestPrice %} | |||||
| {% set lowestPrice = price.unitPrice %} | |||||
| {% endif %} | |||||
| {% if not highestPrice or price.unitPrice > highestPrice %} | |||||
| {% set highestPrice = price.unitPrice %} | |||||
| {% endif %} | |||||
| {% endfor %} | |||||
| <meta itemprop="lowPrice" content="{{ lowestPrice }}"/> | |||||
| <meta itemprop="highPrice" content="{{ highestPrice }}"/> | |||||
| <meta itemprop="offerCount" content="{{ page.product.calculatedPrices|length }}"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_data_rich_snippet_price_currency %} | |||||
| <meta itemprop="priceCurrency" | |||||
| content="{{ context.currency.translated.shortName }}"/> | |||||
| {% endblock %} | |||||
| {% block page_product_detail_price %} | |||||
| <div class="product-detail-price-container"> | |||||
| {% sw_include '@Storefront/storefront/page/product-detail/buy-widget-price.html.twig' %} | |||||
| </div> | |||||
| {% endblock %} | |||||
| {% block page_product_detail_tax %} | |||||
| <div class="product-detail-tax-container"> | |||||
| {% if context.taxState == "gross" %} | |||||
| {% set taxText = "general.grossTaxInformation"|trans|sw_sanitize %} | |||||
| {% else %} | |||||
| {% set taxText = "general.netTaxInformation"|trans|sw_sanitize %} | |||||
| {% endif %} | |||||
| <p class="product-detail-tax"> | |||||
| {% block page_product_detail_tax_link %} | |||||
| <a class="product-detail-tax-link" | |||||
| href="{{ path('frontend.cms.page',{ id: config('core.basicInformation.shippingPaymentInfoPage') }) }}" | |||||
| title="{{ taxText }}" | |||||
| data-toggle="modal" | |||||
| data-url="{{ path('frontend.cms.page',{ id: config('core.basicInformation.shippingPaymentInfoPage') }) }}"> | |||||
| {{ taxText }} | |||||
| </a> | |||||
| {% endblock %} | |||||
| </p> | |||||
| </div> | |||||
| {% endblock %} | |||||
| {% block page_product_detail_deposit %} | |||||
| {% if page.product.translated.customFields.deposit %} | |||||
| {% set deposit = page.product.translated.customFields.deposit|currency %} | |||||
| <div class="product-detail-deposit"> | |||||
| {{ "FlowsiteDepositSystemBasic.plusDeposit"|trans({ | |||||
| '%deposit%': deposit | |||||
| })|sw_sanitize }} | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% set remoteClickOptions = { | |||||
| selector: "#review-tab", | |||||
| scrollToElement: true | |||||
| } %} | |||||
| {% block page_product_detail_reviews %} | |||||
| {% if page.product.ratingAverage > 0 and page.reviews.totalReviews > 0 and config('core.listing.showReview') %} | |||||
| <div class="product-detail-reviews"> | |||||
| {% sw_include '@Storefront/storefront/component/review/rating.html.twig' with { | |||||
| points: page.product.ratingAverage, | |||||
| style: 'text-primary' | |||||
| } %} | |||||
| <a data-toggle="tab" | |||||
| class="product-detail-reviews-link" | |||||
| data-offcanvas-tabs="true" | |||||
| data-remote-click="true" | |||||
| data-remote-click-options='{{ remoteClickOptions|json_encode }}' | |||||
| href="#review-tab-pane" | |||||
| aria-controls="review-tab-pane"> | |||||
| {{ page.reviews.totalReviews }} | |||||
| {{ "detail.reviewLinkText"|trans({'%count%': page.reviews.totalReviews})|sw_sanitize }} | |||||
| </a> | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_configurator_include %} | |||||
| {% if page.product.parentId and page.configuratorSettings|length > 0 %} | |||||
| <div class="product-detail-configurator-container"> | |||||
| {% sw_include '@Storefront/storefront/page/product-detail/configurator.html.twig' %} | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_buy_form %} | |||||
| {% if page.product.active %} | |||||
| <div class="product-detail-form-container"> | |||||
| {% sw_include '@Storefront/storefront/page/product-detail/buy-widget-form.html.twig' %} | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| </div> | |||||
| {% endblock %} | |||||
| {% block page_product_detail_delivery_informations %} | |||||
| <div class="product-detail-delivery-information"> | |||||
| {% sw_include '@Storefront/storefront/component/delivery-information.html.twig' %} | |||||
| </div> | |||||
| {% endblock %} | |||||
| {% if config('core.cart.wishlistEnabled') %} | |||||
| {% block page_product_detail_wishlist %} | |||||
| {% sw_include '@Storefront/storefront/component/product/card/wishlist.html.twig' with { | |||||
| showText: true, | |||||
| size: 'md', | |||||
| productId: page.product.id | |||||
| } %} | |||||
| {% endblock %} | |||||
| {% endif %} | |||||
| {% block page_product_detail_ordernumber_container %} | |||||
| {% endblock %} | |||||
| </div> | |||||
| {% endblock %} | |||||
| @@ -0,0 +1,39 @@ | |||||
| {% sw_extends '@Storefront/storefront/page/product-detail/tabs.html.twig' %} | |||||
| {% block zen_page_product_detail_tabs_navigation_custom_tab_global %} | |||||
| {% if page.product.translated.customFields.custom_nutrition_energy_kcal|length > 0 %} | |||||
| {% set customTab = { | |||||
| 'translated': { | |||||
| title: "zentheme.atmos.content.customTabTitle"|trans({"%placeholder%": config('zenitPlatformAtmos.config.customTabTitle')}), | |||||
| text: "zentheme.atmos.content.customTabText"|trans({"%placeholder%": config('zenitPlatformAtmos.config.customTabText')}) | |||||
| } | |||||
| } %} | |||||
| <li class="nav-item"> | |||||
| <a class="nav-link product-detail-tab-navigation-link" | |||||
| id="custom-field-global-tab" | |||||
| data-toggle="tab" | |||||
| data-offcanvas-tabs="true" | |||||
| href="#custom-field-global-tab-pane" | |||||
| role="tab" | |||||
| aria-controls="custom-field-global-tab-pane" | |||||
| aria-selected="false"> | |||||
| <span>{{ customTab.translated.title }}</span> | |||||
| <span class="product-detail-tab-navigation-icon"> | |||||
| {% sw_icon 'arrow-medium-right' style {'pack':'solid'} %} | |||||
| </span> | |||||
| </a> | |||||
| </li> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block zen_page_product_detail_tabs_content_custom_tab_global %} | |||||
| {% if page.product.translated.customFields.custom_nutrition_energy_kcal|length > 0 %} | |||||
| <div class="tab-pane fade show" | |||||
| id="custom-field-global-tab-pane" | |||||
| role="tabpanel" | |||||
| aria-labelledby="custom-field-global-tab"> | |||||
| {% sw_include '@Storefront/storefront/page/product-detail/zen-custom-global-tab.html.twig' %} | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| @@ -0,0 +1,89 @@ | |||||
| {% sw_extends '@Storefront/storefront/utilities/offcanvas.html.twig' %} | |||||
| {% block utilities_offcanvas_content %} | |||||
| {% block zen_page_product_detail_custom_field_global_container %} | |||||
| <div class="product-detail-custom-field1 tab-pane-container"> | |||||
| {% set customTab = { | |||||
| 'translated': { | |||||
| title: "zentheme.atmos.content.customTabTitle"|trans({"%placeholder%": config('zenitPlatformAtmos.config.customTabTitle')}), | |||||
| text: "zentheme.atmos.content.customTabText"|trans({"%placeholder%": config('zenitPlatformAtmos.config.customTabText')}) | |||||
| } | |||||
| } %} | |||||
| {% block zen_page_product_detail_custom_field_global_content %} | |||||
| {% if page.product.translated.customFields.custom_nutrition_energy_kcal|length > 0 %} | |||||
| <h3>{{ "customFields.custom_nutrition"|trans }} pro 100 {% if (page.product.unit.name == "kg") or (page.product.unit.name == "g") %}g{% elseif page.product.unit.name == "Liter" %}ml{% endif %}:</h3> | |||||
| <table class="table table-striped product-detail-properties-table"> | |||||
| <tbody> | |||||
| <tr class="properties-row"> | |||||
| <th class="properties-label"> | |||||
| {{ "customFields.custom_nutrition_energy_kcal"|trans }} | |||||
| </th> | |||||
| <td class="properties-value"> | |||||
| {{ page.product.translated.customFields.custom_nutrition_energy_kcal|raw }} kcal / {{ page.product.translated.customFields.custom_nutrition_energy_kj|raw }} kJ | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="properties-row"> | |||||
| <th class="properties-label"> | |||||
| {{ "customFields.custom_nutrition_fat"|trans }} | |||||
| </th> | |||||
| <td class="properties-value"> | |||||
| {{ page.product.translated.customFields.custom_nutrition_fat|raw|number_format(1, ',', '.') }} g | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="properties-row"> | |||||
| <th class="properties-label"> | |||||
| {{ "customFields.custom_nutrition_fattyacids"|trans }} | |||||
| </th> | |||||
| <td class="properties-value"> | |||||
| {{ page.product.translated.customFields.custom_nutrition_fattyacids|raw|number_format(1, ',', '.') }} g | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="properties-row"> | |||||
| <th class="properties-label"> | |||||
| {{ "customFields.custom_nutrition_carbohydrates"|trans }} | |||||
| </th> | |||||
| <td class="properties-value"> | |||||
| {{ page.product.translated.customFields.custom_nutrition_carbohydrates|raw|number_format(1, ',', '.') }} g | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="properties-row"> | |||||
| <th class="properties-label"> | |||||
| {{ "customFields.custom_nutrition_sugar"|trans }} | |||||
| </th> | |||||
| <td class="properties-value"> | |||||
| {{ page.product.translated.customFields.custom_nutrition_sugar|raw|number_format(1, ',', '.') }} g | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="properties-row"> | |||||
| <th class="properties-label"> | |||||
| {{ "customFields.custom_nutrition_protein"|trans }} | |||||
| </th> | |||||
| <td class="properties-value"> | |||||
| {{ page.product.translated.customFields.custom_nutrition_protein|raw|number_format(1, ',', '.') }} g | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="properties-row"> | |||||
| <th class="properties-label"> | |||||
| {{ "customFields.custom_nutrition_salt"|trans }} | |||||
| </th> | |||||
| <td class="properties-value"> | |||||
| {{ page.product.translated.customFields.custom_nutrition_salt|raw|number_format(2, ',', '.') }} g | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="properties-row"> | |||||
| <th class="properties-label"> | |||||
| {{ "customFields.custom_nutrition_be"|trans }} | |||||
| </th> | |||||
| <td class="properties-value"> | |||||
| {{ page.product.translated.customFields.custom_nutrition_be|raw|number_format(1, ',', '.') }} BE | |||||
| </td> | |||||
| </tr> | |||||
| </tbody> | |||||
| </table> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| </div> | |||||
| {% endblock %} | |||||
| {% endblock %} | |||||
| @@ -1,37 +1,7 @@ | |||||
| body.is-act-home { | |||||
| body { | |||||
| @include media-breakpoint-down(xs) { | @include media-breakpoint-down(xs) { | ||||
| .cms-section.bg-image { | .cms-section.bg-image { | ||||
| background-position: center left; | background-position: center left; | ||||
| } | } | ||||
| } | } | ||||
| @include media-breakpoint-up(sm) { | |||||
| .content-main { | |||||
| margin-left: -20px; | |||||
| margin-right: -20px; | |||||
| .cms-section-default.full-width { | |||||
| padding-left: 5px; | |||||
| padding-right: 5px; | |||||
| } | |||||
| } | |||||
| } | |||||
| @include media-breakpoint-up(md) { | |||||
| .content-main { | |||||
| margin-left: -40px; | |||||
| margin-right: -40px; | |||||
| .cms-section-default.full-width { | |||||
| padding-left: 10px; | |||||
| padding-right: 10px; | |||||
| } | |||||
| } | |||||
| } | |||||
| @include media-breakpoint-up(xl) { | |||||
| .content-main { | |||||
| margin-left: -80px; | |||||
| margin-right: -80px; | |||||
| .cms-section-default.full-width { | |||||
| padding-left: 20px; | |||||
| padding-right: 20px; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | } | ||||
| @@ -62,7 +62,9 @@ | |||||
| a:not(.btn) { | a:not(.btn) { | ||||
| margin-top: 16px; | margin-top: 16px; | ||||
| margin-bottom: 0; | margin-bottom: 0; | ||||
| line-height: 15px; | |||||
| font-size: 22px; | |||||
| line-height: 24px; | |||||
| font-weight: 500; | |||||
| } | } | ||||
| } | } | ||||
| .footer-contact-form { | .footer-contact-form { | ||||
| @@ -71,11 +71,9 @@ | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| .is-lo-full-width .container { | .is-lo-full-width .container { | ||||
| max-width: 1120px; | max-width: 1120px; | ||||
| } | } | ||||
| .nav-header>.container { | .nav-header>.container { | ||||
| padding-left: 0; | padding-left: 0; | ||||
| padding-right: 0; | padding-right: 0; | ||||
| @@ -14,6 +14,7 @@ html { | |||||
| body { | body { | ||||
| background: #fff; | background: #fff; | ||||
| border-top: 5px solid $sw-color-brand-primary !important; | border-top: 5px solid $sw-color-brand-primary !important; | ||||
| overflow-x:hidden; | |||||
| } | } | ||||
| h1 { | h1 { | ||||
| @@ -75,6 +76,9 @@ h6 { | |||||
| font-weight: 600; | font-weight: 600; | ||||
| letter-spacing: 1px; | letter-spacing: 1px; | ||||
| padding: 5px 32px !important; | padding: 5px 32px !important; | ||||
| &:hover { | |||||
| color: #fff !important; | |||||
| } | |||||
| } | } | ||||
| .aku-cms-factory-element, | .aku-cms-factory-element, | ||||
| @@ -82,8 +82,13 @@ | |||||
| color: $sw-color-brand-secondary; | color: $sw-color-brand-secondary; | ||||
| line-height: 40px !important; | line-height: 40px !important; | ||||
| } | } | ||||
| .product-detail-price-container { | |||||
| display: flex; | |||||
| align-items: baseline; | |||||
| } | |||||
| .product-detail-price { | .product-detail-price { | ||||
| color: $sw-color-brand-primary; | color: $sw-color-brand-primary; | ||||
| margin-right: 15px; | |||||
| } | } | ||||
| .product-detail-tax-link { | .product-detail-tax-link { | ||||
| color: #222; | color: #222; | ||||
| @@ -92,6 +97,19 @@ | |||||
| text-decoration: none; | text-decoration: none; | ||||
| } | } | ||||
| } | } | ||||
| .product-detail-form-container { | |||||
| padding: 35px 0; | |||||
| margin-top: 25px; | |||||
| border-top: 1px solid #86b04b; | |||||
| border-bottom: 1px solid #86b04b; | |||||
| } | |||||
| .product-detail-delivery-information { | |||||
| margin-bottom: 0; | |||||
| } | |||||
| .product-wishlist { | |||||
| border-top: 1px solid #86b04b; | |||||
| padding: 25px 0; | |||||
| } | |||||
| .btn-primary { | .btn-primary { | ||||
| background: transparent; | background: transparent; | ||||
| color: $sw-color-brand-primary; | color: $sw-color-brand-primary; | ||||
| @@ -108,5 +126,11 @@ | |||||
| color: #fff; | color: #fff; | ||||
| } | } | ||||
| } | } | ||||
| .product-wishlist-btn-content { | |||||
| text-decoration: none; | |||||
| &:hover { | |||||
| text-decoration: underline; | |||||
| } | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,46 @@ | |||||
| {% sw_extends '@Storefront/storefront/component/buy-widget/buy-widget-price.html.twig' %} | |||||
| {% block buy_widget_price_content %} | |||||
| {% set listPrice = price.listPrice %} | |||||
| <p class="product-detail-price{% if listPrice.percentage > 0 %} with-list-price{% endif %}"> | |||||
| {{ price.unitPrice|currency }}{{ "general.star"|trans|sw_sanitize }} | |||||
| </p> | |||||
| {% set weekProductCount = 0 %} | |||||
| {% if (product.customFields.custom_weightlossplan_day1_image != null) %}{% set weekProductCount = weekProductCount + 1 %}{% endif %} | |||||
| {% if (product.customFields.custom_weightlossplan_day2_image != null) %}{% set weekProductCount = weekProductCount + 1 %}{% endif %} | |||||
| {% if (product.customFields.custom_weightlossplan_day3_image != null) %}{% set weekProductCount = weekProductCount + 1 %}{% endif %} | |||||
| {% if (product.customFields.custom_weightlossplan_day4_image != null) %}{% set weekProductCount = weekProductCount + 1 %}{% endif %} | |||||
| {% if (product.customFields.custom_weightlossplan_day5_image != null) %}{% set weekProductCount = weekProductCount + 1 %}{% endif %} | |||||
| {% if (product.customFields.custom_weightlossplan_day6_image != null) %}{% set weekProductCount = weekProductCount + 1 %}{% endif %} | |||||
| {% if weekProductCount >= 1 %} | |||||
| <span class="spwn-week-count"><small>{{ (price.unitPrice / weekProductCount) | json_encode() | round(2) | number_format(2, ',', '.') }} € pro Tag</small></span> | |||||
| {% endif %} | |||||
| {% if listPrice.percentage > 0 %} | |||||
| {% block buy_widget_was_price %} | |||||
| {% block buy_widget_was_price_badge %} | |||||
| <span class="list-price-badge">%</span> | |||||
| {% endblock %} | |||||
| {% set afterListPriceSnippetExists = "listing.afterListPrice"|trans|length > 0 %} | |||||
| {% set beforeListPriceSnippetExists = "listing.beforeListPrice"|trans|length > 0 %} | |||||
| {% block buy_widget_was_price_wrapper %} | |||||
| <span class="product-detail-list-price-wrapper"> | |||||
| {% if beforeListPriceSnippetExists %}{{"listing.beforeListPrice"|trans|trim}}{% endif %} | |||||
| <span{% if not (afterListPriceSnippetExists or beforeListPriceSnippetExists) %} class="list-price-price"{% endif %}>{{ listPrice.price|currency }}{{ "general.star"|trans|sw_sanitize }}</span> | |||||
| {% if afterListPriceSnippetExists %} | |||||
| {{"listing.afterListPrice"|trans|trim}} | |||||
| {% endif %} | |||||
| <span class="list-price-percentage">{{ "detail.listPricePercentage"|trans({'%price%': listPrice.percentage })|sw_sanitize }}</span> | |||||
| </span> | |||||
| {% endblock %} | |||||
| {% endblock %} | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| @@ -1,21 +1,209 @@ | |||||
| {% sw_extends '@Storefront/storefront/component/buy-widget/buy-widget.html.twig' %} | {% sw_extends '@Storefront/storefront/component/buy-widget/buy-widget.html.twig' %} | ||||
| {% block buy_widget_price %} | |||||
| <div class="product-detail-price-container"> | |||||
| {% if page.product.translated.customFields.deposittype %} | |||||
| <div class="product-detail-deposittype"> | |||||
| {{ page.product.translated.customFields.deposittype }} | |||||
| </div> | |||||
| {% block buy_widget %} | |||||
| <div class="product-detail-buy{% if elementId %}-{{ elementId }}{% endif %} js-magnifier-zoom-image-container"> | |||||
| {% block buy_widget_rich_snippets %} | |||||
| {% block buy_widget_rich_snippets_brand %} | |||||
| {% if product.manufacturer %} | |||||
| <meta itemprop="brand" | |||||
| content="{{ product.manufacturer.translated.name }}"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_rich_snippets_gtin13 %} | |||||
| {% if product.ean %} | |||||
| <meta itemprop="gtin13" | |||||
| content="{{ product.ean }}"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_rich_snippets_mpn %} | |||||
| {% if product.manufacturerNumber %} | |||||
| <meta itemprop="mpn" | |||||
| content="{{ product.manufacturerNumber }}"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_rich_snippets_weight %} | |||||
| {% if product.weight %} | |||||
| <meta itemprop="weight" | |||||
| content="{{ product.weight }} kg"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_rich_snippets_height %} | |||||
| {% if product.height %} | |||||
| <meta itemprop="height" | |||||
| content="{{ product.height }} mm"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_rich_snippets_width %} | |||||
| {% if product.width %} | |||||
| <meta itemprop="width" | |||||
| content="{{ product.width }} mm"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_rich_snippets_depth %} | |||||
| {% if product.length %} | |||||
| <meta itemprop="depth" | |||||
| content="{{ product.length }} mm"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_rich_snippets_release_date %} | |||||
| <meta itemprop="releaseDate" | |||||
| content="{{ product.releaseDate|format_date(pattern="Y-MM-dd", locale=app.request.locale) }}"/> | |||||
| {% endblock %} | |||||
| {% endblock %} | |||||
| {% if not feature('FEATURE_NEXT_16992') %} | |||||
| {# @deprecated tag:v6.5.0 tag:)(FEATURE_NEXT_16992) - Block will be removed in v6.5.0 #} | |||||
| {% block buy_widget_not_available %} | |||||
| {% endblock %} | |||||
| {% endif %} | {% endif %} | ||||
| {{ parent() }} | |||||
| {% if page.product.translated.customFields.deposit %} | |||||
| {% set deposit = page.product.translated.customFields.deposit|currency %} | |||||
| <div class="product-detail-deposit"> | |||||
| {{ "FlowsiteDepositSystemBasic.plusDeposit"|trans({ | |||||
| '%deposit%': deposit | |||||
| })|sw_sanitize }} | |||||
| {% block buy_widget_buy_container %} | |||||
| <div itemprop="offers" | |||||
| itemscope | |||||
| itemtype="{% if product.calculatedPrices|length > 1 %}http://schema.org/AggregateOffer{% else %}http://schema.org/Offer{% endif %}"> | |||||
| {% block buy_widget_data %} | |||||
| {% block buy_widget_data_rich_snippet_url %} | |||||
| <meta itemprop="url" | |||||
| content="{{ seoUrl('frontend.detail.page', { productId: product.id }) }}"/> | |||||
| {% endblock %} | |||||
| {% block buy_widget_data_rich_snippet_price_range %} | |||||
| {% if product.calculatedPrices|length > 1 %} | |||||
| {% set lowestPrice = false %} | |||||
| {% set highestPrice = false %} | |||||
| {% for price in product.calculatedPrices %} | |||||
| {% if not lowestPrice or price.unitPrice < lowestPrice %} | |||||
| {% set lowestPrice = price.unitPrice %} | |||||
| {% endif %} | |||||
| {% if not highestPrice or price.unitPrice > highestPrice %} | |||||
| {% set highestPrice = price.unitPrice %} | |||||
| {% endif %} | |||||
| {% endfor %} | |||||
| <meta itemprop="lowPrice" content="{{ lowestPrice }}"/> | |||||
| <meta itemprop="highPrice" content="{{ highestPrice }}"/> | |||||
| <meta itemprop="offerCount" content="{{ product.calculatedPrices|length }}"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_data_rich_snippet_price_currency %} | |||||
| <meta itemprop="priceCurrency" | |||||
| content="{{ context.currency.translated.shortName }}"/> | |||||
| {% endblock %} | |||||
| {% block buy_widget_price %} | |||||
| <div class="product-detail-price-container"> | |||||
| {% sw_include '@Storefront/storefront/component/buy-widget/buy-widget-price.html.twig' %} | |||||
| </div> | |||||
| {% endblock %} | |||||
| {% block buy_widget_tax %} | |||||
| <div class="product-detail-tax-container"> | |||||
| {% if context.taxState == "gross" %} | |||||
| {% set taxText = "general.grossTaxInformation"|trans|sw_sanitize %} | |||||
| {% else %} | |||||
| {% set taxText = "general.netTaxInformation"|trans|sw_sanitize %} | |||||
| {% endif %} | |||||
| <p class="product-detail-tax"> | |||||
| {% block buy_widget_tax_link %} | |||||
| <a class="product-detail-tax-link" | |||||
| href="{{ path('frontend.cms.page',{ id: config('core.basicInformation.shippingPaymentInfoPage') }) }}" | |||||
| title="{{ taxText }}" | |||||
| data-toggle="modal" | |||||
| data-url="{{ path('frontend.cms.page',{ id: config('core.basicInformation.shippingPaymentInfoPage') }) }}"> | |||||
| {{ taxText }} | |||||
| </a> | |||||
| {% endblock %} | |||||
| </p> | |||||
| </div> | |||||
| {% endblock %} | |||||
| {% block buy_widget_deposit %} | |||||
| {% if page.product.translated.customFields.deposit %} | |||||
| {% set deposit = page.product.translated.customFields.deposit|currency %} | |||||
| <div class="product-detail-deposit"> | |||||
| {{ "FlowsiteDepositSystemBasic.plusDeposit"|trans({ | |||||
| '%deposit%': deposit | |||||
| })|sw_sanitize }} | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% set remoteClickOptions = { | |||||
| selector: "#review-tab-" ~ product.id, | |||||
| scrollToElement: true | |||||
| } %} | |||||
| {% set reviewTabHref = "#review-tab-" ~ product.id ~ "-pane" %} | |||||
| {% block buy_widget_reviews %} | |||||
| {% if product.ratingAverage > 0 and totalReviews > 0 and config('core.listing.showReview') %} | |||||
| <div class="product-detail-reviews"> | |||||
| {% sw_include '@Storefront/storefront/component/review/rating.html.twig' with { | |||||
| points: product.ratingAverage, | |||||
| style: 'text-primary' | |||||
| } %} | |||||
| <a data-toggle="tab" | |||||
| class="product-detail-reviews-link" | |||||
| data-offcanvas-tabs="true" | |||||
| data-remote-click="true" | |||||
| data-remote-click-options='{{ remoteClickOptions|json_encode }}' | |||||
| href="{{ reviewTabHref }}" | |||||
| aria-controls="review-tab-pane"> | |||||
| {{ totalReviews }} | |||||
| {{ "detail.reviewLinkText"|trans({'%count%': totalReviews})|sw_sanitize }} | |||||
| </a> | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_configurator_include %} | |||||
| {% if product.parentId and configuratorSettings|length > 0 %} | |||||
| <div class="product-detail-configurator-container"> | |||||
| {% sw_include '@Storefront/storefront/component/buy-widget/configurator.html.twig' %} | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block buy_widget_buy_form %} | |||||
| {% if product.active %} | |||||
| <div class="product-detail-form-container"> | |||||
| {% sw_include '@Storefront/storefront/component/buy-widget/buy-widget-form.html.twig' %} | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| </div> | </div> | ||||
| {% endblock %} | |||||
| {% block buy_widget_delivery_informations %} | |||||
| <div class="product-detail-delivery-information"> | |||||
| {% sw_include '@Storefront/storefront/component/delivery-information.html.twig' %} | |||||
| </div> | |||||
| {% endblock %} | |||||
| {% if config('core.cart.wishlistEnabled') %} | |||||
| {% block buy_widget_wishlist %} | |||||
| {% sw_include '@Storefront/storefront/component/product/card/wishlist.html.twig' with { | |||||
| showText: true, | |||||
| size: 'md', | |||||
| productId: product.id | |||||
| } %} | |||||
| {% endblock %} | |||||
| {% endif %} | {% endif %} | ||||
| {% block buy_widget_ordernumber_container %} | |||||
| {% endblock %} | |||||
| </div> | </div> | ||||
| {% endblock %} | {% endblock %} | ||||
| @@ -61,3 +61,6 @@ | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| {% endblock %} | {% endblock %} | ||||
| {% block page_checkout_cart_shipping_costs %} | |||||
| {% endblock %} | |||||
| @@ -0,0 +1,35 @@ | |||||
| {% sw_extends '@Storefront/storefront/page/product-detail/buy-widget-price.html.twig' %} | |||||
| {% block page_product_detail_price_content %} | |||||
| {% set listPrice = price.listPrice %} | |||||
| <p class="product-detail-price{% if listPrice.percentage > 0 %} with-list-price{% endif %}"> | |||||
| {{ price.unitPrice|currency }}{{ "general.star"|trans|sw_sanitize }} | |||||
| </p> | |||||
| {% if listPrice.percentage > 0 %} | |||||
| {% block page_product_detail_was_price %} | |||||
| {% block page_product_detail_was_price_badge %} | |||||
| <span class="list-price-badge">%</span> | |||||
| {% endblock %} | |||||
| {% set afterListPriceSnippetExists = "listing.afterListPrice"|trans|length > 0 %} | |||||
| {% set beforeListPriceSnippetExists = "listing.beforeListPrice"|trans|length > 0 %} | |||||
| {% block page_product_detail_was_price_wrapper %} | |||||
| <span class="product-detail-list-price-wrapper"> | |||||
| {% if beforeListPriceSnippetExists %}{{"listing.beforeListPrice"|trans|trim}}{% endif %} | |||||
| <span{% if not (afterListPriceSnippetExists or beforeListPriceSnippetExists) %} class="list-price-price"{% endif %}>{{ listPrice.price|currency }}{{ "general.star"|trans|sw_sanitize }}</span> | |||||
| {% if afterListPriceSnippetExists %} | |||||
| {{"listing.afterListPrice"|trans|trim}} | |||||
| {% endif %} | |||||
| <span class="list-price-percentage">{{ "detail.listPricePercentage"|trans({'%price%': listPrice.percentage })|sw_sanitize }}</span> | |||||
| </span> | |||||
| {% endblock %} | |||||
| {% endblock %} | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| @@ -0,0 +1,207 @@ | |||||
| {% sw_extends '@Storefront/storefront/page/product-detail/buy-widget.html.twig' %} | |||||
| {% block page_product_detail_buy_inner %} | |||||
| <div class="js-magnifier-zoom-image-container"> | |||||
| {% block page_product_detail_rich_snippets %} | |||||
| {% block page_product_detail_rich_snippets_brand %} | |||||
| {% if page.product.manufacturer %} | |||||
| <meta itemprop="brand" | |||||
| content="{{ page.product.manufacturer.translated.name }}"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_rich_snippets_gtin13 %} | |||||
| {% if page.product.ean %} | |||||
| <meta itemprop="gtin13" | |||||
| content="{{ page.product.ean }}"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_rich_snippets_mpn %} | |||||
| {% if page.product.manufacturerNumber %} | |||||
| <meta itemprop="mpn" | |||||
| content="{{ page.product.manufacturerNumber }}"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_rich_snippets_weight %} | |||||
| {% if page.product.weight %} | |||||
| <meta itemprop="weight" | |||||
| content="{{ page.product.weight }} kg"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_rich_snippets_height %} | |||||
| {% if page.product.height %} | |||||
| <meta itemprop="height" | |||||
| content="{{ page.product.height }} mm"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_rich_snippets_width %} | |||||
| {% if page.product.width %} | |||||
| <meta itemprop="width" | |||||
| content="{{ page.product.width }} mm"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_rich_snippets_depth %} | |||||
| {% if page.product.length %} | |||||
| <meta itemprop="depth" | |||||
| content="{{ page.product.length }} mm"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_rich_snippets_release_date %} | |||||
| <meta itemprop="releaseDate" | |||||
| content="{{ page.product.releaseDate|format_date(pattern="Y-MM-dd", locale=app.request.locale) }}"/> | |||||
| {% endblock %} | |||||
| {% endblock %} | |||||
| {% if not feature('FEATURE_NEXT_16992') %} | |||||
| {# @deprecated tag:v6.5.0 tag:)(FEATURE_NEXT_16992) - Block will be removed in v6.5.0 #} | |||||
| {% block page_product_detail_not_available %} | |||||
| {% endblock %} | |||||
| {% endif %} | |||||
| {% block page_product_detail_buy_container %} | |||||
| <div itemprop="offers" | |||||
| itemscope | |||||
| itemtype="{% if page.product.calculatedPrices|length > 1 %}http://schema.org/AggregateOffer{% else %}http://schema.org/Offer{% endif %}"> | |||||
| {% block page_product_detail_data %} | |||||
| {% block page_product_detail_data_rich_snippet_url %} | |||||
| <meta itemprop="url" | |||||
| content="{{ seoUrl('frontend.detail.page', { productId: page.product.id }) }}"/> | |||||
| {% endblock %} | |||||
| {% block page_product_detail_data_rich_snippet_price_range %} | |||||
| {% if page.product.calculatedPrices|length > 1 %} | |||||
| {% set lowestPrice = false %} | |||||
| {% set highestPrice = false %} | |||||
| {% for price in page.product.calculatedPrices %} | |||||
| {% if not lowestPrice or price.unitPrice < lowestPrice %} | |||||
| {% set lowestPrice = price.unitPrice %} | |||||
| {% endif %} | |||||
| {% if not highestPrice or price.unitPrice > highestPrice %} | |||||
| {% set highestPrice = price.unitPrice %} | |||||
| {% endif %} | |||||
| {% endfor %} | |||||
| <meta itemprop="lowPrice" content="{{ lowestPrice }}"/> | |||||
| <meta itemprop="highPrice" content="{{ highestPrice }}"/> | |||||
| <meta itemprop="offerCount" content="{{ page.product.calculatedPrices|length }}"/> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_data_rich_snippet_price_currency %} | |||||
| <meta itemprop="priceCurrency" | |||||
| content="{{ context.currency.translated.shortName }}"/> | |||||
| {% endblock %} | |||||
| {% block page_product_detail_price %} | |||||
| <div class="product-detail-price-container"> | |||||
| {% sw_include '@Storefront/storefront/page/product-detail/buy-widget-price.html.twig' %} | |||||
| </div> | |||||
| {% endblock %} | |||||
| {% block page_product_detail_tax %} | |||||
| <div class="product-detail-tax-container"> | |||||
| {% if context.taxState == "gross" %} | |||||
| {% set taxText = "general.grossTaxInformation"|trans|sw_sanitize %} | |||||
| {% else %} | |||||
| {% set taxText = "general.netTaxInformation"|trans|sw_sanitize %} | |||||
| {% endif %} | |||||
| <p class="product-detail-tax"> | |||||
| {% block page_product_detail_tax_link %} | |||||
| <a class="product-detail-tax-link" | |||||
| href="{{ path('frontend.cms.page',{ id: config('core.basicInformation.shippingPaymentInfoPage') }) }}" | |||||
| title="{{ taxText }}" | |||||
| data-toggle="modal" | |||||
| data-url="{{ path('frontend.cms.page',{ id: config('core.basicInformation.shippingPaymentInfoPage') }) }}"> | |||||
| {{ taxText }} | |||||
| </a> | |||||
| {% endblock %} | |||||
| </p> | |||||
| </div> | |||||
| {% endblock %} | |||||
| {% block page_product_detail_deposit %} | |||||
| {% if page.product.translated.customFields.deposit %} | |||||
| {% set deposit = page.product.translated.customFields.deposit|currency %} | |||||
| <div class="product-detail-deposit"> | |||||
| {{ "FlowsiteDepositSystemBasic.plusDeposit"|trans({ | |||||
| '%deposit%': deposit | |||||
| })|sw_sanitize }} | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% set remoteClickOptions = { | |||||
| selector: "#review-tab", | |||||
| scrollToElement: true | |||||
| } %} | |||||
| {% block page_product_detail_reviews %} | |||||
| {% if page.product.ratingAverage > 0 and page.reviews.totalReviews > 0 and config('core.listing.showReview') %} | |||||
| <div class="product-detail-reviews"> | |||||
| {% sw_include '@Storefront/storefront/component/review/rating.html.twig' with { | |||||
| points: page.product.ratingAverage, | |||||
| style: 'text-primary' | |||||
| } %} | |||||
| <a data-toggle="tab" | |||||
| class="product-detail-reviews-link" | |||||
| data-offcanvas-tabs="true" | |||||
| data-remote-click="true" | |||||
| data-remote-click-options='{{ remoteClickOptions|json_encode }}' | |||||
| href="#review-tab-pane" | |||||
| aria-controls="review-tab-pane"> | |||||
| {{ page.reviews.totalReviews }} | |||||
| {{ "detail.reviewLinkText"|trans({'%count%': page.reviews.totalReviews})|sw_sanitize }} | |||||
| </a> | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_configurator_include %} | |||||
| {% if page.product.parentId and page.configuratorSettings|length > 0 %} | |||||
| <div class="product-detail-configurator-container"> | |||||
| {% sw_include '@Storefront/storefront/page/product-detail/configurator.html.twig' %} | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block page_product_detail_buy_form %} | |||||
| {% if page.product.active %} | |||||
| <div class="product-detail-form-container"> | |||||
| {% sw_include '@Storefront/storefront/page/product-detail/buy-widget-form.html.twig' %} | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| </div> | |||||
| {% endblock %} | |||||
| {% block page_product_detail_delivery_informations %} | |||||
| <div class="product-detail-delivery-information"> | |||||
| {% sw_include '@Storefront/storefront/component/delivery-information.html.twig' %} | |||||
| </div> | |||||
| {% endblock %} | |||||
| {% if config('core.cart.wishlistEnabled') %} | |||||
| {% block page_product_detail_wishlist %} | |||||
| {% sw_include '@Storefront/storefront/component/product/card/wishlist.html.twig' with { | |||||
| showText: true, | |||||
| size: 'md', | |||||
| productId: page.product.id | |||||
| } %} | |||||
| {% endblock %} | |||||
| {% endif %} | |||||
| {% block page_product_detail_ordernumber_container %} | |||||
| {% endblock %} | |||||
| </div> | |||||
| {% endblock %} | |||||
| @@ -0,0 +1,39 @@ | |||||
| {% sw_extends '@Storefront/storefront/page/product-detail/tabs.html.twig' %} | |||||
| {% block zen_page_product_detail_tabs_navigation_custom_tab_global %} | |||||
| {% if page.product.translated.customFields.custom_nutrition_energy_kcal|length > 0 %} | |||||
| {% set customTab = { | |||||
| 'translated': { | |||||
| title: "zentheme.atmos.content.customTabTitle"|trans({"%placeholder%": config('zenitPlatformAtmos.config.customTabTitle')}), | |||||
| text: "zentheme.atmos.content.customTabText"|trans({"%placeholder%": config('zenitPlatformAtmos.config.customTabText')}) | |||||
| } | |||||
| } %} | |||||
| <li class="nav-item"> | |||||
| <a class="nav-link product-detail-tab-navigation-link" | |||||
| id="custom-field-global-tab" | |||||
| data-toggle="tab" | |||||
| data-offcanvas-tabs="true" | |||||
| href="#custom-field-global-tab-pane" | |||||
| role="tab" | |||||
| aria-controls="custom-field-global-tab-pane" | |||||
| aria-selected="false"> | |||||
| <span>{{ customTab.translated.title }}</span> | |||||
| <span class="product-detail-tab-navigation-icon"> | |||||
| {% sw_icon 'arrow-medium-right' style {'pack':'solid'} %} | |||||
| </span> | |||||
| </a> | |||||
| </li> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| {% block zen_page_product_detail_tabs_content_custom_tab_global %} | |||||
| {% if page.product.translated.customFields.custom_nutrition_energy_kcal|length > 0 %} | |||||
| <div class="tab-pane fade show" | |||||
| id="custom-field-global-tab-pane" | |||||
| role="tabpanel" | |||||
| aria-labelledby="custom-field-global-tab"> | |||||
| {% sw_include '@Storefront/storefront/page/product-detail/zen-custom-global-tab.html.twig' %} | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| @@ -0,0 +1,89 @@ | |||||
| {% sw_extends '@Storefront/storefront/utilities/offcanvas.html.twig' %} | |||||
| {% block utilities_offcanvas_content %} | |||||
| {% block zen_page_product_detail_custom_field_global_container %} | |||||
| <div class="product-detail-custom-field1 tab-pane-container"> | |||||
| {% set customTab = { | |||||
| 'translated': { | |||||
| title: "zentheme.atmos.content.customTabTitle"|trans({"%placeholder%": config('zenitPlatformAtmos.config.customTabTitle')}), | |||||
| text: "zentheme.atmos.content.customTabText"|trans({"%placeholder%": config('zenitPlatformAtmos.config.customTabText')}) | |||||
| } | |||||
| } %} | |||||
| {% block zen_page_product_detail_custom_field_global_content %} | |||||
| {% if page.product.translated.customFields.custom_nutrition_energy_kcal|length > 0 %} | |||||
| <h3>{{ "customFields.custom_nutrition"|trans }} pro 100 {% if (page.product.unit.name == "kg") or (page.product.unit.name == "g") %}g{% elseif page.product.unit.name == "Liter" %}ml{% endif %}:</h3> | |||||
| <table class="table table-striped product-detail-properties-table"> | |||||
| <tbody> | |||||
| <tr class="properties-row"> | |||||
| <th class="properties-label"> | |||||
| {{ "customFields.custom_nutrition_energy_kcal"|trans }} | |||||
| </th> | |||||
| <td class="properties-value"> | |||||
| {{ page.product.translated.customFields.custom_nutrition_energy_kcal|raw }} kcal / {{ page.product.translated.customFields.custom_nutrition_energy_kj|raw }} kJ | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="properties-row"> | |||||
| <th class="properties-label"> | |||||
| {{ "customFields.custom_nutrition_fat"|trans }} | |||||
| </th> | |||||
| <td class="properties-value"> | |||||
| {{ page.product.translated.customFields.custom_nutrition_fat|raw|number_format(1, ',', '.') }} g | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="properties-row"> | |||||
| <th class="properties-label"> | |||||
| {{ "customFields.custom_nutrition_fattyacids"|trans }} | |||||
| </th> | |||||
| <td class="properties-value"> | |||||
| {{ page.product.translated.customFields.custom_nutrition_fattyacids|raw|number_format(1, ',', '.') }} g | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="properties-row"> | |||||
| <th class="properties-label"> | |||||
| {{ "customFields.custom_nutrition_carbohydrates"|trans }} | |||||
| </th> | |||||
| <td class="properties-value"> | |||||
| {{ page.product.translated.customFields.custom_nutrition_carbohydrates|raw|number_format(1, ',', '.') }} g | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="properties-row"> | |||||
| <th class="properties-label"> | |||||
| {{ "customFields.custom_nutrition_sugar"|trans }} | |||||
| </th> | |||||
| <td class="properties-value"> | |||||
| {{ page.product.translated.customFields.custom_nutrition_sugar|raw|number_format(1, ',', '.') }} g | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="properties-row"> | |||||
| <th class="properties-label"> | |||||
| {{ "customFields.custom_nutrition_protein"|trans }} | |||||
| </th> | |||||
| <td class="properties-value"> | |||||
| {{ page.product.translated.customFields.custom_nutrition_protein|raw|number_format(1, ',', '.') }} g | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="properties-row"> | |||||
| <th class="properties-label"> | |||||
| {{ "customFields.custom_nutrition_salt"|trans }} | |||||
| </th> | |||||
| <td class="properties-value"> | |||||
| {{ page.product.translated.customFields.custom_nutrition_salt|raw|number_format(2, ',', '.') }} g | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="properties-row"> | |||||
| <th class="properties-label"> | |||||
| {{ "customFields.custom_nutrition_be"|trans }} | |||||
| </th> | |||||
| <td class="properties-value"> | |||||
| {{ page.product.translated.customFields.custom_nutrition_be|raw|number_format(1, ',', '.') }} BE | |||||
| </td> | |||||
| </tr> | |||||
| </tbody> | |||||
| </table> | |||||
| {% endif %} | |||||
| {% endblock %} | |||||
| </div> | |||||
| {% endblock %} | |||||
| {% endblock %} | |||||