Bootstrap 3のモーダルコンポーネントを活用したデータ編集機能の実装方法について解説します。主にDOM要素経由でのデータ取得とAJAX通信を比較し、実践的なコード構造を提示します。
データ属性を活用したモーダル初期化
テーブル表示部分で編集ボタンにカスタムデータ属性を設定します。Laravel Bladeテンプレートでの実装例:
<tbody>
@foreach ($items as $item)
<tr>
<td>{{ $item->title }}</td>
<td>{{ Str::limit($item->content, 35) }}</td>
<td>
<button
data-item-id="{{ $item->id }}"
data-title="{{ $item->title }}"
data-content="{{ $item->content }}"
data-deadline="{{ $item->deadline }}"
class="btn btn-primary edit-trigger"
data-toggle="modal"
data-target="#editModal"
>編集</button>
</td>
</tr>
@endforeach
</tbody>
イベントハンドリングによるデータ反映
show.bs.modalイベントをフックし、モーダル内要素にデータを注入するスクリプト:
$(document).ready(function() {
$('#editModal').on('show.bs.modal', function(event) {
const triggerBtn = $(event.relatedTarget);
const modal = $(this);
modal.find('[name="itemId"]').val(triggerBtn.data('item-id'));
modal.find('.title-input').val(triggerBtn.data('title'));
modal.find('.content-area').val(triggerBtn.data('content'));
modal.find('.deadline-picker').val(triggerBtn.data('deadline'));
});
});
モーダルフォームの構造設計
動的に値を設定するための入力フィールドを備えたモーダル実装:
<div class="modal fade" id="editModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">データ編集</h5>
</div>
<form method="POST" action="/api/tasks/update">
@csrf
<div class="modal-body">
<input type="hidden" name="itemId">
<div class="form-group">
<label>タイトル</label>
<input type="text" class="form-control title-input" name="title" required>
</div>
<div class="form-group">
<label>詳細内容</label>
<textarea class="form-control content-area" name="content" rows="3" required></textarea>
</div>
<div class="form-group">
<label>期限日</label>
<input type="text" class="form-control deadline-picker" name="deadline" required>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">キャンセル</button>
<button type="submit" class="btn btn-primary">更新</button>
</div>
</form>
</div>
</div>
</div>
<script>
$('.deadline-picker').datetimepicker({
timepicker: false,
format: 'Y-m-d',
lang: 'ja'
});
</script>