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 javascript %}
  14.     <script>
  15.         $(document).on('drop dragover', function(e) {
  16.             e.preventDefault();
  17.         });
  18.         $(function() {
  19.             {% if has_class == false %}
  20.             if ($("#{{ form.class.stock_unlimited.vars.id }}").prop("checked")) {
  21.                 $("#{{ form.class.stock.vars.id }}").attr("disabled", "disabled").val('');
  22.             } else {
  23.                 $("#{{ form.class.stock.vars.id }}").removeAttr("disabled");
  24.             }
  25.             $("#{{ form.class.stock_unlimited.vars.id }}").on("click change", function() {
  26.                 if ($(this).prop("checked")) {
  27.                     $("#{{ form.class.stock.vars.id }}").attr("disabled", "disabled").val('');
  28.                 } else {
  29.                     $("#{{ form.class.stock.vars.id }}").removeAttr("disabled");
  30.                 }
  31.             });
  32.             {% endif %}
  33.             // ファイルアップロード
  34.             // see https://pqina.nl/filepond/
  35.             var inputFileElement = document.querySelector('input[type=file]');
  36.             {% if eccube_config.locale == 'ja' or eccube_config.locale == 'en' %}
  37.             FilePond.setOptions(FilePondLocale_{{ eccube_config.locale }});
  38.             {% endif %}
  39.             FilePond.setOptions({
  40.                 server: {
  41.                     process: {
  42.                         url: '{{ path('admin_product_image_process') }}',
  43.                         headers: {
  44.                             'ECCUBE-CSRF-TOKEN': $('meta[name="eccube-csrf-token"]').attr('content'),
  45.                             'X-Requested-With': 'XMLHttpRequest'
  46.                         }
  47.                     },
  48.                     load: {
  49.                         url: '{{ path('admin_product_image_load') }}?source=',
  50.                         headers: {
  51.                             'X-Requested-With': 'XMLHttpRequest'
  52.                         }
  53.                     },
  54.                     revert: {
  55.                         url: '{{ path('admin_product_image_revert') }}',
  56.                         headers: {
  57.                             'ECCUBE-CSRF-TOKEN': $('meta[name="eccube-csrf-token"]').attr('content'),
  58.                             'X-Requested-With': 'XMLHttpRequest'
  59.                         }
  60.                     }
  61.                 }
  62.             });
  63.             var pond = FilePond.create(inputFileElement, {
  64.                 allowFileTypeValidation: true,
  65.                 acceptedFileTypes: [
  66.                     'image/gif',
  67.                     'image/png',
  68.                     'image/jpeg'
  69.                 ],
  70.                 allowFileSizeValidation: true,
  71.                 maxFileSize: 10000000,
  72.                 maxFiles: 10,
  73.                 allowBrowse: true,
  74.                 allowDrop: true,
  75.                 allowReorder: true,
  76.                 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>',
  77.                 styleItemPanelAspectRatio: 0.5625,
  78.                 // 保存されている画像のロード
  79.                 files: [
  80.                     {% for image in form.images %}
  81.                     {
  82.                         source: '{{ image.vars.value }}',
  83.                         options: {
  84.                             type: 'local'
  85.                         }
  86.                     },
  87.                     {% endfor %}
  88.                     // 追加してすぐの画像のロード. バリデーションエラーの場合など.
  89.                     {% for add_image in form.add_images %}
  90.                     {
  91.                         source: '{{ add_image.vars.value }}',
  92.                         options: {
  93.                             type: 'local'
  94.                         }
  95.                     },
  96.                     {% endfor %}
  97.                 ]
  98.             });
  99.             // 画像が追加されたら add_images にファイル名を追加する
  100.             var proto_add = '{{ form_widget(form.add_images.vars.prototype) }}';
  101.             pond.on('processfile', function(error, file) {
  102.                 if (error) {
  103.                     console.log(error);
  104.                 } else {
  105.                     $('#upload-zone').append(
  106.                         $(proto_add.replace(/__name__/g, file.id))
  107.                             .val(file.serverId)
  108.                             .addClass('add_images')
  109.                     );
  110.                 }
  111.             });
  112.             // 画像が削除されたら delete_images にファイル名を追加する
  113.             var proto_del = '{{ form_widget(form.delete_images.vars.prototype) }}';
  114.             pond.on('removefile', function(error, file) {
  115.                 if (error) {
  116.                     console.log(error);
  117.                 } else {
  118.                     // file.serverId にはアップロードしたファイル名が格納される.
  119.                     if (file.serverId) {
  120.                         $('#upload-zone').append(
  121.                             $(proto_del.replace(/__name__/g, file.id))
  122.                                 .val(file.serverId)
  123.                                 .addClass('del_images')
  124.                         );
  125.                     }
  126.                     // 追加してすぐ削除した画像があれば削除する
  127.                     $('#upload-zone').find('#admin_product_add_images_' + file.id).remove(); // 追加してすぐ削除した画像
  128.                     $('#upload-zone').find('.add_images[value="' + file.filename + '"]').remove(); // 追加後, バリデーションエラーが発生した後に削除した画像
  129.                 }
  130.             });
  131.             pond.on('initfile', function() {
  132.                 $('#product_image_error').hide();
  133.             });
  134.             pond.on('error', function(error, file) {
  135.                 var message = '{{ 'admin.common.upload_error'|trans }}';
  136.                 if (error.main !== undefined) {
  137.                     message = `${error.main}: ${error.sub}`;
  138.                 }
  139.                 $('#product_image_error')
  140.                     .show()
  141.                     .find('.form-error-message').text(message);
  142.                 // エラーメッセージが表示されてからプレビューエリアのエラーメッセージを非表示にする
  143.                 setTimeout(function() {
  144.                     $('.filepond--file-status').hide();
  145.                 }, 300);
  146.             });
  147.             // バリデーションエラーが出た場合に画像を保持するための hidden を追加しておく
  148.             var proto_image = '{{ form_widget(form.images.vars.prototype) }}';
  149.             {% for image in form.images %}
  150.                 $('#upload-zone').append(
  151.                     $(proto_image.replace(/__name__/g, '{{ loop.index0 }}'))
  152.                         .val('{{ image.vars.value }}')
  153.                         .addClass('images')
  154.                 );
  155.             {% endfor %}
  156.             {% for add_image in form.add_images %}
  157.                 $('#upload-zone').append(
  158.                     $('{{ form_widget(add_image) }}')
  159.                         .val('{{ add_image.vars.value }}')
  160.                         .addClass('add_images')
  161.                 );
  162.             {% endfor %}
  163.             {% for delete_image in form.delete_images %}
  164.                 $('#upload-zone').append(
  165.                     $('{{ form_widget(delete_image) }}').addClass('del_images')
  166.                 );
  167.             {% endfor %}
  168.             // タグ管理
  169.             var mainTags = $('#allTags');
  170.             var adminProductTag = $('#admin_product_Tag');
  171.             $('input', adminProductTag).each(function() {
  172.                 if ($(this).is(':checked')) {
  173.                     $('button[data-tag-id="' + $(this).val() + '"]').removeClass('btn-outline-secondary').addClass('btn-outline-primary');
  174.                 }
  175.             });
  176.             mainTags.on('click', 'button.btn', function() {
  177.                 var btnTag = $(this);
  178.                 var tagId = btnTag.data('tag-id');
  179.                 if (btnTag.hasClass('btn-outline-primary')) {
  180.                     btnTag.removeClass('btn-outline-primary').addClass('btn-outline-secondary');
  181.                     $('input[value="' + tagId + '"]', mainTags).prop('checked', false);
  182.                 } else {
  183.                     btnTag.removeClass('btn-outline-secondary').addClass('btn-outline-primary');
  184.                     $('input[value="' + tagId + '"]', mainTags).prop('checked', true);
  185.                 }
  186.             });
  187.             var confirmFormChange = function(form, target, modal) {
  188.                 var returnLink = form.find('input[type="hidden"][name*="return_link"]'),
  189.                     saveBtn = modal.find('a[data-action="save"]'),
  190.                     cancelBtn = modal.find('a[data-action="cancel"]');
  191.                 modal.on('hidden.bs.modal', function() {
  192.                     returnLink.val('');
  193.                 });
  194.                 saveBtn.on('click', function() {
  195.                     returnLink.val($(this).data('return-link'));
  196.                     $(this).addClass('disabled');
  197.                     form.submit();
  198.                 });
  199.                 target.on('click', function() {
  200.                     modal.find('.modal-body .screen-name').text($(this).attr('title'));
  201.                     modal.modal('show');
  202.                     saveBtn.data('return-link', $(this).attr('href'));
  203.                     cancelBtn.attr('href', $(this).attr('href'));
  204.                     return false;
  205.                 });
  206.             };
  207.             confirmFormChange($('#form1'), $('a[data-action="confirm"]'), $('#confirmFormChangeModal'))
  208.         });
  209.         // searchWordの実行
  210.         $('#search-category').on('input', function () {
  211.             searchWord($(this).val(), $('.category-li'));
  212.         });
  213.     </script>
  214. {% endblock javascript %}
  215. {% block main %}
  216.     <!-- 移動確認モーダル-->
  217.     <div class="modal fade" id="confirmFormChangeModal" tabindex="-1" role="dialog"
  218.          aria-labelledby="confirmFormChangeModal" aria-hidden="true">
  219.         <div class="modal-dialog" role="document">
  220.             <div class="modal-content">
  221.                 <div class="modal-header">
  222.                     <h5 class="modal-title">{{ 'admin.common.move_to_confirm_title'|trans }}</h5>
  223.                     <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close">
  224.                     </button>
  225.                 </div>
  226.                 <div class="modal-body">
  227.                     <p class="screen-name"></p>
  228.                 </div>
  229.                 <div class="modal-footer">
  230.                     <a class="btn btn-ec-conversion" data-action="save" href="javascript:void(0)">
  231.                         {{ 'admin.common.move_to_confirm_save_and_move'|trans }}
  232.                     </a>
  233.                     <a class="btn btn-ec-sub" data-action="cancel" href="javascript:void(0)">
  234.                         {{ 'admin.common.move_to_confirm_move_only'|trans }}
  235.                     </a>
  236.                 </div>
  237.             </div>
  238.         </div>
  239.     </div>
  240.     <form role="form" name="form1" id="form1" method="post" action="" novalidate enctype="multipart/form-data">
  241.         {{ form_widget(form._token) }}
  242.         {{ form_widget(form.return_link) }}
  243.     <div class="row">
  244.         <div class="c-contentsArea__cols" style="padding-bottom:0px">
  245.             <div class="c-contentsArea__primaryCol">
  246.                 <div class="c-primaryCol">
  247.                     <div class="card rounded border-0 mb-4">
  248.                         <div class="card-header">
  249.                             <div class="row">
  250.                                 <div class="col-8">
  251.                                     <div class="d-inline-block">
  252.                                     <span class="card-title">
  253.                                         {{ 'admin.product.product__card_title'|trans }}
  254.                                     </span>
  255.                                     </div>
  256.                                 </div>
  257.                                 <div class="col-4 text-end">
  258.                                     <a data-bs-toggle="collapse" href="#basicConfig" aria-expanded="false"
  259.                                        aria-controls="basicConfig">
  260.                                         <i class="fa fa-angle-up fa-lg"></i>
  261.                                     </a>
  262.                                 </div>
  263.                             </div>
  264.                         </div>
  265.                         <div class="collapse show ec-cardCollapse" id="basicConfig">
  266.                             <div class="card-body">
  267.                                 {% if Product.id %}
  268.                                     <div class="row">
  269.                                         <div class="col-3">
  270.                                             <div>
  271.                                                 <span>{{ 'admin.product.product_id'|trans }}</span>
  272.                                             </div>
  273.                                         </div>
  274.                                         <div class="col">
  275.                                             <p>{{ Product.id }}</p>
  276.                                         </div>
  277.                                     </div>
  278.                                 {% endif %}
  279.                                 <div class="row">
  280.                                     <div class="col-3">
  281.                                         <div class="d-inline-block">
  282.                                             <span>{{ 'admin.product.name'|trans }}</span>
  283.                                             <span class="badge bg-primary ms-1">
  284.                                                 {{ 'admin.common.required'|trans }}
  285.                                             </span>
  286.                                         </div>
  287.                                     </div>
  288.                                     <div class="col mb-2">
  289.                                         {{ form_widget(form.name) }}
  290.                                         {{ form_errors(form.name) }}
  291.                                     </div>
  292.                                 </div>
  293.                                 {% if has_class == false %}
  294.                                     <div class="row">
  295.                                         <div class="col-3">
  296.                                             <div class="d-inline-block">
  297.                                                 <span>{{ 'admin.product.product_code'|trans }}</span>
  298.                                             </div>
  299.                                         </div>
  300.                                         <div class="col mb-2">
  301.                                             <div>
  302.                                                 {{ form_widget(form.class.code) }}
  303.                                                 {{ form_errors(form.class.code) }}
  304.                                             </div>
  305.                                         </div>
  306.                                     </div>
  307.                                     <div class="row">
  308.                                         <div class="col-3">
  309.                                             <div>
  310.                                                 <span>{{ 'admin.product.sale_type'|trans }}</span>
  311.                                                 <span class="badge bg-primary ms-1">
  312.                                                     {{ 'admin.common.required'|trans }}
  313.                                                 </span>
  314.                                             </div>
  315.                                         </div>
  316.                                         <div class="col mb-2">
  317.                                             {{ form_widget(form.class.sale_type) }}
  318.                                             {{ form_errors(form.class.sale_type) }}
  319.                                         </div>
  320.                                     </div>
  321.                                     <div class="row">
  322.                                         <div class="col-3">
  323.                                             <div class="d-inline-block">
  324.                                                 <span>販売価格(見積商品は最低価格)</span>
  325.                                                 <span class="badge bg-primary ms-1">
  326.                                                     {{ 'admin.common.required'|trans }}
  327.                                                 </span>
  328.                                             </div>
  329.                                         </div>
  330.                                         <div class="col mb-2">
  331.                                             <div>
  332.                                                 {{ form_widget(form.class.price02) }}
  333.                                                 {{ form_errors(form.class.price02) }}
  334.                                             </div>
  335.                                         </div>
  336.                                     </div>
  337.                                     <div class="row">
  338.                                         <div class="col-3">
  339.                                             <div class="d-inline-block">
  340.                                                 <span>{{ 'admin.product.stock'|trans }}</span>
  341.                                                 <span class="badge bg-primary ms-1">
  342.                                                     {{ 'admin.common.required'|trans }}
  343.                                                 </span>
  344.                                             </div>
  345.                                         </div>
  346.                                         <div class="col">
  347.                                             <div>
  348.                                                 {{ form_widget(form.class.stock) }}
  349.                                                 {{ form_errors(form.class.stock) }}
  350.                                                 {# TODO: form_layoutの調整 #}
  351.                                                 {#<div class="form-check mb-2">#}
  352.                                                 {#<input class="form-check-input"#}
  353.                                                 {#id="{{ form.class.stock_unlimited.vars.id }}"#}
  354.                                                 {#name="{{ form.class.stock_unlimited.vars.full_name }}"#}
  355.                                                 {#type="checkbox"#}
  356.                                                 {#value="{{ form.class.stock_unlimited.vars.value }}">#}
  357.                                                 {#<label class="form-check-label"#}
  358.                                                 {#for="{{ form.class.stock_unlimited.vars.id }}">#}
  359.                                                 {#{{ 'admin.product.product.stock_unlimited'|trans }}#}
  360.                                                 {#</label>#}
  361.                                                 {#</div>#}
  362.                                                 {{ form_widget(form.class.stock_unlimited) }}
  363.                                                 {{ form_errors(form.class.stock_unlimited) }}
  364.                                             </div>
  365.                                         </div>
  366.                                     </div>
  367.                                 {% endif %}
  368.                                 <div class="row">
  369.                                     <div class="col-3">
  370.                                         <div class="d-inline-block" data-bs-toggle="tooltip" data-bs-placement="top" title="{{ 'tooltip.product.image'|trans }}">
  371.                                             <span>{{ 'admin.product.image'|trans }}</span>
  372.                                             <i class="fa fa-question-circle fa-lg ms-1"></i>
  373.                                             <br>{{ 'admin.product.image_size'|trans }}
  374.                                         </div>
  375.                                     </div>
  376.                                     <div class="col mb-2">
  377.                                         <p id="message"></p>
  378.                                         <div id="upload-zone" class="rounded">
  379.                                             {{ form_widget(form.product_image, { attr : { style : 'display:none;' } }) }}
  380.                                             {{ form_errors(form.product_image) }}
  381.                                         </div><!-- /#upload-zone -->
  382.                                         <span class="invalid-feedback" id="product_image_error" style="display: none">
  383.                                             <span class="d-block">
  384.                                                 <span class="form-error-icon badge bg-danger text-uppercase">{{ 'Error'|trans({}, 'validators') }}</span>
  385.                                                 <span class="form-error-message"></span>
  386.                                             </span>
  387.                                         </span>
  388.                                     </div>
  389.                                 </div>
  390.                                 <div class="row">
  391.                                     <div class="col-3">
  392.                                         <div class="d-inline-block" data-bs-toggle="tooltip" data-bs-placement="top">
  393.                                             <span>カラー</span>
  394.                                         </div>
  395.                                     </div>
  396.                                     <div class="col mb-2">
  397.                                         <table class="table table-bordered">
  398.                                             <tr>
  399.                                                 <th>カラー名</th>
  400.                                                 <th>カラーコード</th>
  401.                                                 <th>サンプル画像</th>
  402.                                                 <th>設定</th>
  403.                                             </tr>
  404.                                         {% set disable_color = false %}
  405.                                         {% for i in 0..10 %}
  406.                                             {% if color and color|length >= i+1 %}
  407.                                             <tr id="color_list_{{ i }}">
  408.                                                 <td>
  409.                                                     <input type="text" class="form-control" id="color_name_{{ i }}" placeholder="カラー名" name="color[{{ i }}][name]" value="{{ color[i]['name'] }}">
  410.                                                 </td>
  411.                                                 <td>
  412.                                                     <input type="text" class="form-control" id="color_code_{{ i }}" placeholder="カラーコード" name="color[{{ i }}][code]" value="{{ color[i]['code'] }}">
  413.                                                 </td>
  414.                                                 <td>
  415.                                                     <input type="text" class="form-control" id="color_img_{{ i }}" placeholder="サンプル画像" name="color[{{ i }}][img]" value="{{ color[i]['img'] }}">
  416.                                                 </td>
  417.                                                 <td>
  418.                                                     <button type="button" class="btn btn-danger" onclick="if(confirm('削除してよろしいですか?')){ $('#color_list_{{ i }}').remove(); }">削除</button>
  419.                                                 </td>
  420.                                             </tr>
  421.                                             {% else %}
  422.                                             <tr id="color_list_{{ i }}" {% if disable_color %}style="display:none;"{% endif %}>
  423.                                                 <td>
  424.                                                     <input type="text" class="form-control" id="color_name_{{ i }}" placeholder="カラー名" name="color[{{ i }}][name]" value="">
  425.                                                 </td>
  426.                                                 <td>
  427.                                                     <input type="text" class="form-control" id="color_code_{{ i }}" placeholder="カラーコード" name="color[{{ i }}][code]" value="">
  428.                                                 </td>
  429.                                                 <td>
  430.                                                     <input type="text" class="form-control" id="color_img_{{ i }}" placeholder="サンプル画像" name="color[{{ i }}][img]" value="">
  431.                                                 </td>
  432.                                                 <td>
  433.                                                     <button type="button" id="color_btn_{{ i }}" class="btn btn-danger" style="display:none;" onclick="if(confirm('削除してよろしいですか?')){$('#color_list_{{ i }}').remove();}">削除</button>
  434.                                                     <button type="button" class="btn btn-warning" onclick="$('#color_list_{{ i + 1 }}').show();$('#color_btn_{{ i }}').show();$(this).hide();">追加</button>
  435.                                                 </td>
  436.                                             </tr>
  437.                                             {% set disable_color = true %}
  438.                                             {% endif %}
  439.                                           {% endfor %}
  440.                                         </table>
  441.                                             {{ form_errors(form.search_word) }}
  442.                                     </div>
  443.                                 </div>
  444.                                 <div class="row">
  445.                                     <div class="col-3">
  446.                                         <div class="d-inline-block">
  447.                                             <span>一覧スペック</span>
  448.                                         </div>
  449.                                     </div>
  450.                                     <div class="col mb-2">
  451.                                         <div>
  452.                                             {{ form_widget(form.list_spec, { attr : { rows : "4"} }) }}
  453.                                             {{ form_errors(form.list_spec) }}
  454.                                         </div>
  455.                                     </div>
  456.                                 </div>
  457.                                 <div class="row">
  458.                                     <div class="col-3">
  459.                                         <div class="d-inline-block">
  460.                                             <span>一覧説明</span>
  461.                                         </div>
  462.                                     </div>
  463.                                     <div class="col mb-2">
  464.                                         <div>
  465.                                             {{ form_widget(form.description_list, { attr : { rows : "4"} }) }}
  466.                                             {{ form_errors(form.description_list) }}
  467.                                         </div>
  468.                                     </div>
  469.                                 </div>
  470.                                 <div class="row">
  471.                                     <div class="col-3">
  472.                                         <div class="d-inline-block" data-bs-toggle="tooltip" data-bs-placement="top"
  473.                                              title="{{ 'tooltip.product.description_detail'|trans }}">
  474.                                             <span>{{ 'admin.product.description_detail'|trans }}</span>
  475.                                             <i class="fa fa-question-circle fa-lg ms-1"></i>
  476.                                         </div>
  477.                                     </div>
  478.                                     <div class="col mb-2">
  479.                                         {{ form_widget(form.description_detail, { attr : { rows : "4"} }) }}
  480.                                         {{ form_errors(form.description_detail) }}
  481.                                     </div>
  482.                                 </div>
  483.                                 <div class="row">
  484.                                     <div class="col-3">
  485.                                         <div class="d-inline-block">
  486.                                             <span>おすすめポイント</span>
  487.                                         </div>
  488.                                     </div>
  489.                                     <div class="col mb-2">
  490.                                         {{ form_widget(form.recommend_point, { attr : { rows : "3"} }) }}
  491.                                         {{ form_errors(form.recommend_point) }}
  492.                                     </div>
  493.                                 </div>
  494.                                 <div class="row">
  495.                                     <div class="col-3">
  496.                                         <div class="d-inline-block">
  497.                                             <span>販売情報</span>
  498.                                         </div>
  499.                                     </div>
  500.                                     <div class="col mb-2">
  501.                                         {{ form_widget(form.sales_infomation, { attr : { rows : "3"} }) }}
  502.                                         {{ form_errors(form.sales_infomation) }}
  503.                                     </div>
  504.                                 </div>
  505.                                 {% if has_class == false %}
  506.                                     <div class="row">
  507.                                         <div class="col-3">
  508.                                             <div class="d-inline-block">
  509.                                                 <span>{{ 'admin.product.sale_limit'|trans }}</span>
  510.                                             </div>
  511.                                         </div>
  512.                                         <div class="col mb-2">
  513.                                             <div>
  514.                                                 {{ form_widget(form.class.sale_limit) }}
  515.                                                 {{ form_errors(form.class.sale_limit) }}
  516.                                             </div>
  517.                                         </div>
  518.                                     </div>
  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.delivery_duration'|trans }}">
  523.                                                 <span>{{ 'admin.product.delivery_duration'|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.class.delivery_duration) }}
  530.                                                 {{ form_errors(form.class.delivery_duration) }}
  531.                                             </div>
  532.                                         </div>
  533.                                     </div>
  534.                                     {% if BaseInfo.option_product_delivery_fee %}
  535.                                         <div class="row">
  536.                                             <div class="col-3">
  537.                                                 <div class="d-inline-block">
  538.                                                     <span>{{ 'admin.product.delivery_fee'|trans }}</span>
  539.                                                 </div>
  540.                                             </div>
  541.                                             <div class="col mb-2">
  542.                                                 <div>
  543.                                                     {{ form_widget(form.class.delivery_fee) }}
  544.                                                     {{ form_errors(form.class.delivery_fee) }}
  545.                                                 </div>
  546.                                             </div>
  547.                                         </div>
  548.                                     {% endif %}
  549.                                     {% if BaseInfo.option_product_tax_rule %}
  550.                                         <div class="row">
  551.                                             <div class="col-3">
  552.                                                 <div class="d-inline-block">
  553.                                                     <span>{{ 'admin.product.tax_rate'|trans }}</span>
  554.                                                 </div>
  555.                                             </div>
  556.                                             <div class="col mb-2">
  557.                                                 <div>
  558.                                                     {{ form_widget(form.class.tax_rate) }}
  559.                                                     {{ form_errors(form.class.tax_rate) }}
  560.                                                 </div>
  561.                                             </div>
  562.                                         </div>
  563.                                     {% endif %}
  564.                                 {% endif %}
  565.                                 {% if has_class == false %}
  566.                                     {% for f in form.class|filter(f => f.vars.eccube_form_options.auto_render) %}
  567.                                         {% if f.vars.eccube_form_options.form_theme %}
  568.                                             {% form_theme f f.vars.eccube_form_options.form_theme %}
  569.                                             {{ form_row(f) }}
  570.                                         {% else %}
  571.                                             <div class="row">
  572.                                                 <div class="col-3">
  573.                                                     <span>{{ f.vars.label|trans }}</span>
  574.                                                 </div>
  575.                                                 <div class="col mb-2">
  576.                                                     <div>
  577.                                                         {{ form_widget(f) }}
  578.                                                         {{ form_errors(f) }}
  579.                                                     </div>
  580.                                                 </div>
  581.                                             </div>
  582.                                         {% endif %}
  583.                                     {% endfor %}
  584.                                 {% endif %}
  585.                                 {% if has_class == false %}
  586.                                     <div class="row">
  587.                                         <div class="col-3">
  588.                                             <div class="d-inline-block">
  589.                                                 <span>メーカー</span>
  590.                                             </div>
  591.                                         </div>
  592.                                         <div class="col mb-2">
  593.                                             <div>
  594.                                                 {{ form_widget(form.Maker) }}
  595.                                                 {{ form_errors(form.Maker) }}
  596.                                             </div>
  597.                                         </div>
  598.                                     </div>
  599.                                     <div class="row">
  600.                                         <div class="col-3">
  601.                                             <div class="d-inline-block">
  602.                                                 <span>メーカーURL</span>
  603.                                             </div>
  604.                                         </div>
  605.                                         <div class="col mb-2">
  606.                                             <div>
  607.                                                 {{ form_widget(form.makerurl) }}
  608.                                                 {{ form_errors(form.makerurl) }}
  609.                                             </div>
  610.                                         </div>
  611.                                     </div>
  612.                                     <div class="row">
  613.                                         <div class="col-3">
  614.                                             <div class="d-inline-block">
  615.                                                 <span>メーカー価格(見積商品は最低価格)</span>
  616.                                             </div>
  617.                                         </div>
  618.                                         <div class="col mb-2">
  619.                                             <div>
  620.                                                 {{ form_widget(form.class.price01) }}
  621.                                                 {{ form_errors(form.class.price01) }}
  622.                                             </div>
  623.                                         </div>
  624.                                     </div>
  625.                                 {% endif %}
  626.                             </div>
  627.                         </div>
  628.                     </div>
  629.                 </div>
  630.             </div>
  631.             <div class="c-contentsArea__secondaryCol">
  632.                 <div class="c-secondaryCol">
  633.                     {% if id is not null %}
  634.                         <div class="card rounded border-0 mb-4">
  635.                             <div class="collapse show ec-cardCollapse" id="preview">
  636.                                 <div class="card-body">
  637.                                     <div class="d-block text-center">
  638.                                         <a class="btn w-100 btn-ec-regular"
  639.                                            target="_blank"
  640.                                            href="{{ url('product_detail', {id:id}) }}"
  641.                                            title="{{ 'admin.product.preview'|trans }}">{{ 'admin.product.preview'|trans }}</a>
  642.                                     </div>
  643.                                 </div>
  644.                             </div>
  645.                         </div>
  646.                     {% endif %}
  647.                     <div class="card rounded border-0 mb-4">
  648.                         <div class="card-header">
  649.                             <div class="row">
  650.                                 <div class="col-8">
  651.                                     <div class="d-inline-block">
  652.                                         <span class="card-title">{{ 'admin.product.category__product_card_title'|trans }}</span>
  653.                                     </div>
  654.                                 </div>
  655.                                 <div class="col-4 text-end">
  656.                                     <a data-bs-toggle="collapse" href="#category" aria-expanded="false"
  657.                                        aria-controls="category">
  658.                                         <i class="fa fa-angle-up fa-lg"></i>
  659.                                     </a>
  660.                                 </div>
  661.                             </div>
  662.                         </div>
  663.                         <div class="collapse show ec-cardCollapse" id="category">
  664.                             <div class="card-body">
  665.                                 <div class="mb-3">
  666.                                     <div class="row">
  667.                                         <div class="col">
  668.                                             <div class="input-group">
  669.                                                 <div class="input-group-text">
  670.                                                     <span id="basic-addon1">
  671.                                                             <i class="fa fa-search"></i>
  672.                                                     </span>
  673.                                                 </div>
  674.                                                 <input id="search-category" class="form-control" type="search"
  675.                                                        placeholder="{{ 'admin.product.search_category'|trans }}"
  676.                                                        aria-label="Search">
  677.                                             </div>
  678.                                         </div>
  679.                                     </div>
  680.                                 </div>
  681.                                 {% macro tree(ChoicedIds, Category, form) %}
  682.                                     {% import _self as selfMacro %}
  683.                                     <li class="c-directoryTree--registerItem category-li">
  684.                                         <input type="checkbox" id="admin_product_category_{{ Category.id }}" name="admin_product[Category][]" value="{{ Category.id }}" {% if Category.id in ChoicedIds %}checked{% endif %}>
  685.                                         <label for="admin_product_category_{{ Category.id }}">{{ Category.name }}</label>
  686.                                         <ul class="list-unstyled">
  687.                                             {% for child,ChildCategory in Category.children %}
  688.                                                 {{ selfMacro.tree(ChoicedIds, ChildCategory, form) }}
  689.                                             {% endfor %}
  690.                                         </ul>
  691.                                     </li>
  692.                                 {% endmacro %}
  693.                                 <div class="c-directoryTree--register rounded border mb-3 p-3">
  694.                                     {% import _self as renderMacro %}
  695.                                     {% for TopCategory in TopCategories %}
  696.                                         <ul class="list-unstyled">
  697.                                             {{ renderMacro.tree(ChoicedCategoryIds, TopCategory, form.Category) }}
  698.                                         </ul>
  699.                                     {% endfor %}
  700.                                     {{ form_errors(form.Category) }}
  701.                                 </div>
  702.                                 <div class="d-block text-center">
  703.                                     <a class="btn w-100 btn-ec-regular"
  704.                                        data-action="confirm"
  705.                                        href="{{ path('admin_product_category') }}"
  706.                                        title="{{ 'admin.common.move_to_confirm_message'|trans({
  707.                                            '%name%' : 'admin.product.category_management'|trans}) }}">{{ 'admin.product.move_to_category'|trans }}</a>
  708.                                 </div>
  709.                             </div>
  710.                         </div>
  711.                     </div>
  712.                     <div class="card rounded border-0 mb-4">
  713.                         <div class="card-header">
  714.                             <div class="row">
  715.                                 <div class="col-8">
  716.                                     <div class="d-inline-block">
  717.                                         <span class="card-title">
  718.                                             {{ 'admin.product.tag__product_card_title'|trans }}
  719.                                         </span>
  720.                                     </div>
  721.                                 </div>
  722.                                 <div class="col-4 text-end">
  723.                                     <a data-bs-toggle="collapse" href="#tag" aria-expanded="false" aria-controls="tag">
  724.                                         <i class="fa fa-angle-up fa-lg"></i>
  725.                                     </a>
  726.                                 </div>
  727.                             </div>
  728.                         </div>
  729.                         <div class="collapse show ec-cardCollapse" id="tag">
  730.                             <div class="card-body">
  731.                                 {% if(Tags|length > 0) %}
  732.                                     {% for Tag in Tags %}
  733.                                         <div class="d-inline-block mb-2 me-2">
  734.                                             <button class="btn btn-outline-primary" type="button">{{ Tag.name }}</button>
  735.                                         </div>
  736.                                     {% endfor %}
  737.                                 {% endif %}
  738.                                 <div class="d-block mb-3" data-bs-toggle="collapse" href="#allTags" role="button"
  739.                                      aria-expanded="false" aria-controls="allTags">
  740.                                     <a>
  741.                                         <i class="fa fa-plus-square-o fw-bold me-1"></i>
  742.                                         <span class="fw-bold">{{ 'admin.product.save_tag'|trans }}</span>
  743.                                     </a>
  744.                                 </div>
  745.                                 <div class="collapse p-3 bg-ec-lightGray mb-3 ec-collapse show" id="allTags">
  746.                                     <div class="d-none">
  747.                                         {{ form_widget(form.Tag) }}
  748.                                     </div>
  749.                                     {% if(TagsList|length > 0) %}
  750.                                         {% for Tag in TagsList %}
  751.                                             <div class="d-inline-block mb-2 me-2">
  752.                                                 <button class="btn btn-outline-secondary" type="button"
  753.                                                         data-tag-id="{{ Tag.id }}">{{ Tag.name }}</button>
  754.                                             </div>
  755.                                         {% endfor %}
  756.                                     {% endif %}
  757.                                     <div class="d-block mb-3" data-bs-toggle="collapse" href="#allTags" role="button"
  758.                                          aria-expanded="false" aria-controls="allTags"></div>
  759.                                 </div>
  760.                                 <div class="d-block text-center">
  761.                                     <a href="{{ path('admin_product_tag') }}"
  762.                                        class="btn w-100 btn-ec-regular"
  763.                                        data-action="confirm"
  764.                                        title="{{ 'admin.common.move_to_confirm_message'|trans({
  765.                                            '%name%' : 'admin.product.tag_management'|trans }) }}">{{ 'admin.product.move_to_tag'|trans }}</a>
  766.                                 </div>
  767.                             </div>
  768.                         </div>
  769.                     </div>
  770.                     <div class="card rounded border-0 mb-4">
  771.                         <div class="card-header">
  772.                             <div class="row">
  773.                                 <div class="col-8">
  774.                                     <span class="card-title">{{ 'admin.product.create_date__card_title'|trans }}</span>
  775.                                 </div>
  776.                                 <div class="col-4 text-end">
  777.                                     <a data-bs-toggle="collapse" href="#update" aria-expanded="false"
  778.                                        aria-controls="update">
  779.                                         <i class="fa fa-angle-up fa-lg"></i>
  780.                                     </a>
  781.                                 </div>
  782.                             </div>
  783.                         </div>
  784.                         <div class="collapse show ec-cardCollapse" id="update">
  785.                             <div class="card-body">
  786.                                 <div class="row mb-2">
  787.                                     <div class="col">
  788.                                         <i class="fa fa-flag me-1"></i>
  789.                                         <span>{{ 'admin.common.create_date'|trans }}</span>
  790.                                     </div>
  791.                                     <div class="col">
  792.                                         <span>:{{ Product.create_date|date_min }}</span>
  793.                                     </div>
  794.                                 </div>
  795.                                 <div class="row mb-2">
  796.                                     <div class="col">
  797.                                         <i class="fa fa-refresh me-1"></i>
  798.                                         <span>{{ 'admin.common.update_date'|trans }}</span>
  799.                                     </div>
  800.                                     <div class="col">
  801.                                         <span>:{{ Product.update_date|date_min }}</span>
  802.                                     </div>
  803.                                 </div>
  804.                                 <div class="row mb-2">
  805.                                     <div class="col">
  806.                                         <i class="fa fa-user me-1"></i>
  807.                                         <span>{{ 'admin.common.last_updater'|trans }}</span>
  808.                                     </div>
  809.                                     <div class="col">
  810.                                         <span>:{{ Product.Creator ? Product.Creator.name }}</span>
  811.                                     </div>
  812.                                 </div>
  813.                             </div>
  814.                         </div>
  815.                     </div>
  816.                     <div class="card rounded border-0 mb-4">
  817.                         <div class="card-header">
  818.                             <div class="row">
  819.                                 <div class="col-8">
  820.                                     <div class="d-inline-block" data-bs-toggle="tooltip" data-bs-placement="top"
  821.                                          title="{{ 'tooltip.product.shop_memo'|trans }}">
  822.                                         <span class="card-title">
  823.                                             {{ 'admin.common.shop_memo'|trans }}
  824.                                             <i class="fa fa-question-circle fa-lg ms-1"></i>
  825.                                         </span>
  826.                                     </div>
  827.                                 </div>
  828.                                 <div class="col-4 text-end">
  829.                                     <a data-bs-toggle="collapse" href="#shopMemo" aria-expanded="false"
  830.                                        aria-controls="shopMemo">
  831.                                         <i class="fa fa-angle-up fa-lg"></i>
  832.                                     </a>
  833.                                 </div>
  834.                             </div>
  835.                         </div>
  836.                         <div class="collapse show ec-cardCollapse" id="shopMemo">
  837.                             <div class="card-body">
  838.                                 {{ form_widget(form.note, { attr : { rows : "8"} }) }}
  839.                                 {{ form_errors(form.note) }}
  840.                             </div>
  841.                         </div>
  842.                     </div>
  843.                 </div>
  844.             </div>
  845.         </div>
  846.         </div>
  847.             <div id="item_option" class="row" style="padding: 0 15px">
  848.                     <div class="card rounded border-0 mb-4">
  849.                         <div class="card-header">
  850.                             <div class="row">
  851.                                 <div class="col-8">
  852.                                     <div class="d-inline-block">
  853.                                         <span class="card-title">商品価格設定</span>
  854.                                     </div>
  855.                                 </div>
  856.                                 <div class="col-4 text-end">
  857.                                     <a data-bs-toggle="collapse" href="#freeArea" aria-expanded="false"
  858.                                        aria-controls="freeArea">
  859.                                         <i class="fa fa-angle-up fa-lg"></i>
  860.                                     </a>
  861.                                 </div>
  862.                             </div>
  863.                         </div>
  864.                         <div class="collapse show ec-cardCollapse" id="freeArea">
  865.                             <div class="card-body" style="overflow-y: scroll;max-height: 700px;">
  866.                                 <table class="table table-bordered" id="product_option1">
  867.                                   <thead>
  868.                                     <tr>
  869.                                         <th>幅</th>
  870.                                         <th>奥行き</th>
  871.                                         <th>高さ</th>
  872.                                         <th>カラー</th>
  873.                                         <th>素材</th>
  874.                                         <th>メーカー価格</th>
  875.                                         <th>割引率</th>
  876.                                         <th>価格</th>
  877.                                         <th>基本工事費</th>
  878.                                         <th>設定</th>
  879.                                     </tr>
  880.                                   </thead>
  881.                                   <tbody>
  882.                                 {% set disable_pp = false %}
  883.                                 {% for i in 0..1600 %}
  884.                                     {% if pp and pp|length > i %}
  885.                                     <tr id="pp_list_{{ i }}">
  886.                                         <td>
  887.                                             <div style="display:none">{{ pp[i]['w'] }}</div>
  888.                                             <input type="text" class="form-control" id="pp_w_{{ i }}" placeholder="幅" name="pp[{{ i }}][w]" value="{{ pp[i]['w'] }}">
  889.                                         </td>
  890.                                         <td>
  891.                                             <div style="display:none">{{ pp[i]['d'] }}</div>
  892.                                             <input type="text" class="form-control" id="pp_d_{{ i }}" placeholder="奥行き" name="pp[{{ i }}][d]" value="{{ pp[i]['d'] }}">
  893.                                         </td>
  894.                                         <td>
  895.                                             <div style="display:none">{{ pp[i]['h'] }}</div>
  896.                                             <input type="text" class="form-control" id="pp_h_{{ i }}" placeholder="高さ" name="pp[{{ i }}][h]" value="{{ pp[i]['h'] }}">
  897.                                         </td>
  898.                                         <td>
  899.                                             <div style="display:none">{{ pp[i]['c'] }}</div>
  900.                                             <input type="text" class="form-control" id="pp_c_{{ i }}" placeholder="カラー" name="pp[{{ i }}][c]" value="{{ pp[i]['c'] }}">
  901.                                         </td>
  902.                                         <td>
  903.                                             <div style="display:none">{{ pp[i]['m'] }}</div>
  904.                                             <input type="text" class="form-control" id="pp_m_{{ i }}" placeholder="素材" name="pp[{{ i }}][m]" value="{{ pp[i]['m'] }}">
  905.                                         </td>
  906.                                         <td>
  907.                                             <input type="text" class="form-control" id="pp_mp_{{ i }}" placeholder="メーカー価格" name="pp[{{ i }}][maker_price]" value="{{ pp[i]['maker_price'] }}">
  908.                                         </td>
  909.                                         <td>
  910.                                             <input type="text" class="form-control" id="pp_s_{{ i }}" placeholder="割引率" name="pp[{{ i }}][sale]" value="{{ pp[i]['sale'] }}">
  911.                                         </td>
  912.                                         <td>
  913.                                             <input type="text" class="form-control" id="pp_p_{{ i }}" placeholder="価格" name="pp[{{ i }}][price]" value="{{ pp[i]['price'] }}">
  914.                                         </td>
  915.                                         <td>
  916.                                             <input type="text" class="form-control" id="pp_ct_{{ i }}" placeholder="基本工事費" name="pp[{{ i }}][ct]" value="{{ pp[i]['ct'] }}">
  917.                                         </td>
  918.                                         <td>
  919.                                             <button type="button" class="btn btn-danger" onclick="if(confirm('削除してよろしいですか?')){ $('#pp_list_{{ i }}').remove(); }">削除</button>
  920.                                         </td>
  921.                                     </tr>
  922.                                     {% else %}
  923.                                     <tr id="pp_list_{{ i }}" {% if disable_pp %}style="display:none;"{% endif %}>
  924.                                         <td>
  925.                                             <input type="text" class="form-control" id="pp_w_{{ i }}" placeholder="幅" name="pp[{{ i }}][w]" value="">
  926.                                         </td>
  927.                                         <td>
  928.                                             <input type="text" class="form-control" id="pp_d_{{ i }}" placeholder="奥行き" name="pp[{{ i }}][d]" value="">
  929.                                         </td>
  930.                                         <td>
  931.                                             <input type="text" class="form-control" id="pp_h_{{ i }}" placeholder="高さ" name="pp[{{ i }}][h]" value="">
  932.                                         </td>
  933.                                         <td>
  934.                                             <input type="text" class="form-control" id="pp_c_{{ i }}" placeholder="カラー" name="pp[{{ i }}][c]" value="">
  935.                                         </td>
  936.                                         <td>
  937.                                             <input type="text" class="form-control" id="pp_m_{{ i }}" placeholder="素材" name="pp[{{ i }}][m]" value="">
  938.                                         </td>
  939.                                         <td>
  940.                                             <input type="text" class="form-control" id="pp_mp_{{ i }}" placeholder="メーカー価格" name="pp[{{ i }}][maker_price]" value="">
  941.                                         </td>
  942.                                         <td>
  943.                                             <input type="text" class="form-control" id="pp_s_{{ i }}" placeholder="割引率" name="pp[{{ i }}][sale]" value="">
  944.                                         </td>
  945.                                         <td>
  946.                                             <input type="text" class="form-control" id="pp_p_{{ i }}" placeholder="価格" name="pp[{{ i }}][price]" value="">
  947.                                         </td>
  948.                                         <td>
  949.                                             <input type="text" class="form-control" id="pp_ct_{{ i }}" placeholder="基本工事費" name="pp[{{ i }}][ct]" value="">
  950.                                         </td>
  951.                                         <td>
  952.                                             <button type="button" id="pp_btn_{{ i }}" class="btn btn-danger" style="display:none;" onclick="if(confirm('削除してよろしいですか?')){$('#pp_list_{{ i }}').remove();}">削除</button>
  953.                                             <button type="button" class="btn btn-warning" onclick="$('#pp_list_{{ i + 1 }}').show();$('#pp_btn_{{ i }}').show();$(this).hide();">追加</button>
  954.                                         </td>
  955.                                     </tr>
  956.                                     {% set disable_pp = true %}
  957.                                     {% endif %}
  958.                                   {% endfor %}
  959.                                   </tbody>
  960.                                 </table>
  961.                             </div>
  962.                         </div>
  963.                     </div>
  964.                     <div class="card rounded border-0 mb-4">
  965.                         <div class="card-header">
  966.                             <div class="row">
  967.                                 <div class="col-8">
  968.                                     <div class="d-inline-block">
  969.                                         <span class="card-title">施工オプション設定</span>
  970.                                     </div>
  971.                                 </div>
  972.                                 <div class="col-4 text-end">
  973.                                     <a data-bs-toggle="collapse" href="#optionArea" aria-expanded="false"
  974.                                        aria-controls="optionArea">
  975.                                         <i class="fa fa-angle-up fa-lg"></i>
  976.                                     </a>
  977.                                 </div>
  978.                             </div>
  979.                         </div>
  980.                         <div class="collapse show ec-cardCollapse" id="optionArea">
  981.                             <div class="card-body" style="overflow-y: scroll;max-height: 700px;">
  982.                                 <table class="table table-bordered">
  983.                                     <tr>
  984.                                         <th>オプション名</th>
  985.                                         <th>依頼するテキスト</th>
  986.                                         <th>依頼しないテキスト</th>
  987.                                         <th>オプション価格</th>
  988.                                         <th rowspan="2">設定</th>
  989.                                     </tr>
  990.                                     <tr>
  991.                                         <th colspan="4">オプション説明</th>
  992.                                     </tr>
  993.                                 {% set disable_op = false %}
  994.                                 {% for i in 0..10 %}
  995.                                     {% if op and op|length >= i+1 %}
  996.                                     <tr id="op_list1_{{ i }}">
  997.                                         <td>
  998.                                             <input type="text" class="form-control" id="op_name_{{ i }}" placeholder="オプション名" name="op[{{ i }}][name]" value="{{ op[i]['name'] }}">
  999.                                         </td>
  1000.                                         <td>
  1001.                                             <input type="text" class="form-control" id="op_on_text{{ i }}" placeholder="依頼するテキスト" name="op[{{ i }}][on]" value="{{ op[i]['on'] }}">
  1002.                                         </td>
  1003.                                         <td>
  1004.                                             <input type="text" class="form-control" id="pp_off_text_{{ i }}" placeholder="依頼しないテキスト" name="op[{{ i }}][off]" value="{{ op[i]['off'] }}">
  1005.                                         </td>
  1006.                                         <td>
  1007.                                             <input type="text" class="form-control" id="op_price_{{ i }}" placeholder="オプション価格" name="op[{{ i }}][price]" value="{{ op[i]['price'] }}">
  1008.                                         </td>
  1009.                                         <td rowspan="2">
  1010.                                             <button type="button" class="btn btn-danger" onclick="if(confirm('削除してよろしいですか?')){ $('#op_list1_{{ i }}').remove(); $('#op_list2_{{ i }}').remove(); }">削除</button>
  1011.                                         </td>
  1012.                                     </tr>
  1013.                                     <tr id="op_list2_{{ i }}">
  1014.                                         <td colspan="4">
  1015.                                             <input type="text" class="form-control" id="op_comment_{{ i }}" placeholder="オプション説明" name="op[{{ i }}][comment]" value="{{ op[i]['comment'] }}">
  1016.                                         </td>
  1017.                                     </tr>
  1018.                                     {% else %}
  1019.                                     <tr id="op_list1_{{ i }}" {% if disable_op %}style="display:none;"{% endif %}>
  1020.                                         <td>
  1021.                                             <input type="text" class="form-control" id="op_name_{{ i }}" placeholder="オプション名" name="op[{{ i }}][name]" value="">
  1022.                                         </td>
  1023.                                         <td>
  1024.                                             <input type="text" class="form-control" id="op_on_text{{ i }}" placeholder="依頼するテキスト" name="op[{{ i }}][on]" value="">
  1025.                                         </td>
  1026.                                         <td>
  1027.                                             <input type="text" class="form-control" id="pp_off_text_{{ i }}" placeholder="依頼しないテキスト" name="op[{{ i }}][off]" value="">
  1028.                                         </td>
  1029.                                         <td>
  1030.                                             <input type="text" class="form-control" id="op_price_{{ i }}" placeholder="オプション価格" name="op[{{ i }}][price]" value="">
  1031.                                         </td>
  1032.                                         <td rowspan="2">
  1033.                                             <button type="button" id="op_btn_{{ i }}" class="btn btn-danger" style="display:none;" onclick="if(confirm('削除してよろしいですか?')){$('#op_list1_{{ i }}').remove();$('#op_list2_{{ i }}').remove();}">削除</button>
  1034.                                             <button type="button" class="btn btn-warning" onclick="$('#op_list1_{{ i + 1 }}').show();$('#op_list2_{{ i + 1 }}').show();$('#op_btn_{{ i }}').show();$(this).hide();">追加</button>
  1035.                                         </td>
  1036.                                     </tr>
  1037.                                     <tr id="op_list2_{{ i }}" {% if disable_op %}style="display:none;"{% endif %}>
  1038.                                         <td colspan="4">
  1039.                                             <input type="text" class="form-control" id="op_comment_{{ i }}" placeholder="オプション説明" name="op[{{ i }}][comment]" value="">
  1040.                                         </td>
  1041.                                     </tr>
  1042.                                     {% set disable_op = true %}
  1043.                                     {% endif %}
  1044.                                   {% endfor %}
  1045.                                 </table>
  1046.                             </div>
  1047.                         </div>
  1048.                     </div>
  1049.                     <div class="card rounded border-0 mb-4">
  1050.                         <div class="card-header">
  1051.                             <div class="row">
  1052.                                 <div class="col-8">
  1053.                                     <div class="d-inline-block">
  1054.                                         <span class="card-title">オプション商品設定</span>
  1055.                                     </div>
  1056.                                 </div>
  1057.                                 <div class="col-4 text-end">
  1058.                                     <a data-bs-toggle="collapse" href="#optionItemArea" aria-expanded="false"
  1059.                                        aria-controls="optionItemArea">
  1060.                                         <i class="fa fa-angle-up fa-lg"></i>
  1061.                                     </a>
  1062.                                 </div>
  1063.                             </div>
  1064.                         </div>
  1065.                         <div class="collapse show ec-cardCollapse" id="optionItemArea">
  1066.                             <div class="card-body" style="overflow-y: scroll;max-height: 700px;">
  1067.                                 <table class="table table-bordered">
  1068.                                     <tr>
  1069.                                         <th rowspan="2">商品画像</th>
  1070.                                         <th>商品名</th>
  1071.                                         <th>素材</th>
  1072.                                         <th>カラー</th>
  1073.                                         <th>価格</th>
  1074.                                         <th>工事費</th>
  1075.                                         <th rowspan="2">設定</th>
  1076.                                     </tr>
  1077.                                     <tr>
  1078.                                         <th colspan="5">説明</th>
  1079.                                     </tr>
  1080.                                 {% set disable_oi = false %}
  1081.                                 {% for i in 0 .. 1000 %}
  1082.                                     {% if oi and oi|length > i  %}
  1083.                                     <tr id="oi_list1_{{ i }}">
  1084.                                         <td rowspan="2">
  1085.                                             <input type="file" class="form-control" id="oi_image_{{ i }}" placeholder="商品画像" name="oi[{{ i }}][image]">
  1086.                                         </td>
  1087.                                         <td>
  1088.                                             <input type="text" class="form-control" id="oi_name_{{ i }}" placeholder="商品名" name="oi[{{ i }}][name]" value="{{ oi[i]['name'] }}">
  1089.                                         </td>
  1090.                                         <td>
  1091.                                             <input type="text" class="form-control" id="oi_m_{{ i }}" placeholder="素材" name="oi[{{ i }}][m]" value="{{ oi[i]['m'] }}">
  1092.                                         </td>
  1093.                                         <td>
  1094.                                             <input type="text" class="form-control" id="oi_c_{{ i }}" placeholder="カラー" name="oi[{{ i }}][c]" value="{{ oi[i]['c'] }}">
  1095.                                         </td>
  1096.                                         <td>
  1097.                                             <input type="text" class="form-control" id="oi_price1_{{ i }}" placeholder="価格" name="oi[{{ i }}][price1]" value="{{ oi[i]['price1'] }}">
  1098.                                         </td>
  1099.                                         <td>
  1100.                                             <input type="text" class="form-control" id="oi_price2_{{ i }}" placeholder="工事費" name="oi[{{ i }}][price2]" value="{{ oi[i]['price2'] }}">
  1101.                                         </td>
  1102.                                         <td rowspan="2">
  1103.                                             <button type="button" class="btn btn-danger" onclick="if(confirm('削除してよろしいですか?')){ $('#oi_list1_{{ i }}').remove(); $('#oi_list2_{{ i }}').remove(); }">削除</button>
  1104.                                         </td>
  1105.                                     </tr>
  1106.                                     <tr id="oi_list2_{{ i }}">
  1107.                                         <td colspan="5">
  1108.                                             <input type="text" class="form-control" id="oi_comment_{{ i }}" placeholder="説明" name="oi[{{ i }}][comment]" value="{{ oi[i]['comment'] }}">
  1109.                                         </td>
  1110.                                     </tr>
  1111.                                     {% else %}
  1112.                                     <tr id="oi_list1_{{ i }}" {% if disable_oi %}style="display:none;"{% endif %}>
  1113.                                         <td rowspan="2">
  1114.                                             <input type="file" class="form-control" id="oi_image_{{ i }}" placeholder="商品画像" name="oi[{{ i }}][image]">
  1115.                                         </td>
  1116.                                         <td>
  1117.                                             <input type="text" class="form-control" id="oi_name_{{ i }}" placeholder="商品名" name="oi[{{ i }}][name]" value="">
  1118.                                         </td>
  1119.                                         <td>
  1120.                                             <input type="text" class="form-control" id="oi_m_{{ i }}" placeholder="素材" name="oi[{{ i }}][m]" value="">
  1121.                                         </td>
  1122.                                         <td>
  1123.                                             <input type="text" class="form-control" id="oi_c_{{ i }}" placeholder="カラー" name="oi[{{ i }}][c]" value="">
  1124.                                         </td>
  1125.                                         <td>
  1126.                                             <input type="text" class="form-control" id="oi_price1_{{ i }}" placeholder="価格" name="oi[{{ i }}][price1]" value="">
  1127.                                         </td>
  1128.                                         <td>
  1129.                                             <input type="text" class="form-control" id="oi_price2_{{ i }}" placeholder="工事費" name="oi[{{ i }}][price2]" value="">
  1130.                                         </td>
  1131.                                         <td rowspan="2">
  1132.                                             <button type="button" id="oi_btn_{{ i }}" class="btn btn-danger" style="display:none;" onclick="if(confirm('削除してよろしいですか?')){$('#oi_list1_{{ i }}').remove();$('#oi_list2_{{ i }}').remove();}">削除</button>
  1133.                                             <button type="button" class="btn btn-warning" onclick="$('#oi_list1_{{ i + 1 }}').show();$('#oi_list2_{{ i + 1 }}').show();$('#oi_btn_{{ i }}').show();$(this).hide();">追加</button>
  1134.                                         </td>
  1135.                                     </tr>
  1136.                                     <tr id="oi_list2_{{ i }}" {% if disable_oi %}style="display:none;"{% endif %}>
  1137.                                         <td colspan="5">
  1138.                                             <input type="text" class="form-control" id="oi_comment_{{ i }}" placeholder="説明" name="oi[{{ i }}][comment]" value="">
  1139.                                         </td>
  1140.                                     </tr>
  1141.                                     {% set disable_oi = true %}
  1142.                                     {% endif %}
  1143.                                   {% endfor %}
  1144.                                 </table>
  1145.                             </div>
  1146.                         </div>
  1147.                     </div>
  1148.         </div>
  1149.         <div class="c-conversionArea">
  1150.             <div class="c-conversionArea__container">
  1151.                 <div class="row justify-content-between align-items-center">
  1152.                     <div class="col-6">
  1153.                         <div class="c-conversionArea__leftBlockItem">
  1154.                             <a class="c-baseLink" href="{{ path('admin_product_page', { page_no : app.session.get('eccube.admin.product.search.page_no')|default('1') } ) }}"
  1155.                                data-action="confirm" title="{{ 'admin.common.move_to_confirm_message'|trans({'%name%' : 'admin.product.product_list'|trans }) }}">
  1156.                                 <i class="fa fa-backward" aria-hidden="true"></i><span>{{ 'admin.product.product_list'|trans }}</span>
  1157.                             </a>
  1158.                         </div>
  1159.                     </div>
  1160.                     <div class="col-6">
  1161.                         <div id="ex-conversion-action" class="row align-items-center justify-content-end">
  1162.                             <div class="col-auto">
  1163.                                 {{ form_widget(form.Status) }}
  1164.                                 {{ form_errors(form.Status) }}
  1165.                             </div>
  1166.                             <div class="col-auto">
  1167.                                 <button class="btn btn-ec-conversion px-5" type="submit">{{ 'admin.common.registration'|trans }}</button>
  1168.                             </div>
  1169.                         </div>
  1170.                     </div>
  1171.                 </div>
  1172.             </div>
  1173.         </div>
  1174.     </form>
  1175. {% endblock %}