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

Open in your IDE?
  1. {#
  2. This file is part of EC-CUBE
  3. Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
  4. http://www.ec-cube.co.jp/
  5. For the full copyright and license information, please view the LICENSE
  6. file that was distributed with this source code.
  7. #}
  8. {% extends 'default_frame.twig' %}
  9. {% set recommend_products = repository('Plugin\\Recommend42\\Entity\\RecommendProduct').getRecommendProduct %}
  10. {% set body_class = 'product_page' %}
  11. {% block javascript %}
  12.     <script>
  13.         eccube.classCategories = {{ class_categories_as_json(Product)|raw }};
  14.         // 規格2に選択肢を割り当てる。
  15.         function fnSetClassCategories(form, classcat_id2_selected) {
  16.             var $form = $(form);
  17.             var product_id = $form.find('input[name=product_id]').val();
  18.             var $sele1 = $form.find('select[name=classcategory_id1]');
  19.             var $sele2 = $form.find('select[name=classcategory_id2]');
  20.             eccube.setClassCategories($form, product_id, $sele1, $sele2, classcat_id2_selected);
  21.         }
  22.         {% if form.classcategory_id2 is defined %}
  23.         fnSetClassCategories(
  24.             $('#form1'), {{ form.classcategory_id2.vars.value|json_encode|raw }}
  25.         );
  26.         {% elseif form.classcategory_id1 is defined %}
  27.         eccube.checkStock($('#form1'), {{ Product.id }}, {{ form.classcategory_id1.vars.value|json_encode|raw }}, null);
  28.         {% endif %}
  29.     </script>
  30.     <script>
  31.         $(function() {
  32.             // bfcache無効化
  33.             $(window).bind('pageshow', function(event) {
  34.                 if (event.originalEvent.persisted) {
  35.                     location.reload(true);
  36.                 }
  37.             });
  38.             // Core Web Vital の Cumulative Layout Shift(CLS)対策のため
  39.             // img タグに width, height が付与されている.
  40.             // 630px 未満の画面サイズでは縦横比が壊れるための対策
  41.             // see https://github.com/EC-CUBE/ec-cube/pull/5023
  42.             $('.ec-grid2__cell').hide();
  43.             var removeSize = function () {
  44.                 $('.product-detail__slide-item').height('');
  45.                 $('.product-detail__slide-item img')
  46.                     .removeAttr('width')
  47.                     .removeAttr('height')
  48.                     .removeAttr('style');
  49.             };
  50.             var slickInitial = function(slick) {
  51.                 $('.ec-grid2__cell').fadeIn(1500);
  52.                 var baseHeight = $(slick.target).height();
  53.                 var baseWidth = $(slick.target).width();
  54.                 var rate = baseWidth / baseHeight;
  55.                 $('.product-detail__slide-item').height(baseHeight * rate); // 余白を削除する
  56.                 // transform を使用することでCLSの影響を受けないようにする
  57.                 $('.product-detail__slide-item img')
  58.                     .css(
  59.                         {
  60.                             'transform-origin': 'top left',
  61.                             'transform': 'scaleY(' + rate + ')',
  62.                             'transition': 'transform .1s'
  63.                         }
  64.                     );
  65.                 // 正しいサイズに近くなったら属性を解除する
  66.                 setTimeout(removeSize, 500);
  67.             };
  68.         });
  69.     </script>
  70.     <script>
  71.         $(function() {
  72.             $('.add-cart').on('click', function(event) {
  73.                 {% if form.classcategory_id1 is defined %}
  74.                 // 規格1フォームの必須チェック
  75.                 if ($('#classcategory_id1').val() == '__unselected' || $('#classcategory_id1').val() == '') {
  76.                     $('#classcategory_id1')[0].setCustomValidity('{{ '項目が選択されていません'|trans }}');
  77.                     return true;
  78.                 } else {
  79.                     $('#classcategory_id1')[0].setCustomValidity('');
  80.                 }
  81.                 {% endif %}
  82.                 {% if form.classcategory_id2 is defined %}
  83.                 // 規格2フォームの必須チェック
  84.                 if ($('#classcategory_id2').val() == '__unselected' || $('#classcategory_id2').val() == '') {
  85.                     $('#classcategory_id2')[0].setCustomValidity('{{ '項目が選択されていません'|trans }}');
  86.                     return true;
  87.                 } else {
  88.                     $('#classcategory_id2')[0].setCustomValidity('');
  89.                 }
  90.                 {% endif %}
  91.                 // 個数フォームのチェック
  92.                 if ($('#quantity').val() < 1) {
  93.                     $('#quantity')[0].setCustomValidity('{{ '1以上で入力してください。'|trans }}');
  94.                     return true;
  95.                 } else {
  96.                     $('#quantity')[0].setCustomValidity('');
  97.                 }
  98.                 event.preventDefault();
  99.                 $form = $('#form1');
  100.                 $.ajax({
  101.                     url: $form.attr('action'),
  102.                     type: $form.attr('method'),
  103.                     data: $form.serialize(),
  104.                     dataType: 'json',
  105.                     beforeSend: function(xhr, settings) {
  106.                         // Buttonを無効にする
  107.                         $('.add-cart').prop('disabled', true);
  108.                     }
  109.                 }).done(function(data) {
  110.                     // レスポンス内のメッセージをalertで表示
  111.                     $.each(data.messages, function() {
  112.                         $('#ec-modal-header').text(this);
  113.                     });
  114.                     $('.ec-modal').show()
  115.                     // カートブロックを更新する
  116.                     $.ajax({
  117.                         url: "{{ url('block_cart') }}",
  118.                         type: 'GET',
  119.                         dataType: 'html'
  120.                     }).done(function(html) {
  121.                         $('.ec-headerRole__cart').html(html);
  122.                     });
  123.                 }).fail(function(data) {
  124.                     alert('{{ 'カートへの追加に失敗しました。'|trans }}');
  125.                 }).always(function(data) {
  126.                     // Buttonを有効にする
  127.                     $('.add-cart').prop('disabled', false);
  128.                 });
  129.             });
  130.             $('.line').each(function () {
  131.               const rating = parseInt($(this).data('rating'), 10);
  132.               if (rating >= 1 && rating <= 7) {
  133.                 $(this).find('span').removeClass('select'); // 念のため初期化
  134.                 $(this).find('span').eq(rating - 1).addClass('select');
  135.               }
  136.             });
  137.         });
  138.         $('.ec-modal-wrap').on('click', function(e) {
  139.             // モーダル内の処理は外側にバブリングさせない
  140.             e.stopPropagation();
  141.         });
  142.         $('.ec-modal-overlay, .ec-modal, .ec-modal-close, .product-detail__button--return').on('click', function() {
  143.             $('.ec-modal').hide()
  144.         });
  145.     </script>
  146.     <script type="application/ld+json">
  147.     {
  148.         "@context": "https://schema.org/",
  149.         "@type": "Product",
  150.         "name": "{{ Product.name }}",
  151.         "image": [
  152.             {% for img in Product.ProductImage %}
  153.                 "{{ app.request.schemeAndHttpHost }}{{ asset(img, 'save_image') }}"{% if not loop.last %},{% endif %}
  154.             {% else %}
  155.                 "{{ app.request.schemeAndHttpHost }}{{ asset(''|no_image_product, 'save_image') }}"
  156.             {% endfor %}
  157.         ],
  158.         "description": "{{ Product.description_list | default(Product.description_detail) | replace({'\n': '', '\r': ''}) | slice(0,300) }}",
  159.         {% if Product.code_min %}
  160.         "sku": "{{ Product.code_min }}",
  161.         {% endif %}
  162.         "offers": {
  163.             "@type": "Offer",
  164.             "url": "{{ url('product_detail', {'id': Product.id}) }}",
  165.             "priceCurrency": "{{ eccube_config.currency }}",
  166.             "price": {{ Product.getPrice02IncTaxMin ? Product.getPrice02IncTaxMin : 0}},
  167.             "availability": "{{ Product.stock_find ? "InStock" : "OutOfStock" }}"
  168.         }
  169.     }
  170.     </script>
  171. {% endblock %}
  172. {% block main %}
  173. <section class="product-detail">
  174.   <div class="inner product-detail__inner">
  175.     <div class="l-breadcrumb">
  176.       <ul itemscope itemtype="https://schema.org/BreadcrumbList" class="l-breadcrumb__list">
  177.         <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem" class="l-breadcrumb__item">
  178.           <a itemprop="item" href="{{ url('homepage') }}" class="l-breadcrumb__link">
  179.             <span class="freight-neo-pro" itemprop="name">TOP</span>
  180.           </a>
  181.           <meta itemprop="position" content="1" />
  182.         </li>
  183.         <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem" class="l-breadcrumb__item">
  184.           <a itemprop="item" href="{{ url('product_list') }}" class="l-breadcrumb__link">
  185.             <span class="freight-neo-pro" itemprop="name">商品一覧</span>
  186.           </a>
  187.           <meta itemprop="position" content="2" />
  188.         </li>
  189.         <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem" class="l-breadcrumb__item">
  190.           <a itemprop="item" class="l-breadcrumb__link">
  191.             <span class="freight-neo-pro" itemprop="name">{{ Product.name }}</span>
  192.           </a>
  193.           <meta itemprop="position" content="3" />
  194.         </li>
  195.       </ul>
  196.     </div>
  197.     <div class="product-detail__container">
  198.       <div class="product-detail__slider">
  199.         <div class="product-detail__splide splide" role="group" aria-label="商品詳細のサムネイルスライド">
  200.           <div class="splide__track">
  201.             <ul class="product-detail__slide-list splide__list">
  202.               {% for ProductImage in Product.ProductImage %}
  203.               <li class="product-detail__slide-item splide__slide">
  204.                 <img src="{{ asset(ProductImage, 'save_image') }}" alt="{{ loop.first ? Product.name : '' }}"
  205.                   width="550" height="550" {% if loop.index> 1 %} loading="lazy"{% endif %}>
  206.               </li>
  207.               {% else %}
  208.               <li class="product-detail__slide-item splide__slide"><img
  209.                   src="{{ asset(''|no_image_product, 'save_image') }}" alt="{{ loop.first ? Product.name : '' }}"
  210.                   width="550" height="550"></li>
  211.               {% endfor %}
  212.             </ul>
  213.           </div>
  214.         </div>
  215.         <div class="product-detail__thumb">
  216.           <ul class="product-detail__thumb-list">
  217.             {% for ProductImage in Product.ProductImage %}
  218.             <li class="product-detail__thumb-item" data-index="{{ loop.index0 }}"><img
  219.                 src="{{ asset(ProductImage, 'save_image') }}" alt="" width="133" height="133" loading="lazy"></li>
  220.             {% endfor %}
  221.           </ul>
  222.         </div>
  223.       </div>
  224.       <div class="product-detail__profile">
  225.         {# 商品名 #}
  226.         <h2 class="product-detail__title">{{ Product.name }}</h2>
  227.         {# タグ #}
  228.         <ul class="p-tags product__tags">
  229.           {% for Tag in Product.Tags %}
  230.             <li class="p-tag">{{Tag.name}}</li>
  231.           {% endfor %}
  232.         </ul>
  233.         {# キャッチコピー(見出し) #}
  234.         <p class="product-detail__text--free">{{ Product.sub_heading|raw|nl2br }}</p>
  235.         {# 商品説明 #}
  236.         <p class="product-detail__text">{{ Product.description_detail|raw|nl2br }}</p>
  237.         {# レート #}
  238.         <div class="product-detail__rating">
  239.           <ul class="product-detail__rating-list">
  240.             <li class="product-detail__rating-item">
  241.               <div class="kinds">香り</div>
  242.               <div class="line" data-rating="{{ aroma }}"><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
  243.               </div>
  244.             </li>
  245.             <li class="product-detail__rating-item">
  246.               <div class="kinds">甘み</div>
  247.               <div class="line" data-rating="{{ bitter }}"><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
  248.               </div>
  249.             </li>
  250.             <li class="product-detail__rating-item">
  251.               <div class="kinds">香ばしさ</div>
  252.               <div class="line" data-rating="{{ roasting }}"><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
  253.               </div>
  254.             </li>
  255.             <li class="product-detail__rating-item">
  256.               <div class="kinds">コク</div>
  257.               <div class="line" data-rating="{{ rich }}"><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
  258.               </div>
  259.             </li>
  260.             <li class="product-detail__rating-item">
  261.               <div class="kinds">旨み</div>
  262.               <div class="line" data-rating="{{ deliciousness }}"><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
  263.               </div>
  264.             </li>
  265.             <li class="product-detail__rating-item">
  266.               <div class="kinds">余韻</div>
  267.               <div class="line" data-rating="{{ aftertaste }}"><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
  268.               </div>
  269.             </li>
  270.           </ul>
  271.         </div>
  272.         {# 通常価格 #}
  273.         {% if Product.hasProductClass -%}
  274.         <div class="product-detail__price">
  275.           {% if Product.getPrice01Min is not null and Product.getPrice01IncTaxMin == Product.getPrice01IncTaxMax %}
  276.           <span class="product-detail__price-text">{{ '通常価格'|trans }}:<span class="product-detail__price-num">{{
  277.               Product.getPrice01IncTaxMin|price }}</span></span>{{ '(税込)'|trans }}
  278.           {% elseif Product.getPrice01Min is not null and Product.getPrice01Max is not null %}
  279.           <span class="product-detail__price-text">{{ '通常価格'|trans }}:<span class="product-detail__price-num">{{
  280.               Product.getPrice01IncTaxMin|price }}~ {{ Product.getPrice01IncTaxMax|price }}</span></span>{{ '(税込)'|trans
  281.           }}
  282.           {% endif %}
  283.         </div>
  284.         {% else %}
  285.         {% if Product.getPrice01Max is not null %}
  286.         <span class="product-detail__price-text">{{ '通常価格'|trans }}:{{ Product.getPrice01IncTaxMin|price }}</span>{{
  287.         '(税込)'|trans }}
  288.         {% endif %}
  289.         {% endif %}
  290.         {# 販売価格 #}
  291.         <div class="product-detail__price">
  292.           {% if Product.hasProductClass -%}
  293.           {% if Product.getPrice02IncTaxMin == Product.getPrice02IncTaxMax %}
  294.           <span class="product-detail__price-num">{{ Product.getPrice02IncTaxMin|price }}</span>{{ '(税込)'|trans }}
  295.           {% else %}
  296.           <span class="product-detail__price-num">{{ Product.getPrice02IncTaxMin|price }} ~ {{
  297.             Product.getPrice02IncTaxMax|price }}</span>{{ '(税込)'|trans }}
  298.           {% endif %}
  299.           {% else %}
  300.           <span class="product-detail__price-num">{{ Product.getPrice02IncTaxMin|price }}</span>{{ '(税込)'|trans }}
  301.           {% endif %}
  302.         </div>
  303.         <p class="product-detail__navi">※送料別途<a href="{{ url('help_guide')}}">詳しくはこちら</a></p>
  304.         <form class="product-detail__action" action="{{ url('product_add_cart', {id:Product.id}) }}" method="post" id="form1" name="form1">
  305.           {% if Product.stock_find %}
  306.           <div class="ec-productRole__actions">
  307.             <!-- {% if form.classcategory_id1 is defined %}
  308.                       <div class="ec-select">
  309.                           {{ form_row(form.classcategory_id1) }}
  310.                           {{ form_errors(form.classcategory_id1) }}
  311.                       </div>
  312.                       {% if form.classcategory_id2 is defined %}
  313.                           <div class="ec-select">
  314.                               {{ form_row(form.classcategory_id2) }}
  315.                               {{ form_errors(form.classcategory_id2) }}
  316.                           </div>
  317.                       {% endif %}
  318.                   {% endif %} -->
  319.             <div class="product-detail__action-num"><span>{{ '数量'|trans }}</span>
  320.               {{ form_widget(form.quantity) }}
  321.               {{ form_errors(form.quantity) }}
  322.             </div>
  323.           </div>
  324.           <button type="submit" class="product-detail__button product-detail__button--cart add-cart">
  325.             <svg class="product-detail__button--icon">
  326.               <use xlink:href="/html/user_data/assets/img/symbol-defs.svg#icon-cart"></use>
  327.             </svg>
  328.             <span class="product-detail__button-text">{{ 'カートに入れる'|trans }}</span>
  329.           </button>
  330.           {% else %}
  331.           <button type="button" class="product-detail__button product-detail__button--disabled" disabled="disabled">
  332.             {{ 'ただいま品切れ中です。'|trans }}
  333.           </button>
  334.           {% endif %}
  335.           {{ form_rest(form) }}
  336.         </form>
  337.         <div class="ec-modal">
  338.           <div class="ec-modal-overlay">
  339.             <div class="ec-modal-wrap">
  340.               <span class="ec-modal-close"><span class="ec-icon"><img src="{{ asset('assets/icon/cross-dark.svg') }}"
  341.                     alt="" /></span></span>
  342.               <div id="ec-modal-header" class="text-center">{{ 'カートに追加しました。'|trans }}</div>
  343.               <div class="modal-button-wrap">
  344.                 <span class="product-detail__button product-detail__button--return">{{ 'お買い物を続ける'|trans }}</span>
  345.                 <a href="{{ url('cart') }}" class="product-detail__button product-detail__button--cart">{{ 'カートへ進む'|trans }}</a>
  346.               </div>
  347.             </div>
  348.           </div>
  349.         </div>
  350.         {% if BaseInfo.option_favorite_product %}
  351.         <form class="product-detail__favorite" action="{{ url('product_add_favorite', {id:Product.id}) }}" method="post">
  352.           {% if is_favorite == false %}
  353.           <button type="submit" id="favorite" class="product-detail__button product-detail__button--favorite">
  354.             <span class="product-detail__button-text--favorite">{{ 'お気に入りに追加'|trans }}</span>
  355.           </button>
  356.           {% else %}
  357.           <button type="submit" id="favorite" class="product-detail__button product-detail__button--favorite" disabled="disabled">
  358.             <span class="product-detail__button-text--favorite is-disabled">
  359.             {{ 'お気に入りに追加済み'|trans }}
  360.             </span>
  361.           </button>
  362.           {% endif %}
  363.         </form>
  364.         {% endif %}
  365.       </div>
  366.     </div>
  367.     <div class="product-detail__container">
  368.       <div class="product-detail__box--video">
  369.         <h3 class="product-detail__box-heading product-detail__box-heading--video">お茶の淹れ方</h3>
  370.         <div class="product-detail__box-video">
  371.           <video src="{{ asset('assets/img/sample.mp4#t=0.001', 'user_data') }}" controls webkit-playsinline playsinline></video>
  372.         </div>
  373.       </div>
  374.       {% if Product.ProductSpecs|length > 0 %}
  375.       <div class="product-detail__box--info">
  376.         <h3 class="product-detail__box-heading product-detail__box-heading--info">商品情報</h3>
  377.         <dl class="product-detail__info-list">
  378.           {% for spec in Product.ProductSpecs %}
  379.           <div class="product-detail__info-item">
  380.             <dt class="product-detail__info-title">{{ spec.title|raw|nl2br }}</dt>
  381.             <dt class="product-detail__info-desc">{{ spec.content|raw|nl2br }}</dt>
  382.           </div>
  383.           {% endfor %}
  384.         </dl>
  385.       </div>
  386.       {% endif %}
  387.     </div>
  388.   </div>
  389. </section>
  390. {% set features = [
  391.   {
  392.       'heading': Product.salesHeading01,
  393.       'content': Product.salesContent01,
  394.       'image': Product.salesImagePath01
  395.   },
  396.   {
  397.       'heading': Product.salesHeading02,
  398.       'content': Product.salesContent02,
  399.       'image': Product.salesImagePath02
  400.   },
  401.   {
  402.       'heading': Product.salesHeading03,
  403.       'content': Product.salesContent03,
  404.       'image': Product.salesImagePath03
  405.   },
  406.   {
  407.       'heading': Product.salesHeading04,
  408.       'content': Product.salesContent04,
  409.       'image': Product.salesImagePath04
  410.   }
  411. ] %}
  412. {# featuresのうち1つでも何か値があるかチェック #}
  413. {% set has_feature = features|filter(f => f.heading or f.content or f.image)|length > 0 %}
  414. {% if has_feature %}
  415. <div class="product-detail-bg">
  416.   <div class="product-detail-bg__wrap">
  417.     <p class="product-detail-bg__text">Characteristics of Tea  Characteristics of Tea</p>
  418.     <p class="product-detail-bg__text">Characteristics of Tea  Characteristics of Tea</p>
  419.   </div>
  420.   <div class="product-detail-bg__wrap">
  421.     <p class="product-detail-bg__text">Characteristics of Tea  Characteristics of Tea</p>
  422.     <p class="product-detail-bg__text">Characteristics of Tea  Characteristics of Tea</p>
  423.   </div>
  424. </div>
  425. <section class="product-detail-feature">
  426.   {% for feature in features if feature.heading or feature.content or feature.image %}
  427.   <div class="product-detail-feature__wrapper {% if loop.index is even %} --even{% endif %}">
  428.     <div class="product-detail-feature__info">
  429.       <h2 class="product-detail-feature__heading"><span class="sub">Feature{{ '%02d'|format(loop.index) }}</span>{{ feature.heading|raw|nl2br }}</h2>
  430.       <p class="product-detail-feature__text">{{ feature.content|raw|nl2br }}</p>
  431.     </div>
  432.     <div class="product-detail-feature__image">
  433.       <img src="{{ asset('/html/upload/save_image/' ~ feature.image) }}" alt="">
  434.     </div>
  435.   </div>
  436.   {% endfor %}
  437. </section>
  438. {% endif %}
  439. {% if howto_glass|length or howto_pot|length %}
  440. <section class="product-detail-howto">
  441.   <div class="inner product-detail-howto__inner">
  442.     <h2 class="product-detail-howto__heading">おいしい召し上がり方</h2>
  443.     {% if (howto_glass|length > 0) %}
  444.     <div class="product-detail-howto__container">
  445.       <h3 class="product-detail-howto__subheading --glass">グラスで召しあがる</h3>
  446.       <ol class="product-detail-howto__list">
  447.         {% for item in howto_glass %}
  448.         <li class="product-detail-howto__item"><span class="number">{{ loop.index }}</span>{{ item.howto_glass_item }}</li>
  449.         {% endfor %}
  450.       </ol>
  451.     </div>
  452.     {% endif %}
  453.     {% if (howto_pot|length > 0) %}
  454.     <div class="product-detail-howto__container">
  455.       <h3 class="product-detail-howto__subheading --pot">蓋碗や急須を用いて召しあがる</h3>
  456.       <ol class="product-detail-howto__list">
  457.         {% for item in howto_pot %}
  458.         <li class="product-detail-howto__item"><span class="number">{{ loop.index }}</span>{{ item.howto_pot_item }}</li>
  459.         {% endfor %}
  460.       </ol>
  461.     </div>
  462.     {% endif %}
  463.   </div>
  464. </section>
  465. {% endif %}
  466. <section class="recommend">
  467.   <div class="inner recommend__inner">
  468.     <h2 class="recommend__heading">Recommend<span class="recommend__subheading">おすすめ商品</span></h2>
  469.         <ul class="recommend__list">
  470.             {% for RecommendProduct in recommend_products %}
  471.                 <li class="recommend__item">
  472.                     <a href="{{ url('product_detail', {'id': RecommendProduct.Product.id}) }}">
  473.                         <div class="recommend__thumb">
  474.                             <img src="{{ asset(RecommendProduct.Product.mainFileName|no_image_product, "save_image") }}">
  475.                         </div>
  476.                         <div class="recommend__body">
  477.                             <p class="recommend__name">{{ RecommendProduct.Product.name }}</p>
  478.               <p class="recommend__price">{{ RecommendProduct.Product.getPrice02IncTaxMax|price }}<span>(税込)</span></p>
  479.               <ul class="p-tags pickup__tags">
  480.                 {% for Tag in RecommendProduct.Product.Tags %}
  481.                   <li class="p-tag">{{Tag.name}}</li>
  482.                 {% endfor %}
  483.               </ul>
  484.                         </div>
  485.                     </a>
  486.                 </li>
  487.             {% endfor %}
  488.         </ul>
  489.         <div class="p-button recommend__button">
  490.             <a href="{{ url('product_list' )}}" class="p-button__link">
  491.                 <span class="p-button__arrow">
  492.                     <svg class="p-button__icon --before">
  493.                         <use xlink:href="/html/user_data/assets/img/symbol-defs.svg#icon-arrow_link"></use>
  494.                     </svg>
  495.                     <svg class="p-button__icon --after">
  496.                         <use xlink:href="/html/user_data/assets/img/symbol-defs.svg#icon-arrow_link"></use>
  497.                     </svg>
  498.                 </span>
  499.                 <span class="p-button__text">商品一覧</span>
  500.             </a>
  501.         </div>
  502.   </div>
  503. </section>
  504. <!-- /.recommend -->
  505. <section class="checked">
  506.   <div class="inner checked__inner">
  507.     <h2 class="checked__heading">Checked items<span class="checked__subheading">最近チェックした商品</span></h2>
  508.     <ul class="checked__list">
  509.       {% for Product in app.session.get('product_history') %}
  510.       <li class="checked__item">
  511.         <a href="{{ url('product_detail', {id:Product.id}) }}" class="checked__link">
  512.           <picture class="checked__image"><img src="{{ asset(Product.main_list_image|no_image_product, 'save_image') }}" alt=""></picture>
  513.           <h3 class="checked__title">{{ Product.name }}</h3>
  514.           <p class="checked__price">
  515.           {% if Product.hasProductClass %}
  516.           {% if Product.getPrice02Min == Product.getPrice02Max %}
  517.           {{ Product.getPrice02IncTaxMin|price }}<span>(税込)</span>
  518.           {% else %}
  519.           {{ Product.getPrice02IncTaxMin|price }}
  520.           ~
  521.           {{ Product.getPrice02IncTaxMax|price }}<span>(税込)</span>
  522.           {% endif %}
  523.           {% else %}
  524.           {{ Product.getPrice02IncTaxMin|price }}<span>(税込)</span>
  525.           {% endif %}
  526.           </p>
  527.           <ul class="p-tags pickup__tags">
  528.           {% for Tag in Product.Tags %}
  529.             <li class="p-tag">{{ Tag.name }}</li>
  530.           {% endfor %}
  531.           </ul>
  532.         </a>
  533.       </li>
  534.       {% endfor %}
  535.     </ul>
  536.   </div>
  537. </section>
  538. <!-- /.checked -->
  539. {% endblock %}