HEX
Server: Apache
System: Linux s198.coreserver.jp 5.15.0-151-generic #161-Ubuntu SMP Tue Jul 22 14:25:40 UTC 2025 x86_64
User: nagasaki (10062)
PHP: 7.1.33
Disabled: NONE
Upload Files
File: /virtual/nagasaki/public_html/ec/src/Eccube/Resource/template/admin/Order/search_product.twig
<script>
    // 商品規格情報. 規格2のプルダウンリストの設定に利用する,
    var productsClassCategories = {
        {% for Product in pagination %}
        "{{ Product.id|escape('js') }}": {{ Product.class_categories|json_encode|raw }}{% if loop.last == false %}, {% endif %}
        {% endfor %}
    };
    // 規格1が選択された際に, 規格2のプルダウンリストを設定する,
    function fnSetClassCategory2(select, product_id) {
        // 規格1の要素を取得
        var $sele1 = $(select);
        // 規格2の要素を取得
        var $sele2 = $sele1.parent().find('select[name=classcategory_id2]');

        // 規格1の選択肢
        var classcat_id1 = $sele1.val() ? $sele1.val() : '';

        // 規格2がある場合は選択肢を書き換える
        if ($sele2 && $sele2.length) {
            // 規格2の選択肢をクリア
            $sele2.children().remove();
            var classcat2 = productsClassCategories[product_id][classcat_id1];

            // 規格2の要素を設定
            for (var key in classcat2) {
                if (classcat2.hasOwnProperty(key)) {
                    var id = classcat2[key].classcategory_id2;
                    var name = classcat2[key].name;
                    var option = $('<option />').val(id ? id : '').text(name);
                    $sele2.append(option);
                }
            }
        }
    }
    // 受注明細行を追加する.
    // 受注明細行のレコード数カウンタ(order_details_count)は, edit.twig側で定義している.
    function fnAddOrderDetail($row, product_id) {
        // 規格1の要素を取得
        var $sele1 = $row.find('select[name=classcategory_id1]');
        // 規格2の要素を取得
        var $sele2 = $row.find('select[name=classcategory_id2]');

        var product_class_id = null;
        var price = null;
        var quantity = 1;
        var product_code = null;
        var tax_rate = null;

        // 規格なし商品の場合
        if (!$sele1.length && !$sele2.length) {
            var product = productsClassCategories[product_id]['__unselected2']['#'];
            product_class_id = product['product_class_id'];
            price = product['price02'];
            product_code = product['product_code'];
        // 規格が登録されている商品の場合
        } else if ($sele1.length) {
            if ($sele2.length) {
                var class_category_id1 = $sele1.val();
                var class_cateogry_id2 = $sele2.val();
                if (class_category_id1 == '__unselected' || !class_cateogry_id2) {
                    alert('規格を選択してください。')
                    return;
                }
                var product = productsClassCategories[product_id][class_category_id1]['#' + class_cateogry_id2];

                product_class_id = product['product_class_id'];
                price = product['price02'];
            } else {
                var class_category_id1 = $sele1.val();
                if (class_category_id1 == '__unselected') {
                    alert('規格を選択してください。')
                    return;
                }
                var product = productsClassCategories[product_id][class_category_id1]['#'];

                product_class_id = product['product_class_id'];
                price = product['price02'];
            }
        }

        // 受注明細行を取得.
        var list = $('#order_detail_list');
        var orderDetailExists = false;

        $('*[id^="product_info_list__item--"]').each(function () {
            var $inputs = $(this).find(':input');
            if ($inputs.filter('[id$="_ProductClass"][value="'+product_class_id+'"]').length > 0) {
                var $quantity = $inputs.filter('[id$="_quantity"]');
                var quantity = $quantity.val().trim();
                if (quantity.match(/^\d+$/)) {
                    $quantity.val(parseInt(quantity) + 1);
                }
                orderDetailExists = true;
                return false;
            }
        });

        if (!orderDetailExists) {

            // prototype templateを取得.
            var newWidget = list.attr('data-prototype');
            // レコード数カウンタで置換.
            newWidget = newWidget.replace(/__name__/g, order_details_count);
            // フォーム入力値をセットm
            $newWidget = $(newWidget);
            $newWidget.find('#order_OrderDetails_' + order_details_count + '_Product').val(product_id);
            $newWidget.find('#order_OrderDetails_' + order_details_count + '_ProductClass').val(product_class_id);
            $newWidget.find('#order_OrderDetails_' + order_details_count + '_price').val(price);
            $newWidget.find('#order_OrderDetails_' + order_details_count + '_quantity').val(1); // コントローラ側で再取得するため、仮の値をセット
            $newWidget.find('#order_OrderDetails_' + order_details_count + '_tax_rate').val(8); // コントローラ側で再取得するため、仮の値をセット

            // 明細行に追加.
            list.append($newWidget);
        }

        // 配送商品行を取得.
        list = $('#shipment_item_list' + shipment_idx);

        // prototype templateを取得.
        if (typeof(list) !== 'undefined' && list.length > 0) {

            var itemExists = false;

            list.find('*[id^="shipment_item__id--"]').each(function () {
                var $inputs = $(this).find(':input');
                if ($inputs.filter('[id$="_ProductClass"][value="'+product_class_id+'"]').length > 0) {
                    var $quantity = $inputs.filter('[id$="_quantity"]');
                    var quantity = $quantity.val().trim();
                    if (quantity.match(/^\d+$/)) {
                        $quantity.val(parseInt(quantity) + 1);
                    }
                    itemExists = true;
                    return false;
                }
            });

            if (!itemExists) {

                newWidget = list.attr('data-prototype');
                // レコード数カウンタで置換.
                newWidget = newWidget.replace(/__name__/g, shipmentItem_idx);
                // フォーム入力値をセット
                $newWidget = $(newWidget);
                $newWidget.find('#order_Shippings_' + shipment_idx + '_ShipmentItems_' + shipmentItem_idx + '_Product').val(product_id);
                $newWidget.find('#order_Shippings_' + shipment_idx + '_ShipmentItems_' + shipmentItem_idx + '_ProductClass').val(product_class_id);
                $newWidget.find('#order_Shippings_' + shipment_idx + '_ShipmentItems_' + shipmentItem_idx + '_price').val(price);
                $newWidget.find('#order_Shippings_' + shipment_idx + '_ShipmentItems_' + shipmentItem_idx + '_quantity').val(1); // コントローラ側で再取得するため、仮の値をセット

                // 明細行に追加.
                list.append($newWidget);
            }
        }

        if (orderDetailExists) {
            // カウンタを更新.
            order_details_count++;
        }

        // モーダル閉じる.
        $('#searchProductModal').modal('hide');

        // 再計算のためsubmit.
        setModeAndSubmit('modal');

        return false;
    }

    // 商品検索
    $('#product_pagination a').on('click', function(event) {
        var list = $('#searchProductModalList');
        list.children().remove();

        $.ajax({
            type: 'GET',
            dataType: 'html',
            url: $(this).attr('href'),
            success: function(data) {
                $('#searchProductModalList').html(data);
            },
            error: function() {
                alert('search product failed.');
            }
        });
        event.preventDefault();
    });
