app/template/admin/Product/product.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 '@admin/default_frame.twig' %}
  9. {% set menus = ['product', 'product_edit'] %}
  10. {% block title %}{{ 'admin.product.product_registration'|trans }}{% endblock %}
  11. {% block sub_title %}{{ 'admin.product.product_management'|trans }}{% endblock %}
  12. {% form_theme form '@admin/Form/bootstrap_4_horizontal_layout.html.twig' %}
  13. {% block stylesheet %}
  14.     {{ parent() }}
  15.     <link rel="stylesheet" href="/html/user_data/assets/css/custom_admin.css">
  16. {% endblock %}
  17. {% block javascript %}
  18.     <script>
  19.         $(document).on('drop dragover', function(e) {
  20.             e.preventDefault();
  21.         });
  22.         $(function() {
  23.             {% if has_class == false %}
  24.             if ($("#{{ form.class.stock_unlimited.vars.id }}").prop("checked")) {
  25.                 $("#{{ form.class.stock.vars.id }}").attr("disabled", "disabled").val('');
  26.             } else {
  27.                 $("#{{ form.class.stock.vars.id }}").removeAttr("disabled");
  28.             }
  29.             $("#{{ form.class.stock_unlimited.vars.id }}").on("click change", function() {
  30.                 if ($(this).prop("checked")) {
  31.                     $("#{{ form.class.stock.vars.id }}").attr("disabled", "disabled").val('');
  32.                 } else {
  33.                     $("#{{ form.class.stock.vars.id }}").removeAttr("disabled");
  34.                 }
  35.             });
  36.             {% endif %}
  37.             // ファイルアップロード
  38.             // see https://pqina.nl/filepond/
  39.             var inputFileElement = document.querySelector('input[type=file]');
  40.             {% if eccube_config.locale == 'ja' or eccube_config.locale == 'en' %}
  41.             FilePond.setOptions(FilePondLocale_{{ eccube_config.locale }});
  42.             {% endif %}
  43.             FilePond.setOptions({
  44.                 server: {
  45.                     process: {
  46.                         url: '{{ path('admin_product_image_process') }}',
  47.                         headers: {
  48.                             'ECCUBE-CSRF-TOKEN': $('meta[name="eccube-csrf-token"]').attr('content'),
  49.                             'X-Requested-With': 'XMLHttpRequest'
  50.                         }
  51.                     },
  52.                     load: {
  53.                         url: '{{ path('admin_product_image_load') }}?source=',
  54.                         headers: {
  55.                             'X-Requested-With': 'XMLHttpRequest'
  56.                         }
  57.                     },
  58.                     revert: {
  59.                         url: '{{ path('admin_product_image_revert') }}',
  60.                         headers: {
  61.                             'ECCUBE-CSRF-TOKEN': $('meta[name="eccube-csrf-token"]').attr('content'),
  62.                             'X-Requested-With': 'XMLHttpRequest'
  63.                         }
  64.                     }
  65.                 }
  66.             });
  67.             var pond = FilePond.create(inputFileElement, {
  68.                 allowFileTypeValidation: true,
  69.                 acceptedFileTypes: [
  70.                     'image/gif',
  71.                     'image/png',
  72.                     'image/jpeg'
  73.                 ],
  74.                 allowFileSizeValidation: true,
  75.                 maxFileSize: 10000000,
  76.                 maxFiles: 10,
  77.                 allowBrowse: true,
  78.                 allowDrop: true,
  79.                 allowReorder: true,
  80.                 labelIdle: '<i class="fa fa-cloud-upload fa-3x text-ec-lightGray mx-3 align-middle" aria-hidden="true" style="font-size: 40px"></i>{{ 'admin.common.drag_and_drop_image_description'|trans }}<span class="filepond--label-action">{{ 'admin.common.file_select'|trans }}</span>',
  81.                 styleItemPanelAspectRatio: 0.5625,
  82.                 // 保存されている画像のロード
  83.                 files: [
  84.                     {% for image in form.images %}
  85.                     {
  86.                         source: '{{ image.vars.value }}',
  87.                         options: {
  88.                             type: 'local'
  89.                         }
  90.                     },
  91.                     {% endfor %}
  92.                     // 追加してすぐの画像のロード. バリデーションエラーの場合など.
  93.                     {% for add_image in form.add_images %}
  94.                     {
  95.                         source: '{{ add_image.vars.value }}',
  96.                         options: {
  97.                             type: 'local'
  98.                         }
  99.                     },
  100.                     {% endfor %}
  101.                 ]
  102.             });
  103.             // 画像が追加されたら add_images にファイル名を追加する
  104.             var proto_add = '{{ form_widget(form.add_images.vars.prototype) }}';
  105.             pond.on('processfile', function(error, file) {
  106.                 if (error) {
  107.                     console.log(error);
  108.                 } else {
  109.                     $('#upload-zone').append(
  110.                         $(proto_add.replace(/__name__/g, file.id))
  111.                             .val(file.serverId)
  112.                             .addClass('add_images')
  113.                     );
  114.                 }
  115.             });
  116.             // 画像が削除されたら delete_images にファイル名を追加する
  117.             var proto_del = '{{ form_widget(form.delete_images.vars.prototype) }}';
  118.             pond.on('removefile', function(error, file) {
  119.                 if (error) {
  120.                     console.log(error);
  121.                 } else {
  122.                     // file.serverId にはアップロードしたファイル名が格納される.
  123.                     if (file.serverId) {
  124.                         $('#upload-zone').append(
  125.                             $(proto_del.replace(/__name__/g, file.id))
  126.                                 .val(file.serverId)
  127.                                 .addClass('del_images')
  128.                         );
  129.                     }
  130.                     // 追加してすぐ削除した画像があれば削除する
  131.                     $('#upload-zone').find('#admin_product_add_images_' + file.id).remove(); // 追加してすぐ削除した画像
  132.                     $('#upload-zone').find('.add_images[value="' + file.filename + '"]').remove(); // 追加後, バリデーションエラーが発生した後に削除した画像
  133.                 }
  134.             });
  135.             pond.on('initfile', function() {
  136.                 $('#product_image_error').hide();
  137.             });
  138.             pond.on('error', function(error, file) {
  139.                 var message = '{{ 'admin.common.upload_error'|trans }}';
  140.                 if (error.main !== undefined) {
  141.                     message = `${error.main}: ${error.sub}`;
  142.                 }
  143.                 $('#product_image_error')
  144.                     .show()
  145.                     .find('.form-error-message').text(message);
  146.                 // エラーメッセージが表示されてからプレビューエリアのエラーメッセージを非表示にする
  147.                 setTimeout(function() {
  148.                     $('.filepond--file-status').hide();
  149.                 }, 300);
  150.             });
  151.             // バリデーションエラーが出た場合に画像を保持するための hidden を追加しておく
  152.             var proto_image = '{{ form_widget(form.images.vars.prototype) }}';
  153.             {% for image in form.images %}
  154.                 $('#upload-zone').append(
  155.                     $(proto_image.replace(/__name__/g, '{{ loop.index0 }}'))
  156.                         .val('{{ image.vars.value }}')
  157.                         .addClass('images')
  158.                 );
  159.             {% endfor %}
  160.             {% for add_image in form.add_images %}
  161.                 $('#upload-zone').append(
  162.                     $('{{ form_widget(add_image) }}')
  163.                         .val('{{ add_image.vars.value }}')
  164.                         .addClass('add_images')
  165.                 );
  166.             {% endfor %}
  167.             {% for delete_image in form.delete_images %}
  168.                 $('#upload-zone').append(
  169.                     $('{{ form_widget(delete_image) }}').addClass('del_images')
  170.                 );
  171.             {% endfor %}
  172.             // タグ管理
  173.             var mainTags = $('#allTags');
  174.             var adminProductTag = $('#admin_product_Tag');
  175.             $('input', adminProductTag).each(function() {
  176.                 if ($(this).is(':checked')) {
  177.                     $('button[data-tag-id="' + $(this).val() + '"]').removeClass('btn-outline-secondary').addClass('btn-outline-primary');
  178.                 }
  179.             });
  180.             mainTags.on('click', 'button.btn', function() {
  181.                 var btnTag = $(this);
  182.                 var tagId = btnTag.data('tag-id');
  183.                 if (btnTag.hasClass('btn-outline-primary')) {
  184.                     btnTag.removeClass('btn-outline-primary').addClass('btn-outline-secondary');
  185.                     $('input[value="' + tagId + '"]', mainTags).prop('checked', false);
  186.                 } else {
  187.                     btnTag.removeClass('btn-outline-secondary').addClass('btn-outline-primary');
  188.                     $('input[value="' + tagId + '"]', mainTags).prop('checked', true);
  189.                 }
  190.             });
  191.             var confirmFormChange = function(form, target, modal) {
  192.                 var returnLink = form.find('input[type="hidden"][name*="return_link"]'),
  193.                     saveBtn = modal.find('a[data-action="save"]'),
  194.                     cancelBtn = modal.find('a[data-action="cancel"]');
  195.                 modal.on('hidden.bs.modal', function() {
  196.                     returnLink.val('');
  197.                 });
  198.                 saveBtn.on('click', function() {
  199.                     returnLink.val($(this).data('return-link'));
  200.                     $(this).addClass('disabled');
  201.                     form.submit();
  202.                 });
  203.                 target.on('click', function() {
  204.                     modal.find('.modal-body .screen-name').text($(this).attr('title'));
  205.                     modal.modal('show');
  206.                     saveBtn.data('return-link', $(this).attr('href'));
  207.                     cancelBtn.attr('href', $(this).attr('href'));
  208.                     return false;
  209.                 });
  210.             };
  211.             confirmFormChange($('#form1'), $('a[data-action="confirm"]'), $('#confirmFormChangeModal'))
  212.         });
  213.         // searchWordの実行
  214.         $('#search-category').on('input', function () {
  215.             searchWord($(this).val(), $('.category-li'));
  216.         });
  217.         //カテゴリ選択に連動したおすすめ度入力フィールドの表示・非表示
  218. document.addEventListener('DOMContentLoaded', function () {
  219.     // すべてのチェックボックスを取得
  220.     const categoryCheckboxes = document.querySelectorAll('input[type="checkbox"][id^="admin_product_category_"]');
  221.     // 初期状態でおすすめ度フィールドを表示・非表示
  222.     categoryCheckboxes.forEach(checkbox => {
  223.         toggleRecommendRankField(checkbox); // 初期状態を設定
  224.     });
  225.     // チェックボックスの状態が変わったらおすすめ度フィールドを切り替え
  226.     categoryCheckboxes.forEach(checkbox => {
  227.         checkbox.addEventListener('change', function () {
  228.             toggleRecommendRankField(this);
  229.         });
  230.     });
  231.     function toggleRecommendRankField(checkbox) {
  232.         const recommendRankField = document.getElementById('recommend_rank_field_' + checkbox.value);
  233.         if (recommendRankField) {
  234.             // チェック状態に応じて表示を切り替え
  235.             recommendRankField.style.display = checkbox.checked ? 'block' : 'none';
  236.             console.log(
  237.                 `Field for category ${checkbox.value} is now ${
  238.                     checkbox.checked ? 'visible' : 'hidden'
  239.                 }`
  240.             );
  241.         } else {
  242.             console.warn(`No field found for category ID: ${checkbox.value}`);
  243.         }
  244.     }
  245. });
  246.         // おすすめ度の「レアリティ」、「販売」「買い取り」を非表示
  247.         document.addEventListener('DOMContentLoaded', function() {
  248.             const recommendRankFields = document.querySelectorAll('li[id^="recommend_rank_field_"]');
  249.         
  250.             recommendRankFields.forEach(function(field) {
  251.                 const labelElement = field.querySelector('label');
  252.                 
  253.                 //「レアリティ」の非表示
  254.                 if (labelElement && labelElement.textContent.includes('レアリティ のおすすめ度')) {
  255.                     // 「レアリティ」の要素を非表示
  256.                     field.querySelector('input[type="number"]').style.display = 'none';
  257.                     labelElement.style.display = 'none';
  258.                 }
  259.                 
  260.                 //「販売」「買い取り」を非表示
  261.                 if (labelElement && labelElement.textContent.includes('販売 のおすすめ度')) {
  262.                     // 「販売」の要素を非表示
  263.                     field.querySelector('input[type="number"]').style.display = 'none';
  264.                     //labelElement.style.display = 'none';
  265.                 }
  266.                 if (labelElement && labelElement.textContent.includes('買い取り のおすすめ度')) {
  267.                     // 「買い取り」の要素を非表示
  268.                     field.querySelector('input[type="number"]').style.display = 'none';
  269.                     //labelElement.style.display = 'none';
  270.                 }
  271.                 
  272.             });
  273.         });
  274.         document.addEventListener('DOMContentLoaded', function() {
  275.             // クリック可能領域全体にイベントリスナーを追加
  276.             document.querySelectorAll('.clickable-area').forEach(function(toggle) {
  277.                 toggle.addEventListener('click', function(event) {
  278.                     // checkbox-label-wrapper内の要素がクリックされた場合はアコーディオンを操作しない
  279.                     if (event.target.closest('.checkbox-label-wrapper')) {
  280.                         return;
  281.                     }
  282.         
  283.                     var parent = this.closest('.parent-category');
  284.                     // open クラスをトグルして、子カテゴリの表示/非表示を切り替え
  285.                     parent.classList.toggle('open');
  286.         
  287.                     // アイコンの切り替え
  288.                     var icon = this.querySelector('i');
  289.                     if (parent.classList.contains('open')) {
  290.                         icon.classList.remove('fa-angle-down');
  291.                         icon.classList.add('fa-angle-up');
  292.                     } else {
  293.                         icon.classList.remove('fa-angle-up');
  294.                         icon.classList.add('fa-angle-down');
  295.                     }
  296.                 });
  297.             });
  298.         });
  299.     </script>
  300. {% endblock javascript %}
  301. {% block main %}
  302.     <!-- 移動確認モーダル-->
  303.     <div class="modal fade" id="confirmFormChangeModal" tabindex="-1" role="dialog"
  304.          aria-labelledby="confirmFormChangeModal" aria-hidden="true">
  305.         <div class="modal-dialog" role="document">
  306.             <div class="modal-content">
  307.                 <div class="modal-header">
  308.                     <h5 class="modal-title">{{ 'admin.common.move_to_confirm_title'|trans }}</h5>
  309.                     <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close">
  310.                     </button>
  311.                 </div>
  312.                 <div class="modal-body">
  313.                     <p class="screen-name"></p>
  314.                 </div>
  315.                 <div class="modal-footer">
  316.                     <a class="btn btn-ec-conversion" data-action="save" href="javascript:void(0)">
  317.                         {{ 'admin.common.move_to_confirm_save_and_move'|trans }}
  318.                     </a>
  319.                     <a class="btn btn-ec-sub" data-action="cancel" href="javascript:void(0)">
  320.                         {{ 'admin.common.move_to_confirm_move_only'|trans }}
  321.                     </a>
  322.                 </div>
  323.             </div>
  324.         </div>
  325.     </div>
  326.     <form role="form" name="form1" id="form1" method="post" action="" novalidate enctype="multipart/form-data">
  327.         {{ form_widget(form._token) }}
  328.         {{ form_widget(form.return_link) }}
  329.         <div class="c-contentsArea__cols">
  330.             <div class="c-contentsArea__primaryCol">
  331.                 <div class="c-primaryCol">
  332.                     <div class="card rounded border-0 mb-4">
  333.                         <div class="card-header">
  334.                             <div class="row">
  335.                                 <div class="col-8">
  336.                                     <div class="d-inline-block">
  337.                                     <span class="card-title">
  338.                                         {{ 'admin.product.product__card_title'|trans }}
  339.                                     </span>
  340.                                     </div>
  341.                                 </div>
  342.                                 <div class="col-4 text-end">
  343.                                     <a data-bs-toggle="collapse" href="#basicConfig" aria-expanded="false"
  344.                                        aria-controls="basicConfig">
  345.                                         <i class="fa fa-angle-up fa-lg"></i>
  346.                                     </a>
  347.                                 </div>
  348.                             </div>
  349.                         </div>
  350.                         <div class="collapse show ec-cardCollapse" id="basicConfig">
  351.                             <div class="card-body">
  352.                                 {% if Product.id %}
  353.                                     <div class="row">
  354.                                         <div class="col-3">
  355.                                             <div class="d-inline-block" data-bs-toggle="tooltip" data-bs-placement="top" title="{{ 'tooltip.product.product_id'|trans }}">
  356.                                                 <span>{{ 'admin.product.product_id'|trans }}</span>
  357.                                                 <i class="fa fa-question-circle fa-lg ms-1"></i>
  358.                                             </div>
  359.                                         </div>
  360.                                         <div class="col">
  361.                                             <p>{{ Product.id }}</p>
  362.                                         </div>
  363.                                     </div>
  364.                                 {% endif %}
  365.                                 <div class="row">
  366.                                     <div class="col-3">
  367.                                         <div class="d-inline-block">
  368.                                             <span>{{ 'admin.product.name'|trans }}</span>
  369.                                             <span class="badge bg-primary ms-1">
  370.                                                 {{ 'admin.common.required'|trans }}
  371.                                             </span>
  372.                                         </div>
  373.                                     </div>
  374.                                     <div class="col mb-2">
  375.                                         {{ form_widget(form.name) }}
  376.                                         {{ form_errors(form.name) }}
  377.                                     </div>
  378.                                 </div>
  379.                                 {% if has_class == false %}
  380.                                     <div class="row">
  381.                                         <div class="col-3">
  382.                                             <div class="d-inline-block" data-bs-toggle="tooltip" data-bs-placement="top" title="{{ 'tooltip.product.sale_type'|trans }}">
  383.                                                 <span>{{ 'admin.product.sale_type'|trans }}</span>
  384.                                                 <i class="fa fa-question-circle fa-lg ms-1"></i>
  385.                                                 <span class="badge bg-primary ms-1">
  386.                                                     {{ 'admin.common.required'|trans }}
  387.                                                 </span>
  388.                                             </div>
  389.                                         </div>
  390.                                         <div class="col mb-2">
  391.                                             {{ form_widget(form.class.sale_type) }}
  392.                                         </div>
  393.                                     </div>
  394.                                 {% endif %}
  395.                                 <div class="row">
  396.                                     <div class="col-3">
  397.                                         <div class="d-inline-block" data-bs-toggle="tooltip" data-bs-placement="top" title="{{ 'tooltip.product.image'|trans }}">
  398.                                             <span>{{ 'admin.product.image'|trans }}</span>
  399.                                             <i class="fa fa-question-circle fa-lg ms-1"></i>
  400.                                             <br>{{ 'admin.product.image_size'|trans }}
  401.                                         </div>
  402.                                     </div>
  403.                                     <div class="col mb-2">
  404.                                         <p id="message"></p>
  405.                                         <div id="upload-zone" class="rounded">
  406.                                             {{ form_widget(form.product_image, { attr : { style : 'display:none;' } }) }}
  407.                                             {{ form_errors(form.product_image) }}
  408.                                         </div><!-- /#upload-zone -->
  409.                                         <span class="invalid-feedback" id="product_image_error" style="display: none">
  410.                                             <span class="d-block">
  411.                                                 <span class="form-error-icon badge bg-danger text-uppercase">{{ 'Error'|trans({}, 'validators') }}</span>
  412.                                                 <span class="form-error-message"></span>
  413.                                             </span>
  414.                                         </span>
  415.                                     </div>
  416.                                 </div>
  417.                                 <div class="row">
  418.                                     <div class="col-3">
  419.                                         <div class="d-inline-block" data-bs-toggle="tooltip" data-bs-placement="top"
  420.                                              title="{{ 'tooltip.product.description_detail'|trans }}">
  421.                                             <span>{{ 'admin.product.description_detail'|trans }}</span>
  422.                                             <i class="fa fa-question-circle fa-lg ms-1"></i>
  423.                                         </div>
  424.                                     </div>
  425.                                     <div class="col">
  426.                                         {{ form_widget(form.description_detail, { attr : { rows : "8"} }) }}
  427.                                         {{ form_errors(form.description_detail) }}
  428.                                         <div class="d-inline-block mb-2" data-bs-toggle="collapse" href="#addComment"
  429.                                              role="button" aria-expanded="false" aria-controls="addComment">
  430.                                             <a>
  431.                                                 <i class="fa fa-plus-square-o fw-bold me-1"></i>
  432.                                                 <span class="fw-bold text-ec-black">
  433.                                                     {{ 'admin.product.description_list__add'|trans }}
  434.                                                 </span>
  435.                                             </a>
  436.                                         </div>
  437.                                     </div>
  438.                                 </div>
  439.                                 <div class="collapse ec-collapse" id="addComment">
  440.                                     <div class="row bg-ec-formGray pt-3 mb-2">
  441.                                         <div class="col-3">
  442.                                             <div class="d-inline-block" data-bs-toggle="tooltip" data-bs-placement="top"
  443.                                                  title="{{ 'tooltip.product.description_list'|trans }}">
  444.                                                 <span>{{ 'admin.product.description_list'|trans }}</span>
  445.                                                 <i class="fa fa-question-circle fa-lg ms-1"></i>
  446.                                             </div>
  447.                                         </div>
  448.                                         <div class="col mb-4">
  449.                                             <div>
  450.                                                 {{ form_widget(form.description_list, { attr : { rows : "4"} }) }}
  451.                                                 {{ form_errors(form.description_list) }}
  452.                                             </div>
  453.                                         </div>
  454.                                     </div>
  455.                                 </div>
  456.                                 {% if has_class == false %}
  457.                                     <div class="row">
  458.                                         <div class="col-3">
  459.                                             <div class="d-inline-block">
  460.                                                 <span>{{ 'admin.product.sale_price'|trans }}</span>
  461.                                                 <span class="badge bg-primary ms-1">
  462.                                                     {{ 'admin.common.required'|trans }}
  463.                                                 </span>
  464.                                             </div>
  465.                                         </div>
  466.                                         <div class="col mb-2">
  467.                                             <div>
  468.                                                 {{ form_widget(form.class.price02) }}
  469.                                                 {{ form_errors(form.class.price02) }}
  470.                                             </div>
  471.                                         </div>
  472.                                     </div>
  473.                                     <div class="row">
  474.                                         <div class="col-3">
  475.                                             <div class="d-inline-block" data-bs-toggle="tooltip" data-bs-placement="top"
  476.                                                  title="{{ 'tooltip.product.normal_price'|trans }}">
  477.                                                 <span>{{ 'admin.product.normal_price'|trans }}</span>
  478.                                                 <i class="fa fa-question-circle fa-lg ms-1"></i>
  479.                                             </div>
  480.                                         </div>
  481.                                         <div class="col mb-2">
  482.                                             <div>
  483.                                                 {{ form_widget(form.class.price01) }}
  484.                                                 {{ form_errors(form.class.price01) }}
  485.                                             </div>
  486.                                         </div>
  487.                                     </div>
  488.                                     <div class="row">
  489.                                         <div class="col-3">
  490.                                             <div class="d-inline-block">
  491.                                                 <span>{{ 'admin.product.stock'|trans }}</span>
  492.                                                 <span class="badge bg-primary ms-1">
  493.                                                     {{ 'admin.common.required'|trans }}
  494.                                                 </span>
  495.                                             </div>
  496.                                         </div>
  497.                                         <div class="col">
  498.                                             <div>
  499.                                                 {{ form_widget(form.class.stock) }}
  500.                                                 {{ form_errors(form.class.stock) }}
  501.                                                 {# TODO: form_layoutの調整 #}
  502.                                                 {#<div class="form-check mb-2">#}
  503.                                                 {#<input class="form-check-input"#}
  504.                                                 {#id="{{ form.class.stock_unlimited.vars.id }}"#}
  505.                                                 {#name="{{ form.class.stock_unlimited.vars.full_name }}"#}
  506.                                                 {#type="checkbox"#}
  507.                                                 {#value="{{ form.class.stock_unlimited.vars.value }}">#}
  508.                                                 {#<label class="form-check-label"#}
  509.                                                 {#for="{{ form.class.stock_unlimited.vars.id }}">#}
  510.                                                 {#{{ 'admin.product.product.stock_unlimited'|trans }}#}
  511.                                                 {#</label>#}
  512.                                                 {#</div>#}
  513.                                                 {{ form_widget(form.class.stock_unlimited) }}
  514.                                                 {{ form_errors(form.class.stock_unlimited) }}
  515.                                             </div>
  516.                                         </div>
  517.                                     </div>
  518.                                 {% endif %}
  519.                                 <div class="row">
  520.                                     <div class="col-3">
  521.                                         <div class="d-inline-block" data-bs-toggle="tooltip" data-bs-placement="top"
  522.                                              title="{{ 'tooltip.product.search_word'|trans }}">
  523.                                             <span>{{ 'admin.product.search_word'|trans }}</span>
  524.                                             <i class="fa fa-question-circle fa-lg ms-1"></i>
  525.                                         </div>
  526.                                     </div>
  527.                                     <div class="col mb-2">
  528.                                         <div>
  529.                                             {{ form_widget(form.search_word) }}
  530.                                             {{ form_errors(form.search_word) }}
  531.                                         </div>
  532.                                     </div>
  533.                                 </div>
  534.                                 {% if has_class == false %}
  535.                                     <div class="row">
  536.                                         <div class="col-3">
  537.                                             <div class="d-inline-block" data-bs-toggle="tooltip" data-bs-placement="top"
  538.                                                  title="{{ 'tooltip.product.product_code'|trans }}">
  539.                                                 <span>{{ 'admin.product.product_code'|trans }}</span>
  540.                                                 <i class="fa fa-question-circle fa-lg ms-1"></i>
  541.                                             </div>
  542.                                         </div>
  543.                                         <div class="col mb-2">
  544.                                             <div>
  545.                                                 {{ form_widget(form.class.code) }}
  546.                                                 {{ form_errors(form.class.code) }}
  547.                                             </div>
  548.                                         </div>
  549.                                     </div>
  550.                                     <div class="row">
  551.                                         <div class="col-3">
  552.                                             <div class="d-inline-block" data-bs-toggle="tooltip" data-bs-placement="top"
  553.                                                  title="{{ 'tooltip.product.sale_limit'|trans }}">
  554.                                                 <span>{{ 'admin.product.sale_limit'|trans }}</span>
  555.                                                 <i class="fa fa-question-circle fa-lg ms-1"></i>
  556.                                             </div>
  557.                                         </div>
  558.                                         <div class="col mb-2">
  559.                                             <div>
  560.                                                 {{ form_widget(form.class.sale_limit) }}
  561.                                                 {{ form_errors(form.class.sale_limit) }}
  562.                                             </div>
  563.                                         </div>
  564.                                     </div>
  565.                                     <div class="row">
  566.                                         <div class="col-3">
  567.                                             <div class="d-inline-block" data-bs-toggle="tooltip" data-bs-placement="top"
  568.                                                  title="{{ 'tooltip.product.delivery_duration'|trans }}">
  569.                                                 <span>{{ 'admin.product.delivery_duration'|trans }}</span>
  570.                                                 <i class="fa fa-question-circle fa-lg ms-1"></i>
  571.                                             </div>
  572.                                         </div>
  573.                                         <div class="col mb-2">
  574.                                             <div>
  575.                                                 {{ form_widget(form.class.delivery_duration) }}
  576.                                                 {{ form_errors(form.class.delivery_duration) }}
  577.                                             </div>
  578.                                         </div>
  579.                                     </div>
  580.                                     {% if BaseInfo.option_product_delivery_fee %}
  581.                                         <div class="row">
  582.                                             <div class="col-3">
  583.                                                 <div class="d-inline-block">
  584.                                                     <span>{{ 'admin.product.delivery_fee'|trans }}</span>
  585.                                                 </div>
  586.                                             </div>
  587.                                             <div class="col mb-2">
  588.                                                 <div>
  589.                                                     {{ form_widget(form.class.delivery_fee) }}
  590.                                                     {{ form_errors(form.class.delivery_fee) }}
  591.                                                 </div>
  592.                                             </div>
  593.                                         </div>
  594.                                     {% endif %}
  595.                                     {% if BaseInfo.option_product_tax_rule %}
  596.                                         <div class="row">
  597.                                             <div class="col-3">
  598.                                                 <div class="d-inline-block">
  599.                                                     <span>{{ 'admin.product.tax_rate'|trans }}</span>
  600.                                                 </div>
  601.                                             </div>
  602.                                             <div class="col mb-2">
  603.                                                 <div>
  604.                                                     {{ form_widget(form.class.tax_rate) }}
  605.                                                     {{ form_errors(form.class.tax_rate) }}
  606.                                                 </div>
  607.                                             </div>
  608.                                         </div>
  609.                                     {% endif %}
  610.                                 {% endif %}
  611.                                 {# エンティティ拡張の自動出力 #}
  612.                                 {% for f in form|filter(f => f.vars.eccube_form_options.auto_render) %}
  613.                                     {% if f.vars.eccube_form_options.form_theme %}
  614.                                         {% form_theme f f.vars.eccube_form_options.form_theme %}
  615.                                         {{ form_row(f) }}
  616.                                     {% else %}
  617.                                         <div class="row">
  618.                                             <div class="col-3">
  619.                                                 <span>{{ f.vars.label|trans }}</span>
  620.                                             </div>
  621.                                             <div class="col mb-2">
  622.                                                 <div>
  623.                                                     {{ form_widget(f) }}
  624.                                                     {{ form_errors(f) }}
  625.                                                 </div>
  626.                                             </div>
  627.                                         </div>
  628.                                     {% endif %}
  629.                                 {% endfor %}
  630.                                 {% if has_class == false %}
  631.                                     {% for f in form.class|filter(f => f.vars.eccube_form_options.auto_render) %}
  632.                                         {% if f.vars.eccube_form_options.form_theme %}
  633.                                             {% form_theme f f.vars.eccube_form_options.form_theme %}
  634.                                             {{ form_row(f) }}
  635.                                         {% else %}
  636.                                             <div class="row">
  637.                                                 <div class="col-3">
  638.                                                     <span>{{ f.vars.label|trans }}</span>
  639.                                                 </div>
  640.                                                 <div class="col mb-2">
  641.                                                     <div>
  642.                                                         {{ form_widget(f) }}
  643.                                                         {{ form_errors(f) }}
  644.                                                     </div>
  645.                                                 </div>
  646.                                             </div>
  647.                                         {% endif %}
  648.                                     {% endfor %}
  649.                                 {% endif %}
  650.                             </div>
  651.                         </div>
  652.                     </div>
  653.                     {% if id is not null %}
  654.                         <div class="card rounded border-0 mb-4">
  655.                             <div class="card-header">
  656.                                 <div class="row">
  657.                                     <div class="col-8">
  658.                                         <div class="d-inline-block" data-bs-toggle="tooltip" data-bs-placement="top"
  659.                                              title="{{ 'tooltip.product.product_class'|trans }}">
  660.                                         <span class="card-title">
  661.                                             {{ 'admin.product.product_class__card_title'|trans }}
  662.                                             <i class="fa fa-question-circle fa-lg ms-1"></i>
  663.                                         </span>
  664.                                         </div>
  665.                                     </div>
  666.                                     <div class="col-4 text-end">
  667.                                         <a data-bs-toggle="collapse" href="#standardConfig" aria-expanded="false"
  668.                                            aria-controls="standardConfig">
  669.                                             <i class="fa fa-angle-up fa-lg"></i>
  670.                                         </a>
  671.                                     </div>
  672.                                 </div>
  673.                             </div>
  674.                             <div class="collapse show ec-cardCollapse" id="standardConfig">
  675.                                 <div class="card-body">
  676.                                     {% if has_class == true %}
  677.                                         <table class="table table-striped">
  678.                                             <thead class="table-active">
  679.                                             <th class="ps-3 pt-2 pb-2">{{ 'admin.product.class_category1__short'|trans }}</th>
  680.                                             <th class="pt-2 pb-2">{{ 'admin.product.class_category2__short'|trans }}</th>
  681.                                             <th class="pt-2 pb-2">{{ 'admin.product.product_code__short'|trans }}</th>
  682.                                             <th class="pt-2 pb-2">{{ 'admin.product.stock'|trans }}</th>
  683.                                             <th class="pe-3 pt-2 pb-2">{{ 'admin.product.price'|trans }}</th>
  684.                                             </thead>
  685.                                             <tbody>
  686.                                             {% for Class in Product.ProductClasses %}
  687.                                                 {% if Class.visible == 1 %}
  688.                                                     <tr>
  689.                                                         <td class="ps-3">{% if Class.hasClassCategory1 %}{{ Class.ClassCategory1.name }}{% endif %}</td>
  690.                                                         <td>{% if Class.hasClassCategory2 %}{{ Class.ClassCategory2.name }}{% endif %}</td>
  691.                                                         <td>{{ Class.code }}</td>
  692.                                                         <td>{% if Class.stock_unlimited %}{{ 'admin.product.stock_unlimited__short'|trans }}{% else %}{{ Class.stock }}{% endif %}</td>
  693.                                                         <td class="pe-3">{{ Class.price02|price }}</td>
  694.                                                     </tr>
  695.                                                 {% endif %}
  696.                                             {% endfor %}
  697.                                             </tbody>
  698.                                         </table>
  699.                                     {% endif %}
  700.                                     <div class="d-block text-center text-center">
  701.                                         <a href="{{ path('admin_product_product_class', { 'id' : id }) }}" class="btn btn-ec-regular" data-action="confirm"
  702.                                            title="{{ 'admin.common.move_to_confirm_message'|trans({
  703.                                                '%name%' : 'admin.product.product_class_registration'|trans
  704.                                            }) }}">{{ 'admin.product.product_class__confirm_of_product'|trans }}</a>
  705.                                     </div>
  706.                                 </div>
  707.                             </div>
  708.                         </div>
  709.                     {% endif %}
  710.                     <div class="card rounded border-0 mb-4">
  711.                         <div class="card-header">
  712.                             <div class="row">
  713.                                 <div class="col-8">
  714.                                     <div class="d-inline-block" data-bs-toggle="tooltip" data-bs-placement="top"
  715.                                          title="{{ 'tooltip.product.free_area'|trans }}">
  716.                                         <span class="card-title">{{ 'admin.product.free_area__card_title'|trans }}</span>
  717.                                         <i class="fa fa-question-circle fa-lg ms-1"></i>
  718.                                     </div>
  719.                                 </div>
  720.                                 <div class="col-4 text-end">
  721.                                     <a data-bs-toggle="collapse" href="#freeArea" aria-expanded="false"
  722.                                        aria-controls="freeArea">
  723.                                         <i class="fa fa-angle-up fa-lg"></i>
  724.                                     </a>
  725.                                 </div>
  726.                             </div>
  727.                         </div>
  728.                         <div class="collapse show ec-cardCollapse" id="freeArea">
  729.                             <div class="card-body">
  730.                                 <div class="row">
  731.                                     <div class="col-3">
  732.                                         <span>{{ 'admin.product.free_area'|trans }}</span>
  733.                                     </div>
  734.                                     <div class="col-9">
  735.                                         <div>
  736.                                             {{ form_widget(form.free_area, {id: 'wysiwyg-area', attr : { rows : "8"} }) }}
  737.                                             {{ form_errors(form.free_area) }}
  738.                                         </div>
  739.                                     </div>
  740.                                 </div>
  741.                             </div>
  742.                         </div>
  743.                     </div>
  744.                 </div>
  745.             </div>
  746.             <div class="c-contentsArea__secondaryCol">
  747.                 <div class="c-secondaryCol">
  748.                     {% if id is not null %}
  749.                         <div class="card rounded border-0 mb-4">
  750.                             <div class="collapse show ec-cardCollapse" id="preview">
  751.                                 <div class="card-body">
  752.                                     <div class="d-block text-center">
  753.                                         <a class="btn w-100 btn-ec-regular"
  754.                                            target="_blank"
  755.                                            href="{{ url('product_detail', {id:id}) }}"
  756.                                            title="{{ 'admin.product.preview'|trans }}">{{ 'admin.product.preview'|trans }}</a>
  757.                                     </div>
  758.                                 </div>
  759.                             </div>
  760.                         </div>
  761.                     {% endif %}
  762.                     <div class="card rounded border-0 mb-4">
  763.                         <div class="card-header">
  764.                             <div class="row">
  765.                                 <div class="col-8">
  766.                                     <div class="d-inline-block">
  767.                                         <span class="card-title">{{ 'admin.product.category__product_card_title'|trans }}</span>
  768.                                     </div>
  769.                                 </div>
  770.                                 <div class="col-4 text-end">
  771.                                     <a data-bs-toggle="collapse" href="#category" aria-expanded="false" aria-controls="category">
  772.                                         <i class="fa fa-angle-up fa-lg"></i>
  773.                                     </a>
  774.                                 </div>
  775.                             </div>
  776.                         </div>
  777.                         <div class="collapse show ec-cardCollapse" id="category">
  778.                             <div class="card-body">
  779.                                 <div class="c-directoryTree--register rounded border mb-3 p-3">
  780.                                     {% macro tree(ChoicedIds, Category, form) %}
  781.                                         {% import _self as selfMacro %}
  782.                                         <li class="parent-category">
  783.                                             <div class="category-content clickable-area" data-category-id="{{ Category.id }}">
  784.                                                 <div class="checkbox-label-wrapper">
  785.                                                     <input type="checkbox" id="admin_product_category_{{ Category.id }}" name="admin_product[Category][]" value="{{ Category.id }}" {% if Category.id in ChoicedIds %}checked{% endif %}>
  786.                                                     <label for="admin_product_category_{{ Category.id }}">{{ Category.name }}</label>
  787.                                                 </div>
  788.                                                 {% if Category.children|length > 0 %}
  789.                                                     <span class="toggle-category" data-category-id="{{ Category.id }}">
  790.                                                         <i class="fa fa-angle-down fa-lg"></i>
  791.                                                     </span>
  792.                                                 {% endif %}
  793.                                             </div>
  794.                                             {% if Category.children|length > 0 %}
  795.                                                 <ul class="list-unstyled child-categories">
  796.                                                     {% for childCategory in Category.children %}
  797.                                                         {{ selfMacro.tree(ChoicedIds, childCategory, form) }}
  798.                                                     {% endfor %}
  799.                                                 </ul>
  800.                                             {% endif %}
  801.                                         </li>
  802.                                     {% endmacro %}
  803.                                     {% import _self as renderMacro %}
  804.                                     <ul class="list-unstyled">
  805.                                         {% for TopCategory in TopCategories %}
  806.                                             {{ renderMacro.tree(ChoicedCategoryIds, TopCategory, form.Category) }}
  807.                                         {% endfor %}
  808.                                     </ul>
  809.                                     {{ form_errors(form.Category) }}
  810.                                 </div>
  811.                             </div>
  812.                         </div>
  813.                     </div>
  814.                     <div class="card rounded border-0 mb-4">
  815.                         <div class="card-header">
  816.                             <div class="row">
  817.                                 <div class="col-8">
  818.                                     <span class="card-title">カテゴリごとのおすすめ度設定</span>
  819.                                 </div>
  820.                                 <div class="col-4 text-end">
  821.                                     <a data-bs-toggle="collapse" href="#recommend_rank" aria-expanded="false" aria-controls="recommend_rank">
  822.                                         <i class="fa fa-angle-up fa-lg"></i>
  823.                                     </a>
  824.                                 </div>
  825.                             </div>
  826.                         </div>
  827.                         <div class="collapse show ec-cardCollapse" id="recommend_rank">
  828.                             <div class="card-body">
  829.                                 <p class="text-muted">※数字が大きい順にソートされます</p>
  830.                                 <ul id="recommend_rank_fields" class="list-unstyled">
  831.                                     {% macro renderRecommendRank(ChoicedIds, Category, ranks) %}
  832.                                         {% set category_id = Category.id %}
  833.                                         <li id="recommend_rank_field_{{ category_id }}" style="display: none;">
  834.                                             <label>
  835.                                             {% if category_id == 428 or category_id == 217 %}
  836.                                             <strong>■ {{ Category.name }} のおすすめ度</strong>
  837.                                             {% else %}
  838.                                             <a href="/products/list?category_id={{ category_id }}" target="_blank">{{ Category.name }}</a> のおすすめ度
  839.                                             {% endif %}
  840.                                             </label>
  841.                                             <input type="number" name="recommend_rank_{{ category_id }}" class="form-control"
  842.                                                    placeholder="0~100範囲で設定"
  843.                                                    value="{{ ranks[category_id] | default('') }}">
  844.                                             {% if Category.children|length > 0 %}
  845.                                                 <ul class="list-unstyled ms-3">
  846.                                                     {% for childCategory in Category.children %}
  847.                                                         {{ _self.renderRecommendRank(ChoicedIds, childCategory, ranks) }}
  848.                                                     {% endfor %}
  849.                                                 </ul>
  850.                                             {% endif %}
  851.                                         </li>
  852.                                         {% endmacro %}
  853.                                     {% import _self as renderMacro %}
  854.                                     {% for TopCategory in TopCategories %}
  855.                                         <ul class="list-unstyled">
  856.                                             {{ renderMacro.renderRecommendRank(ChoicedCategoryIds, TopCategory, recommendRanks) }}
  857.                                         </ul>
  858.                                     {% endfor %}
  859.                                 </ul>
  860.                                 
  861.                             </div>
  862.                         </div>
  863.                     </div>
  864.                     <div class="card rounded border-0 mb-4">
  865.                         <div class="card-header">
  866.                             <div class="row">
  867.                                 <div class="col-8">
  868.                                     <div class="d-inline-block">
  869.                                         <span class="card-title">
  870.                                             {{ 'admin.product.tag__product_card_title'|trans }}
  871.                                         </span>
  872.                                     </div>
  873.                                 </div>
  874.                                 <div class="col-4 text-end">
  875.                                     <a data-bs-toggle="collapse" href="#tag" aria-expanded="false" aria-controls="tag">
  876.                                         <i class="fa fa-angle-up fa-lg"></i>
  877.                                     </a>
  878.                                 </div>
  879.                             </div>
  880.                         </div>
  881.                         <div class="collapse show ec-cardCollapse" id="tag">
  882.                             <div class="card-body">
  883.                                 {% if(Tags|length > 0) %}
  884.                                     {% for Tag in Tags %}
  885.                                         <div class="d-inline-block mb-2 me-2">
  886.                                             <button class="btn btn-outline-primary" type="button">{{ Tag.name }}</button>
  887.                                         </div>
  888.                                     {% endfor %}
  889.                                 {% endif %}
  890.                                 <div class="d-block mb-3" data-bs-toggle="collapse" href="#allTags" role="button"
  891.                                      aria-expanded="false" aria-controls="allTags">
  892.                                     <a>
  893.                                         <i class="fa fa-plus-square-o fw-bold me-1"></i>
  894.                                         <span class="fw-bold">{{ 'admin.product.save_tag'|trans }}</span>
  895.                                     </a>
  896.                                 </div>
  897.                                 <div class="collapse p-3 bg-ec-lightGray mb-3 ec-collapse" id="allTags">
  898.                                     <div class="d-none">
  899.                                         {{ form_widget(form.Tag) }}
  900.                                     </div>
  901.                                     {% if(TagsList|length > 0) %}
  902.                                         {% for Tag in TagsList %}
  903.                                             <div class="d-inline-block mb-2 me-2">
  904.                                                 <button class="btn btn-outline-secondary" type="button"
  905.                                                         data-tag-id="{{ Tag.id }}">{{ Tag.name }}</button>
  906.                                             </div>
  907.                                         {% endfor %}
  908.                                     {% endif %}
  909.                                     <div class="d-block mb-3" data-bs-toggle="collapse" href="#allTags" role="button"
  910.                                          aria-expanded="false" aria-controls="allTags"></div>
  911.                                 </div>
  912.                                 <div class="d-block text-center">
  913.                                     <a href="{{ path('admin_product_tag') }}"
  914.                                        class="btn w-100 btn-ec-regular"
  915.                                        data-action="confirm"
  916.                                        title="{{ 'admin.common.move_to_confirm_message'|trans({
  917.                                            '%name%' : 'admin.product.tag_management'|trans }) }}">{{ 'admin.product.move_to_tag'|trans }}</a>
  918.                                 </div>
  919.                             </div>
  920.                         </div>
  921.                     </div>
  922.                     <div class="card rounded border-0 mb-4">
  923.                         <div class="card-header">
  924.                             <div class="row">
  925.                                 <div class="col-8">
  926.                                     <span class="card-title">{{ 'admin.product.create_date__card_title'|trans }}</span>
  927.                                 </div>
  928.                                 <div class="col-4 text-end">
  929.                                     <a data-bs-toggle="collapse" href="#update" aria-expanded="false"
  930.                                        aria-controls="update">
  931.                                         <i class="fa fa-angle-up fa-lg"></i>
  932.                                     </a>
  933.                                 </div>
  934.                             </div>
  935.                         </div>
  936.                         <div class="collapse show ec-cardCollapse" id="update">
  937.                             <div class="card-body">
  938.                                 <div class="row mb-2">
  939.                                     <div class="col">
  940.                                         <i class="fa fa-flag me-1"></i>
  941.                                         <span>{{ 'admin.common.create_date'|trans }}</span>
  942.                                     </div>
  943.                                     <div class="col">
  944.                                         <span>:{{ Product.create_date|date_min }}</span>
  945.                                     </div>
  946.                                 </div>
  947.                                 <div class="row mb-2">
  948.                                     <div class="col">
  949.                                         <i class="fa fa-refresh me-1"></i>
  950.                                         <span>{{ 'admin.common.update_date'|trans }}</span>
  951.                                     </div>
  952.                                     <div class="col">
  953.                                         <span>:{{ Product.update_date|date_min }}</span>
  954.                                     </div>
  955.                                 </div>
  956.                                 <div class="row mb-2">
  957.                                     <div class="col">
  958.                                         <i class="fa fa-user me-1"></i>
  959.                                         <span>{{ 'admin.common.last_updater'|trans }}</span>
  960.                                     </div>
  961.                                     <div class="col">
  962.                                         <span>:{{ Product.Creator ? Product.Creator.name }}</span>
  963.                                     </div>
  964.                                 </div>
  965.                             </div>
  966.                         </div>
  967.                     </div>
  968.                     <div class="card rounded border-0 mb-4">
  969.                         <div class="card-header">
  970.                             <div class="row">
  971.                                 <div class="col-8">
  972.                                     <div class="d-inline-block" data-bs-toggle="tooltip" data-bs-placement="top"
  973.                                          title="{{ 'tooltip.product.shop_memo'|trans }}">
  974.                                         <span class="card-title">
  975.                                             {{ 'admin.common.shop_memo'|trans }}
  976.                                             <i class="fa fa-question-circle fa-lg ms-1"></i>
  977.                                         </span>
  978.                                     </div>
  979.                                 </div>
  980.                                 <div class="col-4 text-end">
  981.                                     <a data-bs-toggle="collapse" href="#shopMemo" aria-expanded="false"
  982.                                        aria-controls="shopMemo">
  983.                                         <i class="fa fa-angle-up fa-lg"></i>
  984.                                     </a>
  985.                                 </div>
  986.                             </div>
  987.                         </div>
  988.                         <div class="collapse show ec-cardCollapse" id="shopMemo">
  989.                             <div class="card-body">
  990.                                 {{ form_widget(form.note, { attr : { rows : "8"} }) }}
  991.                                 {{ form_errors(form.note) }}
  992.                             </div>
  993.                         </div>
  994.                     </div>
  995.                 </div>
  996.             </div>
  997.         </div>
  998.         <div class="c-conversionArea">
  999.             <div class="c-conversionArea__container">
  1000.                 <div class="row justify-content-between align-items-center">
  1001.                     <div class="col-6">
  1002.                         <div class="c-conversionArea__leftBlockItem">
  1003.                             <a class="c-baseLink" href="{{ path('admin_product_page', { page_no : app.session.get('eccube.admin.product.search.page_no')|default('1') } ) }}"
  1004.                                data-action="confirm" title="{{ 'admin.common.move_to_confirm_message'|trans({'%name%' : 'admin.product.product_list'|trans }) }}">
  1005.                                 <i class="fa fa-backward" aria-hidden="true"></i><span>{{ 'admin.product.product_list'|trans }}</span>
  1006.                             </a>
  1007.                         </div>
  1008.                     </div>
  1009.                     <div class="col-6">
  1010.                         <div id="ex-conversion-action" class="row align-items-center justify-content-end">
  1011.                             <div class="col-auto">
  1012.                                 {{ form_widget(form.Status) }}
  1013.                                 {{ form_errors(form.Status) }}
  1014.                             </div>
  1015.                             <div class="col-auto">
  1016.                                 <button class="btn btn-ec-conversion px-5" type="submit">{{ 'admin.common.registration'|trans }}</button>
  1017.                             </div>
  1018.                         </div>
  1019.                     </div>
  1020.                 </div>
  1021.             </div>
  1022.         </div>
  1023.     </form>
  1024. {% endblock %}