PHP・LaravelとjQueryで明細を追加する方法②

目次

追加した明細を削除する

前回で明細を追加しましたが、次はその明細を削除してPOSTする手順を記述していきます。

フロー
  • 各明細行の削除ボタンを押下
  • 該当明細行を非表示にする
  • 削除フラグを立てる
行を追加
5行目の削除ボタン、送信ボタンを押下
削除した行に削除フラグが立つ

Controller

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\users;

class BlogController extends Controller
{
    public function gettest(Request $request) {
        //  サンプルデータ
        $dataList = Array(
            array(
                'id' => 1,
                'name' => 'りんご',
                'price' => 150,
            ),
            array(
                'id' => 2,
                'name' => 'ぶどう',
                'price' => 200,
            ),
            array(
                'id' => 3,
                'name' => 'いちご',
                'price' => 250,
            ),
        );

        return view('test', [
            'dataList' => $dataList
        ]);
    }

    public function posttest(Request $request) {
        //  リクエストデータをダンプ
        dd($request->all());
    }
}

Blade

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Laravel</title>

        <!-- Fonts -->
        <link rel="preconnect" href="https://fonts.bunny.net">
        <link href="https://fonts.bunny.net/css?family=figtree:400,600&display=swap" rel="stylesheet" />
    </head>
    <style>
        tbody tr td{
            padding: 5px;
        }
    </style>
    <script src="https://code.jquery.com/jquery-3.7.1.js" integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4=" crossorigin="anonymous"></script>
    <body>
        <h3>テストフォーム</h3>
        <form action="{{ route('posttest') }}" method="POST">
            @csrf
            <table border="1" style="border-collapse: collapse;" id="table">
                <tbody>
                    @foreach ($dataList as $key => $data)
                    <tr>
                        <td>
                            {{$data['id']}}
                            <input type="hidden" name="id[]" value="{{$data['id']}}">  {{-- 追加 --}}
                        </td>
                        <td>
                            商品名
                            <input type="text" name="name[]" value="{{$data['name']}}" data-meisaikey="{{$key+1}}">
                        </td>
                        <td>
                            金額
                            <input type="text" name="price[]" value="{{$data['price']}}" inputmode="numeric">
                        </td>
                        <td>
                            {{-- 削除ボタン押下時、引数として該当要素をdeleteRowに渡す --}}
                            <button type="button" onclick="deleteRow($(this))">削除</button> {{-- 追加 --}}
                            <input type="hidden" name="del_flg[]" value="">  {{-- 追加 --}}
                        </td>
                    </tr>
                    @endforeach
                </tbody>
                <tfoot>
                    <tr>
                        <td colspan="3" style="text-align: end;">
                            <button type="button" onclick="addRow()">行を追加</button>
                            <input type="submit" value="送信">
                        </td>
                        <td></td>
                    </tr>
                </tfoot>
            </table>
        </form>

        {{-- テンプレート --}}
        <table border="1" style="border-collapse: collapse; display: none;" id="tableTpl">
            <tbody>
                <tr>
                    <input type="hidden" name="id[]" value="">  {{-- 追加 --}}
                    <td>
                        1
                    </td>
                    <td>
                        商品名
                        <input type="text" name="name[]" value="" data-meisaikey="">
                    </td>
                    <td>
                        金額
                        <input type="text" name="price[]" value="" inputmode="numeric">
                    </td>
                    <td>
                        <button type="button" onclick="deleteRow($(this))">削除</button> {{-- 追加 --}}
                        <input type="hidden" name="del_flg[]" value=""> {{-- 追加 --}}
                    </td>
                </tr>
            </tbody>
        </table>
    </body>
    <script>
        // 行を追加ボタン押下時
        function addRow() {
            //  テンプレートのテーブル(tr)をクローン
            new_data = $('#tableTpl').find('tbody tr').clone();

            //  行番号を取得(DBから取得した明細がある場合はその最終行の行番号を取得)
            meisai_id = 0;
            if ($('#table').find('tbody tr:last td:eq(1) input:eq(0)').data('meisaikey')) {
                meisai_id = $('#table').find('tbody tr:last td:eq(1) input:eq(0)').data('meisaikey');
            }

            //  行番号に+1してクローンしたテーブル(tr)の行番号テキストとdata-meisaikeyに付与
            max_key = parseInt(meisai_id) + 1;
            new_data.find('td:eq(0)').text(max_key);
            new_data.find('input[name="id[]"]').val(max_key); //  一意になるidを追加
            new_data.find('td:eq(1) input:eq(0)').attr('data-meisaikey', max_key);

            //  テーブルの最終行にくっつける
            $('#table').find('tbody').append(new_data);
        }

        //  削除ボタン押下時  -追加--------------------------------
        function deleteRow(button) {
            //  親要素を取得
            tr = button.closest('tr');

            //  削除フラグ追加
            tr.find('td:eq(3) input[name="del_flg[]"]').val(1);

            //  該当明細行を非表示(削除フラグを送るため非表示にするだけ)
            tr.hide();
        }
        //  ----------------------------------------------------
    </script>
</html>
  • URLをコピーしました!
目次