</script>
<div class="table-responsive">
    <table class="table">
        <tbody>

        {% for Product in pagination %}
            <form name="product_form{{ Product.id }}">
                {% set form = forms[Product.id] %}

                <tr>
                    <td>
                        {{ Product.id }}
                    </td>
                    <td>
                        {{ Product.name }}
                        {% if Product.hasProductClass %}
                            <span><br/>{{ Product.code_min }}~{{ Product.code_max }}</span>
                        {% else %}
                            <span><br/>{{ Product.code_min }}</span>
                        {% endif %}
                    </td>
                    <td>
                        {% if form.classcategory_id1 is defined %}
                            {{ form_label(form.classcategory_id1) }}:{{ form_widget(form.classcategory_id1, { attr : { 'onchange' : "fnSetClassCategory2(this," ~ Product.id ~ ")" } } ) }}
                            {% if form.classcategory_id2 is defined %}
                                <br/>{{ form_label(form.classcategory_id2) }}:{{ form_widget(form.classcategory_id2, {'id': ''}) }}
                            {% endif %}
                        {% endif %}
                    </td>
                    <div class="extra-form">
                        {% for f in form.getIterator %}
                            {% if f.vars.name matches '[^plg*]' %}
                                {{ form_label(f) }}
                                {{ form_widget(f) }}
                                {{ form_errors(f) }}
                            {% endif %}
                        {% endfor %}
                    </div>
                    <td class="text-right">
                        <button onclick="fnAddOrderDetail($(this).parent().parent(), {{ Product.id }})" type="button" class="btn btn-default btn-sm" name="mode" value="modal">
                            決定
                        </button>
                    </td>
                </tr>
            </form>
        {% endfor %}

        </tbody>
    </table>
    {% if pagination.totalItemCount > 0 %}
        {% include "pager.twig" with {'id': 'product_pagination', 'pages': pagination.paginationData, 'routes': 'admin_order_search_product_page'} %}
    {% endif %}
</div>