app/template/default/Product/detail.twig line 1

Open in your IDE?
  1. {% extends 'default_frame.twig' %}
  2. {% set body_class = 'product_page' %}
  3. {% block stylesheet %}
  4.     <style>
  5.         .slick-slider {
  6.             margin-bottom: 30px;
  7.         }
  8.         .slick-dots {
  9.             position: absolute;
  10.             bottom: -45px;
  11.             display: block;
  12.             width: 100%;
  13.             padding: 0;
  14.             list-style: none;
  15.             text-align: center;
  16.         }
  17.         .slick-dots li {
  18.             position: relative;
  19.             display: inline-block;
  20.             width: 20px;
  21.             height: 20px;
  22.             margin: 0 5px;
  23.             padding: 0;
  24.             cursor: pointer;
  25.         }
  26.         .slick-dots li button {
  27.             font-size: 0;
  28.             line-height: 0;
  29.             display: block;
  30.             width: 20px;
  31.             height: 20px;
  32.             padding: 5px;
  33.             cursor: pointer;
  34.             color: transparent;
  35.             border: 0;
  36.             outline: none;
  37.             background: transparent;
  38.         }
  39.         .slick-dots li button:hover,
  40.         .slick-dots li button:focus {
  41.             outline: none;
  42.         }
  43.         .slick-dots li button:hover:before,
  44.         .slick-dots li button:focus:before {
  45.             opacity: 1;
  46.         }
  47.         .slick-dots li button:before {
  48.             content: " ";
  49.             line-height: 20px;
  50.             position: absolute;
  51.             top: 0;
  52.             left: 0;
  53.             width: 12px;
  54.             height: 12px;
  55.             text-align: center;
  56.             opacity: .25;
  57.             background-color: #719933;
  58.             border-radius: 50%;
  59.         }
  60.         .slick-dots li.slick-active button:before {
  61.             opacity: .75;
  62.             background-color: #719933;
  63.         }
  64.         .slick-dots li button.thumbnail img {
  65.             width: 0;
  66.             height: 0;
  67.         }
  68.         .other_recommend_area .slick-prev:before {
  69.             content: '<';
  70.             color: green;
  71.             font-weight: bold;
  72.         }
  73.         .other_recommend_area .slick-next:before {
  74.             content: '>';
  75.             color: green;
  76.             font-weight: bold;
  77.         }
  78.         .other_recommend_area .slick-slide{
  79.             padding: 0 8px 0 0;
  80.         }
  81.         .ec-productRole .ec-productRole__description{
  82.             margin-top: 20px;
  83.             font-size: 14px;
  84.         }
  85.         .ec-productRole .ec-productRole__description .sub_area:not(:first-child){
  86.             margin-top: 20px;
  87.         }
  88.     </style>
  89. {% endblock %}
  90. {% block javascript %}
  91.     <script>
  92.         eccube.classCategories = {{ class_categories_as_json(Product)|raw }};
  93.         // 規格2に選択肢を割り当てる。
  94.         function fnSetClassCategories(form, classcat_id2_selected) {
  95.             var $form = $(form);
  96.             var product_id = $form.find('input[name=product_id]').val();
  97.             var $sele1 = $form.find('select[name=classcategory_id1]');
  98.             var $sele2 = $form.find('select[name=classcategory_id2]');
  99.             eccube.setClassCategories($form, product_id, $sele1, $sele2, classcat_id2_selected);
  100.         }
  101.         {% if form.classcategory_id2 is defined %}
  102.         fnSetClassCategories(
  103.             $('#form1'), {{ form.classcategory_id2.vars.value|json_encode|raw }}
  104.         );
  105.         {% elseif form.classcategory_id1 is defined %}
  106.         eccube.checkStock($('#form1'), {{ Product.id }}, {{ form.classcategory_id1.vars.value|json_encode|raw }}, null);
  107.         {% endif %}
  108.     </script>
  109.     <script>
  110.         function checkBreakPoint() {
  111.             var windowW = $(window).width();
  112.             if(windowW < 768){
  113.                 $('.other_recommend_area').not('.slick-initialized').slick({
  114.                     dots: false,
  115.                     arrows: true,
  116.                     slidesToShow:3,
  117.                     centerMode: false,
  118.                 });
  119.             }else{
  120.                 $('.other_recommend_area.slick-initialized').slick('unslick');
  121.             }
  122.         }
  123.         // ウインドウがリサイズする度にチェック
  124.         $(window).resize(function(){
  125.             checkBreakPoint();
  126.         });
  127.         // 初回チェック
  128.         checkBreakPoint();
  129.         $(function() {
  130.             //目次アコーディオン
  131.             $( '.product_contents' ).show();
  132.             $( '.product-contents__area h3' ).addClass("active").click( function() {
  133.                 $( '.product_contents' ).slideToggle( 200 );
  134.                 $( this ).toggleClass('close');
  135.             });
  136.             //関連商品アコーディオン
  137.             $( '.other_recommend_container' ).show();
  138.             $( '#whobought_area h2' ).addClass("active").click( function() {
  139.                 $( '.other_recommend_container' ).slideToggle( 200 );
  140.                 $( this ).toggleClass('close');
  141.             });
  142.             // bfcache無効化
  143.             $(window).bind('pageshow', function(event) {
  144.                 if (event.originalEvent.persisted) {
  145.                     location.reload(true);
  146.                 }
  147.             });
  148.             // Core Web Vital の Cumulative Layout Shift(CLS)対策のため
  149.             // img タグに width, height が付与されている.
  150.             // 630px 未満の画面サイズでは縦横比が壊れるための対策
  151.             // see https://github.com/EC-CUBE/ec-cube/pull/5023
  152.             //$('.ec-grid2__cell').hide();
  153.             //var removeSize = function () {
  154.             //    $('.slide-item').height('');
  155.             //    $('.slide-item img')
  156.             //        .removeAttr('width')
  157.             //        .removeAttr('height')
  158.             //        .removeAttr('style');
  159.             //};
  160.             //var slickInitial = function(slick) {
  161.             //    $('.ec-grid2__cell').fadeIn(1500);
  162.             //    var baseHeight = $(slick.target).height();
  163.             //    var baseWidth = $(slick.target).width();
  164.             //    var rate = baseWidth / baseHeight;
  165.             //    $('.slide-item').height(baseHeight * rate); // 余白を削除する
  166.             //    // transform を使用することでCLSの影響を受けないようにする
  167.             //    $('.slide-item img')
  168.             //        .css(
  169.             //            {
  170.             //                'transform-origin': 'top left',
  171.             //                'transform': 'scaleY(' + rate + ')',
  172.             //                'transition': 'transform .1s'
  173.             //            }
  174.             //        );
  175.             //    // 正しいサイズに近くなったら属性を解除する
  176.             //    setTimeout(removeSize, 500);
  177.             //};
  178.             //$('.item_visual').on('init', slickInitial);
  179.             //// リサイズ時は CLS の影響を受けないため属性を解除する
  180.             //$(window).resize(removeSize);
  181.             //$('.item_visual').slick({
  182.             //    dots: true,
  183.             //    arrows: false,
  184.             //});
  185.         });
  186.     </script>
  187.     <script>
  188.         $(function() {
  189.             $('.add-cart').on('click', function(event) {
  190.                 {% if form.classcategory_id1 is defined %}
  191.                 // 規格1フォームの必須チェック
  192.                 if ($('#classcategory_id1').val() == '__unselected' || $('#classcategory_id1').val() == '') {
  193.                     $('#classcategory_id1')[0].setCustomValidity('{{ '項目が選択されていません'|trans }}');
  194.                     return true;
  195.                 } else {
  196.                     $('#classcategory_id1')[0].setCustomValidity('');
  197.                 }
  198.                 {% endif %}
  199.                 {% if form.classcategory_id2 is defined %}
  200.                 // 規格2フォームの必須チェック
  201.                 if ($('#classcategory_id2').val() == '__unselected' || $('#classcategory_id2').val() == '') {
  202.                     $('#classcategory_id2')[0].setCustomValidity('{{ '項目が選択されていません'|trans }}');
  203.                     return true;
  204.                 } else {
  205.                     $('#classcategory_id2')[0].setCustomValidity('');
  206.                 }
  207.                 {% endif %}
  208.                 // 個数フォームのチェック
  209.                 if ($('#quantity').val() < 1) {
  210.                     $('#quantity')[0].setCustomValidity('{{ '1以上で入力してください。'|trans }}');
  211.                     return true;
  212.                 } else {
  213.                     $('#quantity')[0].setCustomValidity('');
  214.                 }
  215.                 event.preventDefault();
  216.                 $form = $('#form1');
  217.                 $.ajax({
  218.                     url: $form.attr('action'),
  219.                     type: $form.attr('method'),
  220.                     data: $form.serialize(),
  221.                     dataType: 'json',
  222.                     beforeSend: function(xhr, settings) {
  223.                         // Buttonを無効にする
  224.                         $('.add-cart').prop('disabled', true);
  225.                     }
  226.                 }).done(function(data) {
  227.                     // レスポンス内のメッセージをalertで表示
  228.                     $.each(data.messages, function() {
  229.                         $('#ec-modal-header').text(this);
  230.                     });
  231.                     $('.ec-modal').show()
  232.                     // カートブロックを更新する
  233.                     $.ajax({
  234.                         url: "{{ url('block_cart') }}",
  235.                         type: 'GET',
  236.                         dataType: 'html'
  237.                     }).done(function(html) {
  238.                         $('.ec-headerRole__cart').html(html);
  239.                     });
  240.                 }).fail(function(data) {
  241.                     alert('{{ 'カートへの追加に失敗しました。'|trans }}');
  242.                 }).always(function(data) {
  243.                     // Buttonを有効にする
  244.                     $('.add-cart').prop('disabled', false);
  245.                 });
  246.             });
  247.         });
  248.         $('.ec-modal-wrap').on('click', function(e) {
  249.             // モーダル内の処理は外側にバブリングさせない
  250.             e.stopPropagation();
  251.         });
  252.         $('.ec-modal-overlay, .ec-modal, .ec-modal-close, .ec-inlineBtn--cancel').on('click', function() {
  253.             $('.ec-modal').hide()
  254.         });
  255.     </script>
  256.     <script type="application/ld+json">
  257.     {
  258.         "@context": "https://schema.org/",
  259.         "@type": "Product",
  260.         "name": "{{ Product.name }}",
  261.         "image": [
  262.             {% for img in Product.ProductImage %}
  263.                 "{{ app.request.schemeAndHttpHost }}{{ asset(img, 'save_image') }}"{% if not loop.last %},{% endif %}
  264.             {% else %}
  265.                 "{{ app.request.schemeAndHttpHost }}{{ asset(''|no_image_product, 'save_image') }}"
  266.             {% endfor %}
  267.         ],
  268.         "description": "{{ Product.description_list | default(Product.description_detail) | replace({'\n': '', '\r': ''}) | slice(0,300) }}",
  269.         {% if Product.code_min %}
  270.         "sku": "{{ Product.code_min }}",
  271.         {% endif %}
  272.         "offers": {
  273.             "@type": "Offer",
  274.             "url": "{{ url('product_detail', {'id': Product.id}) }}",
  275.             "priceCurrency": "{{ eccube_config.currency }}",
  276.             "price": {{ Product.getPrice02IncTaxMin ? Product.getPrice02IncTaxMin : 0}},
  277.             "availability": "{{ Product.stock_find ? "InStock" : "OutOfStock" }}"
  278.         }
  279.     }
  280.     </script>
  281.     <script>
  282.         function tatiyomiwindow() {
  283.             var windowW = $(window).width();
  284.             var windowH = $(window).height();
  285.             window.open(
  286.                 "{{ url('stand_reading', {'id': Product.id}) }}", //url
  287.                 "_blank,'teltel'",   //新規ウィンドウにドキュメントを読み込む
  288.                 "width=windowW,height=windowH,menubar=0,toolbar=0"
  289.             )
  290.         };
  291.     </script>
  292. {% endblock %}
  293. {% block main %}
  294. <div class="ec-productRole">
  295.     <h2 class="title">{{ Product.name }}</h2>
  296.     <div class="ec-grid2">
  297.         <div class="ec-grid2__cell" id="detailphotobloc">
  298.             <div class="ec-sliderItemRole">
  299.                 <div class="item_visual">
  300.                     {% for ProductImage in Product.ProductImage %}
  301.                         <div class="slide-item"><img src="{{ asset(ProductImage, 'save_image') }}" alt="{{ loop.first ? Product.name : '' }}" width="550" height="550"{% if loop.index > 1 %} loading="lazy"{% endif %}></div>
  302.                     {% else %}
  303.                         <div class="slide-item"><img src="{{ asset(''|no_image_product, 'save_image') }}" alt="{{ loop.first ? Product.name : '' }}" width="550" height="550"></div>
  304.                     {% endfor %}
  305.                 </div>
  306.             </div>
  307.         </div>
  308.         <div class="ec-grid2__cell" id="detailrightbloc">
  309.             <div class="ec-productRole__profile">
  310.                 <div class="ec-productRole__title">
  311.                     <p class="subtitle">{{ Product.sub_name_up }}</p>
  312.                     <h3 class="ec-headingTitle">{{ Product.name }}</h3>
  313.                     <p class="subtitle">{{ Product.sub_name_down }}</p>
  314.                 </div>
  315.                 {# 通常価格 #}
  316.                 {% if Product.hasProductClass and Product.getPrice01Min is not null %}
  317.                     <div class="ec-productRole__priceRegular">
  318.                         {% if Product.getPrice01IncTaxMin == Product.getPrice01IncTaxMax %}
  319.                             <span class="ec-productRole__priceRegularPrice">{{ '通常価格'|trans }}:<span class="price01-default sale_price">{{ Product.getPrice01IncTaxMin|number_format}}</span>円</span>
  320.                             <span class="ec-productRole__priceRegularTax">(税込)</span>
  321.                         {% elseif Product.getPrice01Max is not null %}
  322.                             <span class="ec-productRole__priceRegularPrice">{{ '通常価格'|trans }}:<span class="price01-default sale_price">{{ Product.getPrice01IncTaxMin|number_format}}~ {{ Product.getPrice01IncTaxMax|number_format}}</span>円</span>
  323.                             <span class="ec-productRole__priceRegularTax">(税込)</span>
  324.                         {% endif %}
  325.                     </div>
  326.                 {% elseif Product.getPrice01Max is not null %}
  327.                     <div class="ec-productRole__priceRegular">
  328.                         <span class="ec-productRole__priceRegularPrice">{{ '通常価格'|trans }}:<span class="sale_price">{{ Product.getPrice01IncTaxMin|number_format}}</span>円</span>
  329.                         <span class="ec-productRole__priceRegularTax">(税込)</span>
  330.                     </div>
  331.                 {% endif %}
  332.                 {# 著者 #}
  333.                 {% if Product.author is not empty %}
  334.                     <div class="ec-productRole__author">
  335.                         {{ Product.author|nl2br }}
  336.                     </div>
  337.                 {% endif %}
  338.                 {# 商品コード #}
  339.                 {% if Product.code_min is not empty %}
  340.                     <div class="ec-productRole__code">
  341.                         ISBN: <span class="product-code-default">{{ Product.code_min }}{% if Product.code_min != Product.code_max %} ~ {{ Product.code_max }}{% endif %}</span>
  342.                     </div>
  343.                 {% endif %}
  344.                 {# 販売価格 #}
  345.                 <div class="ec-productRole__price">
  346.                     <div class="ec-price">
  347.                         <span class="ec-productRole__pricePrice">定価:
  348.                             {% if Product.hasProductClass %}
  349.                                 {% if Product.getPrice02IncTaxMin == Product.getPrice02IncTaxMax %}
  350.                                     <span class="ec-price__price price02-default"><span class="sale_price">{{ Product.getPrice02IncTaxMin|number_format}}</span>円</span>
  351.                                 {% else %}
  352.                                     <span class="ec-price__price price02-default"><span class="sale_price">{{ Product.getPrice02IncTaxMin|number_format}} ~ {{ Product.getPrice02IncTaxMax|number_format}}</span>円</span>
  353.                                 {% endif %}
  354.                             {% else %}
  355.                                 <span class="ec-price__price"><span class="sale_price">{{ Product.getPrice02IncTaxMin|number_format}}</span>円</span>
  356.                             {% endif %}
  357.                             <span class="ec-price__tax">(税込)</span>
  358.                         </span>
  359.                     </div>
  360.                 </div>
  361.                 <!--★ポイント★-->
  362.                 {#
  363.                 <!--{if $smarty.const.USE_POINT !== false}-->
  364.                     <div class="point">ポイント:
  365.                         <span id="point_default"><!--{strip}-->
  366.                             <!--{if $arrProduct.price02_min == $arrProduct.price02_max}-->
  367.                                 <!--{$arrProduct.price02_min|sfPrePoint:$arrProduct.point_rate|number_format}-->
  368.                             <!--{else}-->
  369.                                 <!--{if $arrProduct.price02_min|sfPrePoint:$arrProduct.point_rate == $arrProduct.price02_max|sfPrePoint:$arrProduct.point_rate}-->
  370.                                     <!--{$arrProduct.price02_min|sfPrePoint:$arrProduct.point_rate|number_format}-->
  371.                                 <!--{else}-->
  372.                                     <!--{$arrProduct.price02_min|sfPrePoint:$arrProduct.point_rate|number_format}-->~<!--{$arrProduct.price02_max|sfPrePoint:$arrProduct.point_rate|number_format}-->
  373.                                 <!--{/if}-->
  374.                             <!--{/if}-->
  375.                         <!--{/strip}--></span><span id="point_dynamic"></span>
  376.                         Pt
  377.                     </div>
  378.                 <!--{/if}-->
  379.                 #}
  380.             </div>
  381.             <div class="productRole__cartarea">
  382.                 <form action="{{ url('product_add_cart', {id:Product.id}) }}" method="post" id="form1" name="form1">
  383.                     {% if Product.stock_find %}
  384.                         <div class="ec-productRole__actions">
  385.                             {% if form.classcategory_id1 is defined %}
  386.                                 <div class="classlist">
  387.                                     <div class="ec-select">
  388.                                         {{ form_row(form.classcategory_id1) }}
  389.                                         {{ form_errors(form.classcategory_id1) }}
  390.                                     </div>
  391.                                     {% if form.classcategory_id2 is defined %}
  392.                                         <div class="ec-select">
  393.                                             {{ form_row(form.classcategory_id2) }}
  394.                                             {{ form_errors(form.classcategory_id2) }}
  395.                                         </div>
  396.                                     {% endif %}
  397.                                 </div>
  398.                             {% endif %}
  399.                             <div class="ec-numberInput"><span>数量:</span>
  400.                                 {{ form_widget(form.quantity) }}
  401.                                 {{ form_errors(form.quantity) }}
  402.                             </div>
  403.                         </div>
  404.                         <div class="ec-productRole__btn">
  405.                             <button type="submit" class="ec-blockBtn--action add-cart orange-btn small-btn">カゴに入れる</button>
  406.                         </div>
  407.                     {% else %}
  408.                         <div class="ec-productRole__btn">
  409.                             <div class="attention">
  410.                                 {% set targettag = [] %}
  411.                                 {% for tag in Product.Tags %}
  412.                                     {% set targettag = targettag|merge([tag.id]) %}
  413.                                 {% endfor %}
  414.                                 {% if '7' in targettag %}
  415.                                 申し訳ございませんが、本商品は絶版となりました。
  416.                                 {% elseif '6' in targettag %}
  417.                                 予約受付中です。
  418.                                 {% elseif '5' in targettag %}
  419.                                 この商品は発売前のため購入いただけません。
  420.                                 {% else %}
  421.                                 申し訳ございませんが、本商品は只今品切れ中です。
  422.                                 {% endif %}
  423.                             </div>
  424.                         </div>
  425.                     {% endif %}
  426.                     {{ form_rest(form) }}
  427.                 </form>
  428.                 <div class="ec-modal">
  429.                     <div class="ec-modal-overlay">
  430.                         <div class="ec-modal-wrap">
  431.                             <span class="ec-modal-close"><span class="ec-icon"><img src="{{ asset('assets/icon/cross-dark.svg') }}" alt=""/></span></span>
  432.                             <div id="ec-modal-header" class="text-center">{{ 'カートに追加しました。'|trans }}</div>
  433.                             <div class="ec-modal-box">
  434.                                 <div class="ec-role">
  435.                                     <span class="ec-inlineBtn--cancel">{{ 'お買い物を続ける'|trans }}</span>
  436.                                     <a href="{{ url('cart') }}" class="ec-inlineBtn--action">{{ 'カートへ進む'|trans }}</a>
  437.                                 </div>
  438.                             </div>
  439.                         </div>
  440.                     </div>
  441.                 </div>
  442.             </div>
  443.             <div class="sub_cart_area flex">
  444.                 <!--★定期購読-->
  445.                 {# 関連カテゴリ #}
  446.                 {% if Product.ProductCategories is not empty %}
  447.                     {% set break = false %}
  448.                     {% for ProductCategory in Product.ProductCategories if not break %}
  449.                         {% for Category in ProductCategory.Category.path %}
  450.                             {% if Category.id == 1 or Category.id == 2 %}
  451.                                 <div class="read_btn">
  452.                                     <a href="{{ url('kenkoukyoushitsu_teiki') }}">
  453.                                         <img class="hover_change_image" src="{{ asset('assets/img/button/btn_teiki.png', 'user_data') }}" alt="定期購読のご案内" />
  454.                                     </a>
  455.                                 </div>
  456.                                 {% set break = true %}
  457.                             {% endif %}
  458.                         {% endfor %}
  459.                     {% endfor %}
  460.                 {% endif %}
  461.                 <!--★立ち読み-->
  462.                 {% if Product.hasStandReadingImage %}
  463.                 <div class="read_btn">
  464.                     <a href=javascript:tatiyomiwindow()><img class="hover_change_image" src="{{ asset('assets/img/button/btn_read.png', 'user_data') }}" alt="立ち読みをする" /></a>
  465.                 </div>
  466.                 {% endif %}
  467.                 <!--★お気に入り登録★-->
  468.                 {% if BaseInfo.option_favorite_product %}
  469.                 <div class="favorite_btn">
  470.                     <form action="{{ url('product_add_favorite', {id:Product.id}) }}" method="post">
  471.                         <div class="ec-productRole__btn">
  472.                         {% if is_favorite == false %}
  473.                             <button type="submit" id="favorite" class="ec-blockBtn--cancel" aria-label="お気に入りに追加">
  474.                                 <img src="{{ asset('assets/img/button/btn_favorite_on.png', 'user_data') }}" alt="お気に入り登録済" />
  475.                             </button>
  476.                         {% else %}
  477.                             <button type="submit" id="favorite" class="ec-blockBtn--cancel" aria-label="お気に入りに追加済み" disabled="disabled">
  478.                                 <img src="{{ asset('assets/img/button/btn_favorite_add_on.png', 'user_data') }}" alt="お気に入り登録済" />
  479.                             </button>
  480.                         {% endif %}
  481.                         </div>
  482.                     </form>
  483.                 </div>
  484.                 {% endif %}
  485.             </div>
  486.             {# 商品説明 #}
  487.             <div class="ec-productRole__description main_comment">{{ Product.description_detail|raw|nl2br }}</div>
  488.         </div>
  489.     </div>
  490.     {# 目次 #}
  491.     {% if Product.contents %}
  492.         <div class="product-contents__area">
  493.             <h3 class="subtitle">目次</h3>
  494.             <div class="product_contents">{{ Product.contents|raw|nl2br }}</div>
  495.         </div>
  496.     {% endif %}
  497.     <!--▼サブコメント-->
  498.     <!--▲サブコメント-->
  499.     <!--{ if $tpl_product_id == 473 }-->
  500.     <!--{ /if }-->
  501.     <!--この商品に対するお客様の声-->
  502.     {# 4系ではプラグインのため一旦非表示 20240117
  503.     <div id="customervoice_area">
  504.         <div id="customervoice_box">
  505.             <h2><img src="{{ asset('assets/img/title/tit_bloc_review_write.png', 'user_data') }}" alt="この商品に対するお客様の声"></h2>
  506.             <div class="review_box">
  507.                 <div class="review_bloc flex">
  508.                     <p>この商品に対するご感想をぜひお寄せください。</p>
  509.                     <div class="review_btn btn-oldinput__long">
  510.                         <!--★新規コメントを書き込む★-->
  511.                         <a href="./review.php" onclick="eccube.openWindow('./review.php?product_id=580','review','600','640'); return false;" target="_blank" class="">
  512.                             新規コメントを書き込む
  513.                         </a>
  514.                     </div>
  515.                 </div>
  516.             </div>
  517.         </div>
  518.     </div>
  519.     #}
  520.     <!--お客様の声ここまで-->
  521.     <!--▼関連商品-->
  522.     <!--▲関連商品-->
  523.     {# フリーエリア #}
  524.     {% if Product.freearea %}
  525.         <div class="ec-productRole__description">
  526.             {{ include(template_from_string(Product.freearea|raw|nl2br), sandboxed = true) }}
  527.         </div>
  528.     {% endif %}
  529. </div>
  530. {% endblock %}