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. {% block stylesheet %}
  10.     <link rel="stylesheet" href="{{ asset('assets/css/contents.css', 'user_data') }}">
  11.     <link rel="stylesheet" href="{{ asset('assets/css/main_module.css', 'user_data') }}">
  12.     <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick-theme.min.css">
  13.     <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.css">
  14.     <style>
  15.         .new {
  16.           position: absolute;
  17.           top: -1%;
  18.           left: -2%;
  19.           width: 41%;
  20.           background: linear-gradient(to top left, transparent 50%, #df0b75 50%);
  21.           z-index: 10;
  22.           display: flex;
  23.           align-items: center;
  24.           justify-content: center;
  25.           transform-origin: top left;
  26.           container-type: inline-size;
  27.           color: white;
  28.           clip-path: polygon(0 60%, 60% 0, 100% 0, 0 100%);
  29.           aspect-ratio: 1 / 1;
  30.         }
  31.             
  32.         .new-text {
  33.           position: absolute;
  34.           color: #ffffff;
  35.           font-weight: bold;
  36.           font-size: 20cqw;
  37.           text-align: center;
  38.           line-height: 3em;
  39.           transform: rotate(-45.5deg) translate(0%,-25%);
  40.         }
  41.     
  42.     .list-btn {
  43.         width:100%;
  44.     }
  45.     @media screen and (max-width: 820px) {
  46.     .list-btn {
  47.         width:50%;
  48.     }
  49.     }
  50.     .ec-modal {
  51.       display: none;
  52.       position: fixed;
  53.       top: 0;
  54.       left: 0;
  55.       z-index: 9999;
  56.       width: 100%;
  57.       height: 100%;
  58.     }
  59.     .ec-modal.small {
  60.       width: 30%;
  61.     }
  62.     .ec-modal.full {
  63.       width: 100%;
  64.       height: 100%;
  65.     }
  66.     .ec-modal .ec-modal-overlay {
  67.       display: flex;
  68.       justify-content: center;
  69.       align-items: center;
  70.       background-color: rgba(0, 0, 0, 0.3);
  71.       width: 100%;
  72.       height: 100%;
  73.     }
  74.     .ec-modal .ec-modal-wrap {
  75.       position: relative;
  76.       border-radius: 10px;
  77.       border: 1px solid #333;
  78.       background-color: #fff;
  79.       width: 100%;
  80.       margin: 20px;
  81.       padding: 40px 5px;
  82.       color: #555555;
  83.       text-decoration: none;
  84.     }
  85.     .ec-modal .ec-modal-close {
  86.       cursor: pointer;
  87.       position: absolute;
  88.       right: 20px;
  89.       top: 10px;
  90.       font-size: 20px;
  91.       height: 30px;
  92.       width: 20px;
  93.     }
  94.     .ec-modal .ec-modal-close:hover {
  95.       color: #4b5361;
  96.     }
  97.     .ec-modal .ec-modal-box {
  98.       text-align: center;
  99.       font-weight: 600;
  100.     }
  101.     .ec-modal .ec-role {
  102.       margin-top: 20px;
  103.     }
  104.     #ec-modal-header {
  105.         text-align: center;
  106.     }
  107.     .ec-role {
  108.         display: flex;
  109.         justify-content: space-around;
  110.     }
  111.     .ec-inlineBtn--cancel {
  112.         color: #09860d;
  113.         border: solid 1px #09860d;
  114.         border-radius: 50px;
  115.         padding: 10px;
  116.     }
  117.     .ec-inlineBtn--cancel:hover {
  118.         color: #ffffff;
  119.         background-color:#09860d;
  120.     }
  121.     .ec-inlineBtn--action {
  122.         color: #e8353e;
  123.         border: solid 1px #e8353e;
  124.         border-radius: 50px;
  125.         padding: 10px;
  126.     }
  127.     .ec-inlineBtn--action:hover {
  128.         color: #ffffff;
  129.         background-color:#e8353e ;
  130.     }
  131.     </style>
  132. {% endblock %}
  133. {% set body_class = 'product_page' %}
  134. {% block javascript %}
  135.     <script src="https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>
  136.     <script>
  137.         eccube.classCategories = {{ class_categories_as_json(Product)|raw }};
  138.         // 規格2に選択肢を割り当てる。
  139.         function fnSetClassCategories(form, classcat_id2_selected) {
  140.             var $form = $(form);
  141.             var product_id = $form.find('input[name=product_id]').val();
  142.             var $sele1 = $form.find('select[name=classcategory_id1]');
  143.             var $sele2 = $form.find('select[name=classcategory_id2]');
  144.             eccube.setClassCategories($form, product_id, $sele1, $sele2, classcat_id2_selected);
  145.         }
  146.         {% if form.classcategory_id2 is defined %}
  147.         fnSetClassCategories(
  148.             $('#form1'), {{ form.classcategory_id2.vars.value|json_encode|raw }}
  149.         );
  150.         {% elseif form.classcategory_id1 is defined %}
  151.         eccube.checkStock($('#form1'), {{ Product.id }}, {{ form.classcategory_id1.vars.value|json_encode|raw }}, null);
  152.         {% endif %}
  153.     </script>
  154.     <script>
  155.     //画像をクリックするたびにslickが初期化されることへの対応
  156.         function initSlick() {
  157.             if ($(".img-main").hasClass('slick-initialized')) {
  158.                 $(".img-main").slick('unslick');
  159.             }
  160.             $(".img-main").slick({
  161.                 slidesToShow: 1,
  162.                 slidesToScroll: 1,
  163.                 arrows: false,
  164.                 fade: true,
  165.                 asNavFor: ".img-list"
  166.             });
  167.         
  168.             if ($(".img-list").hasClass('slick-initialized')) {
  169.                 $(".img-list").slick('unslick');
  170.             }
  171.             $(".img-list").slick({
  172.                 slidesToShow: 3,
  173.                 slidesToScroll: 1,
  174.                 asNavFor: ".img-main",
  175.                 focusOnSelect: true
  176.             });
  177.         }
  178.         
  179.         $(window).on('load', function() {
  180.             initSlick();
  181.         });
  182.     </script>
  183.     <script>
  184.     //もっと読むボタン
  185.     document.querySelector(".more").addEventListener("click",function(){
  186.         document.querySelector(".content-text").classList.add("show");
  187.         document.querySelector(".more").classList.add("hide");
  188.     });
  189.     
  190.     
  191.     </script>
  192.     <script>
  193.         $(function() {
  194.             $('.add-cart').on('click', function(event) {
  195.                 {% if form.classcategory_id1 is defined %}
  196.                 // 規格1フォームの必須チェック
  197.                 if ($('#classcategory_id1').val() == '__unselected' || $('#classcategory_id1').val() == '') {
  198.                     $('#classcategory_id1')[0].setCustomValidity('{{ '項目が選択されていません'|trans }}');
  199.                     return true;
  200.                 } else {
  201.                     $('#classcategory_id1')[0].setCustomValidity('');
  202.                 }
  203.                 {% endif %}
  204.                 {% if form.classcategory_id2 is defined %}
  205.                 // 規格2フォームの必須チェック
  206.                 if ($('#classcategory_id2').val() == '__unselected' || $('#classcategory_id2').val() == '') {
  207.                     $('#classcategory_id2')[0].setCustomValidity('{{ '項目が選択されていません'|trans }}');
  208.                     return true;
  209.                 } else {
  210.                     $('#classcategory_id2')[0].setCustomValidity('');
  211.                 }
  212.                 {% endif %}
  213.                 // 個数フォームのチェック
  214.                 if ($('#quantity').val() < 1) {
  215.                     $('#quantity')[0].setCustomValidity('{{ '1以上で入力してください。'|trans }}');
  216.                     return true;
  217.                 } else {
  218.                     $('#quantity')[0].setCustomValidity('');
  219.                 }
  220.                 event.preventDefault();
  221.                 $form = $('#form1');
  222.                 $.ajax({
  223.                     url: $form.attr('action'),
  224.                     type: $form.attr('method'),
  225.                     data: $form.serialize(),
  226.                     dataType: 'json',
  227.                     beforeSend: function(xhr, settings) {
  228.                         // Buttonを無効にする
  229.                         $('.add-cart').prop('disabled', true);
  230.                     }
  231.                 }).done(function(data) {
  232.                     // レスポンス内のメッセージをalertで表示
  233.                     $.each(data.messages, function() {
  234.                         $('#ec-modal-header').html(this);
  235.                     });
  236.                     $('.ec-modal').show()
  237.                     // カートブロックを更新する
  238.                     $.ajax({
  239.                         url: "{{ url('block_cart') }}",
  240.                         type: 'GET',
  241.                         dataType: 'html'
  242.                     }).done(function(html) {
  243.                         $('.ec-headerRole__cart').html(html);
  244.                     });
  245.                 }).fail(function(data) {
  246.                     alert('{{ 'カートへの追加に失敗しました。'|trans }}');
  247.                 }).always(function(data) {
  248.                     // Buttonを有効にする
  249.                     $('.add-cart').prop('disabled', false);
  250.                 });
  251.             });
  252.         });
  253.         $('.ec-modal-wrap').on('click', function(e) {
  254.             // モーダル内の処理は外側にバブリングさせない
  255.             e.stopPropagation();
  256.         });
  257.         $('.ec-modal-overlay, .ec-modal, .ec-modal-close, .ec-inlineBtn--cancel').on('click', function() {
  258.             $('.ec-modal').hide()
  259.         });
  260.     </script>
  261.     <script type="application/ld+json">
  262.     {
  263.         "@context": "https://schema.org/",
  264.         "@type": "Product",
  265.         "name": "{{ Product.name }}",
  266.         "image": [
  267.             {% for img in Product.ProductImage %}
  268.                 "{{ app.request.schemeAndHttpHost }}{{ asset(img, 'save_image') }}"{% if not loop.last %},{% endif %}
  269.             {% else %}
  270.                 "{{ app.request.schemeAndHttpHost }}{{ asset(''|no_image_product, 'save_image') }}"
  271.             {% endfor %}
  272.         ],
  273.         "description": "{{ Product.description_list | default(Product.description_detail) | replace({'\n': '', '\r': ''}) | slice(0,300) }}",
  274.         {% if Product.code_min %}
  275.         "sku": "{{ Product.code_min }}",
  276.         {% endif %}
  277.         "offers": {
  278.             "@type": "Offer",
  279.             "url": "{{ url('product_detail', {'id': Product.id}) }}",
  280.             "priceCurrency": "{{ eccube_config.currency }}",
  281.             "price": {{ Product.getPrice02IncTaxMin ? Product.getPrice02IncTaxMin : 0}},
  282.             "availability": "{{ Product.stock_find ? "InStock" : "OutOfStock" }}"
  283.         }
  284.     }
  285.     </script>
  286.     <script>
  287.         document.addEventListener('DOMContentLoaded', function() {
  288.             function adjustItems(selector,amount) {
  289.                 const items = document.querySelectorAll(selector);
  290.                 items.forEach((item, index) => {
  291.                     if (window.innerWidth <= 768) {
  292.                         item.style.display = index < amount ? 'block' : 'none';
  293.                     } else {
  294.                         item.style.display = 'block';
  295.                     }
  296.                 });
  297.             }
  298.         
  299.             adjustItems(".relation .card-2",3);
  300.             adjustItems(".recommended .card-2",3);
  301.             window.addEventListener('resize', adjustItems);
  302.         });
  303.     </script>
  304. {% endblock %}
  305. {% block main %}
  306.         <!-- 商品詳細 -->
  307.         <section class="detail">
  308.             <div class="content-area">
  309.                 <!-- SP用タイトル -->
  310.                 <div class="content-status sp-on">
  311.                     <h2>{{ Product.name }}</h2>
  312.                         <p>著者:<span class="status-author-name">{{ Product.author }}</span></p>
  313.                         <p><span class="status-price">{{ Product.ProductClasses|first.price02IncTax|price}}</span>(税込)</p>
  314.                         <div class="status-detail">
  315.                             <p class="sp-space">発売日:<span class="status-release">{{ Product.release_date }}</span></p>
  316.                             <p>版型:<span class="status-size">{{ Product.plate_type }}</span></p>
  317.                         </div>
  318.                         <p>ページ数:<span class="status-pages">{{ Product.page_amount }}ページ</span></p>
  319.                 </div>
  320.                 <div class="content-image">
  321.                     <div class="img-main">
  322.                         {% for ProductImage in Product.ProductImage %}
  323.                             <div class="slideThumb" data-index="{{ loop.index0 }}">
  324.                                 <img src="{{ asset(ProductImage, 'save_image') }}" alt=""loading="lazy">
  325.                             </div>
  326.                         {% endfor %}
  327.                     </div>
  328.                     <div class="img-list">
  329.                         {% for ProductImage in Product.ProductImage %}
  330.                             <div class="slideThumb" data-index="{{ loop.index0 }}">
  331.                                 <img src="{{ asset(ProductImage, 'save_image') }}" alt=""loading="lazy">
  332.                             </div>
  333.                         {% endfor %}
  334.                     </div>
  335.                     <a href="{{ Product.meclib_url }}" class="list-link">
  336.                         <span class="btn-l"><img src="{{ asset('assets/img/btn_circle_read-sample.svg', 'user_data') }}" alt="book-icon"></span>
  337.                         <span class="list-btn">試し読みをする</span>
  338.                     </a>
  339.                 </div>
  340.                 
  341.                 <div class="content-data">
  342.                     <!-- PC用タイトル -->
  343.                     <div class="content-status pc">
  344.                         <h2>{{ Product.name }}</h2>
  345.                         <p>著者:<span class="status-author-name">{{ Product.author }}</span></p>
  346.                             <p><span class="status-price">{{ Product.ProductClasses|first.price02IncTax|price }}</span>(税込)</p>
  347.                         <div class="status-detail">
  348.                             <p>発売日:<span class="status-release">{{ Product.release_date }}</span></p>
  349.                             <p>版型:<span class="status-size">{{Product.plate_type}}</span></p>
  350.                             <p>ページ数:<span class="status-pages">{{Product.page_amount}}ページ</span></p>
  351.                         </div>
  352.                     </div>
  353.                     <div class="content-text">
  354.                         <p>{{Product.description_detail}}</p>
  355.                     </div>
  356.                     <button class="list-link more sp" type="button">
  357.                         <span class="btn-l"><img src="{{ asset('assets/img/btn_ic_arrow_btm.svg ', 'user_data') }}" alt="book-icon"></span>
  358.                         <span class="list-btn">もっと見る</span>
  359.                     </button>
  360.                 </div>
  361.             </div>
  362.             <!-- 購入エリア -->
  363.             <div class="buy-area">
  364.                 <p class="price-line"><span class="price">{{Product.ProductClasses|first.price02IncTax|price}}</span>(税込)</p>
  365.                 <div class="postage">
  366.                     <p>合計3500円以上で送料無料</p>
  367.                 </div>
  368.                 <form action="{{ url('product_add_cart', {id:Product.id}) }}" method="post" id="form1" name="form1">
  369.                         {% if Product.stock_find %}
  370.                             <div class="ec-productRole__actions">
  371.                                 {% if form.classcategory_id1 is defined %}
  372.                                     <div class="ec-select">
  373.                                         {{ form_row(form.classcategory_id1) }}
  374.                                         {{ form_errors(form.classcategory_id1) }}
  375.                                     </div>
  376.                                     {% if form.classcategory_id2 is defined %}
  377.                                         <div class="ec-select">
  378.                                             {{ form_row(form.classcategory_id2) }}
  379.                                             {{ form_errors(form.classcategory_id2) }}
  380.                                         </div>
  381.                                     {% endif %}
  382.                                 {% endif %}
  383.                                 <div class="quantities">
  384.                                     <p>数量:</p> 
  385.                                     {{ form_widget(form.quantity) }}
  386.                                     {{ form_errors(form.quantity) }}
  387.                                 </div>
  388.                             </div>
  389.                             <div class="ec-productRole__btn">
  390.                                 <button type="submit" class="buy-btn add-cart">
  391.                                     <div class="cart-in"><img src="{{ asset('assets/img/btn_ic_cart.svg', 'user_data') }}" alt="カート">
  392.                                         カートに入れる
  393.                                     </div>
  394.                                 </button>
  395.                             </div>
  396.                         {% else %}
  397.                             <div class="ec-productRole__btn">
  398.                                 <button type="button" class="ec-blockBtn--action" disabled="disabled">
  399.                                     {{ 'ただいま品切れ中です。'|trans }}
  400.                                 </button>
  401.                             </div>
  402.                         {% endif %}
  403.                     {{ form_rest(form) }}
  404.                 </form>
  405.                 
  406.                 {% if BaseInfo.option_favorite_product and is_granted('ROLE_USER')%}
  407.                     {% if is_favorite == false %}
  408.                         <form action="{{ url('product_add_favorite', {id:Product.id}) }}" method="post">
  409.                             <div class="ec-productRole__btn">
  410.                                 <button type="submit" class="favorite-btn">
  411.                                         <div class="cart-in">
  412.                                             <img src="{{ asset('/html/user_data/assets/icon/btn_ster.svg', 'user_data') }}" alt="お気に入り">
  413.                                             <span class="ec-closeBtn--circle">{{ 'お気に入りに追加'|trans }}</span>
  414.                                         </div>
  415.                                 </button>
  416.                             </div>
  417.                         </form>
  418.                     {% else %}
  419.                     <a href="{{ url('mypage_favorite_delete', { id : Product.id }) }}" {{ csrf_token_for_anchor() }}  data-method="delete">
  420.                         <div class="ec-productRole__btn">
  421.                             <button type="button" class="favorite-btn-after">
  422.                                     <div class="cart-in">
  423.                                         <img src="{{ asset('/html/user_data/assets/icon/btn_ster2.svg', 'user_data') }}" alt="お気に入り">
  424.                                         <span class="ec-closeBtn--circle"></span>{{ 'お気に入りから削除'|trans }}</span>
  425.                                     </div>
  426.                                 </div>
  427.                             </button>
  428.                         </div>
  429.                     </a>
  430.                     {% endif %}
  431.                 {% endif %}
  432.             </div>
  433.         </section>
  434.         
  435.         <div class="ec-modal">
  436.                     <div class="ec-modal-overlay">
  437.                         <div class="ec-modal-wrap">
  438.                             <span class="ec-modal-close"><span class="ec-icon"><img src="{{ asset('assets/icon/cross-dark.svg') }}" alt=""/></span></span>
  439.                             <div id="ec-modal-header" class="text-center">{{ 'カートに追加しました。'|trans }}</div>
  440.                             <div class="ec-modal-box">
  441.                                 <div class="ec-role">
  442.                                     <span class="ec-inlineBtn--cancel">{{ 'お買い物を続ける'|trans }}</span>
  443.                                     <a href="{{ url('cart') }}" class="ec-inlineBtn--action">{{ 'カートへ進む'|trans }}</a>
  444.                                 </div>
  445.                             </div>
  446.                         </div>
  447.                     </div>
  448.                 </div>
  449.         {# 関連コンテンツ #}
  450.         <section class="special-2">
  451.             <h2><img src="/html/user_data/assets/img/title_ic_newbook.svg" alt="関連icon"> この商品に関連する商品</h2>
  452.             <div class="pipe-line">
  453.                 <div class="pipe">
  454.                     <div class="line"></div>
  455.                 </div>
  456.                 <div class="green"></div>
  457.             </div>
  458.             <div class="content-2 relation">
  459.                 {# Step 1: 現在の商品が持つカテゴリIDを先に抽出 #}
  460.                 {% set CurrentCategoryIds = [] %}
  461.                 {% for ProductCategory in Product.ProductCategories %}
  462.                     {% set CurrentCategoryIds = CurrentCategoryIds | merge([ProductCategory.Category.id]) %}
  463.                 {% endfor %}
  464.                 
  465.                 {# Step 2: 同じカテゴリを持つ他の商品を抽出 #}
  466.                 {% set CategoryProducts = [] %}
  467.                 {% for otherProduct in allProducts %}
  468.                     {% if otherProduct.id != Product.id %}
  469.                         {% set match = false %}
  470.                         {% for otherCategory in otherProduct.ProductCategories %}
  471.                             {% if otherCategory.Category.id in CurrentCategoryIds %}
  472.                                 {% set match = true %}
  473.                             {% endif %}
  474.                         {% endfor %}
  475.                 
  476.                         {% if match %}
  477.                             {% set CategoryProducts = CategoryProducts | merge([otherProduct]) %}
  478.                         {% endif %}
  479.                     {% endif %}
  480.                 {% endfor %}
  481.                 {#その上でランダムシャッフルして7件だけ抜く #}
  482.                 {% set randomProducts = [] %}
  483.                 {% set workingProducts = CategoryProducts %}
  484.                     {% for i in 0..6 %}
  485.                         {% if workingProducts|length > 0 %}
  486.                             {% set randomIndex = random(workingProducts|keys) %}
  487.                             {% set randomProduct = workingProducts[randomIndex] %}
  488.                             {% set randomProducts = randomProducts|merge([randomProduct]) %}
  489.                              {#選んだやつをworkingProductsから除外する #}
  490.                             {% set workingProducts = workingProducts|filter(p => p != randomProduct) %}
  491.                         {% endif %}
  492.                     {% endfor %}
  493.                     {% for RecommendProduct in randomProducts %}
  494.                           <div class="card-2">
  495.                             {% for ProductTags in RecommendProduct.ProductTag %}
  496.                                 {% if ProductTags.Tag.id == 1 %}
  497.                                     <div class="new">
  498.                                         <div class="new-text">New</div>
  499.                                     </div>
  500.                                 {% endif %}
  501.                             {% endfor %}
  502.                             <a href="{{ url('product_detail', {'id': RecommendProduct.id}) }}">
  503.                                 <img src="{{asset(RecommendProduct.main_list_image|no_image_product, 'save_image') }}" class="" alt="コンテンツ1"/>
  504.                             </a>
  505.                             <h3>{{RecommendProduct.name}}</h3>
  506.                             <p>著者:{{RecommendProduct.author}}</p>
  507.                             {% set firstClass = RecommendProduct.ProductClasses|first %}
  508.                             <p>{{ firstClass.price02_inc_tax | price}}税込</p>
  509.                         </div>
  510.                     {% endfor %}
  511.             </div>
  512.         
  513.         </section>
  514.         <!-- 商品詳細 -->
  515.         <section class="detail-data">
  516.             <h2><img src="{{ asset('assets/img/title_ic_infomation.svg', 'user_data') }}" alt=""> 登録情報</h2>
  517.             
  518.             <div class="pipe-line">
  519.                 <div class="pipe">
  520.                     <div class="line"></div>
  521.                 </div>
  522.                 <div class="white"></div>
  523.             </div>
  524.             
  525.             <div class="data-list">
  526.                 <table>
  527.                     <tr>
  528.                         <td>発売日:</td>
  529.                         <td>{{Product.release_date}}</td>
  530.                       </tr>
  531.                       <tr>
  532.                         <td>ページ数:</td>
  533.                         <td>{{Product.page_amount}}ページ</td>
  534.                       </tr>
  535.                       <tr>
  536.                         <td>定価:</td>
  537.                         <td>{{Product.ProductClasses|first.price02IncTax|price}}(税込み)</td>
  538.                       </tr>
  539.                       <tr>
  540.                         <td>版型:</td>
  541.                         <td>{{Product.plate_type}}</td>
  542.                       </tr>
  543.                   </table>
  544.             </div>
  545.             {#<h2><img src="/html/user_data/assets/img/title_ic_writer.svg" alt=""> 著者について</h2>#}
  546.             
  547.             {#<div class="pipe-line">#}
  548.             {#    <div class="pipe">#}
  549.             {#        <div class="line"></div>#}
  550.             {#    </div>#}
  551.             {#    <div class="white"></div>#}
  552.             {#</div>#}
  553.             {#<div class="data-list">#}
  554.             {#    <p>リード文リード文リード文リード文リード文リード文リード文リード文</p>#}
  555.             {#    <div class="author-data">#}
  556.             {#        <img src="./asset/img/test-icon.png" alt="" class="author-icon">#}
  557.             {#        <div class="author-profile">#}
  558.             {#            <p class="author-name">著者:<span>ウ</span></p>#}
  559.             {#            <p>testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest</p>#}
  560.             {#        </div>#}
  561.             {#    </div>#}
  562.             {#</div>#}
  563.             
  564.         </section>
  565.         <!-- 閲覧履歴 -->
  566.         {% if app.user %}
  567.         <section class="special-2 recommended">
  568.             <h2><img src="/html/user_data/assets/img/title_ic_recommend.svg" alt="閲覧icon"> 閲覧履歴に基づくおすすめ</h2>
  569.             <div class="pipe-line">
  570.                 <div class="pipe">
  571.                     <div class="line"></div>
  572.                 </div>
  573.                 <div class="green"></div>
  574.             </div>
  575.             <div class="content-2">
  576.                 {# ランダムシャッフルして7件だけ抜く #}
  577.                 {% set randomProducts = [] %}
  578.                 {% set workingProducts = recommendProducts %}
  579.                     {% for i in 0..6 %}
  580.                         {#{% set randomProducts = randomProducts|merge([random(taggedProducts)]) %}#}
  581.                         {% if workingProducts|length > 0 %}
  582.                             {% set randomIndex = random(workingProducts|keys) %}
  583.                             {% set randomProduct = workingProducts[randomIndex] %}
  584.                             {% set randomProducts = randomProducts|merge([randomProduct]) %}
  585.                             {# 選んだやつをworkingProductsから除外する #}
  586.                             {% set workingProducts = workingProducts|filter(p => p != randomProduct) %}
  587.                         {% endif %}
  588.                     {% endfor %}
  589.                 {% for recommendedProduct in randomProducts %}
  590.                     <div class="card-2">
  591.                             {% for ProductTags in recommendedProduct.ProductTag %}
  592.                                 {% if ProductTags.Tag.id == 1 %}
  593.                                     <div class="new">
  594.                                         <div class="new-text">New</div>
  595.                                     </div>
  596.                                 {% endif %}
  597.                             {% endfor %}
  598.                         <a href="{{ url('product_detail', {'id': recommendedProduct.id}) }}">
  599.                             <img src="{{asset(recommendedProduct.main_list_image|no_image_product, 'save_image') }}" class="" alt="コンテンツ1"/>
  600.                         </a>
  601.                         <h3>{{recommendedProduct.name}}</h3>
  602.                         <p>著者:<span>{{recommendedProduct.author}}</span></p>
  603.                         <p>¥<span>{{ recommendedProduct.getPrice02IncTaxMax|number_format(0, '.', ',') }}</span>税込</p>
  604.                     </div>
  605.                 {% endfor %}
  606.             </div>
  607.         </section>
  608.         {% endif %}
  609.     </section>
  610. {% endblock %}