こんにちは!
今回はLaravelで非同期通信処理ajaxを用いて取得したデータをinputタグにvalueとして渡す方法を解説していきます。
Laravelにおいて、更新処理をする際に該当となるレコードの情報を取得してきてモーダルで表示させるという処理を業務で行ったので、アウトプットとしてここに記述していきたいと思います。
ajax処理の基本的な書き方
まずはajaxの基本的な書き方から。
$(function(){
$.ajax({
type: "get", //HTTP通信の種類
url:'/home', //通信したいURL
dataType: 'json'
})
//通信が成功したとき
.done((res)=>{
console.log(res.message)
})
//通信が失敗したとき
.fail((error)=>{
console.log(error.statusText)
})
});
こんな感じ。
更新処理
目的としては、変更ボタンを押すと変更画面モーダルが表示され、該当レコードのデータが変更画面に最初から入力されている状態を実現したい。
通常は画面を別のbladeファイルで分けて変更ボタンを押した際に該当レコードのidがリクエストとしてサーバーに送られ、ControllerやModelでそのidに紐づくデータを取り出してきて、変更画面に表示させるのが一般的だと思います。
ただし、今回は変更画面をモーダルで表示させたいので、リクエストされる該当レコードのidをブラウザ上で処理し、サーバーにはデータを送らず、Controllerにデータをそのまま返させます。そのデータをモーダル上で表示させるという処理を書いていきたいと思います。
# View
# edit.blade.php(Bootstrap)
<table class="table table-striped table-hover">
<tr>
<th>出荷数</th>
<th>処理</th>
</tr>
<tr>
<td>{{ $order_sipment->sipment_quantity }}</td>
<td><button type=“button” class="btn btn-success" data-target=“#updateModal” data-toggle=“modal” data-quantity="{{ $order_sipment->sipment_quantity }}">変更</button></td>
</tr>
</table>
<!— Modal —>
<div class=“modal fade” id=“updateModal” tabindex=“-1” aria-labelledby=“registerModalLabel" aria-hidden="true"
>
<div class="modal-dialog modal-dialog-fluid" role="document">
<form action=“{{ route(‘order_sipments.response’) }}” method=“post”>
<div class=“col-2”>出荷数</div>
<div class=“col-10”><input type=“number” class=“form-control” id=“order_sipment_quantity” name=“sipment_quantity”></div>
</form>
<style>
.modal-dialog-fluid {
max-width: inherit;
width: 98%;
margin-left: 15px;
}
</style>
</div>
</div>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/base/jquery-ui.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script>
$(function ()
{
let orderSipmentQuantity;
$(‘button[id = “order_sipment_id”]’).click(function ()
{
$.ajaxSetup({
headers: {
// 決まり文句
“X-CSRF-TOKEN”: $(‘meta[name = “csrf-token”]’).attr(“content”),
},
});
// data()メソッドでボタン自身のdata-quantityの値を取得
orderSipmentQuantity = $(this).data(‘quantity’);
// いよいよajax処理を書く
$.ajax({
// POST通信
type: “post”,
// ここでデータの送信先URLを指定。
url: “/order_sipments/response”
dataType: “json”
data: {
‘quantity’: orderSipmentQuantity;
},
})
.then((res) => {
console.log(res);
// jQueryのval()メソッドで対象のidを持つタグにvalueとしてajaxで取得した値を入れる
$(‘#order_sipment_quantity’).val(res[‘quantity’]);
});
.fail(error) => {
console.log(error.statusText);
});
});
})
</script>
# Route
Route::post('/order_sipments/response', [App\Http\Controllers\OrderSipmentController::class, 'response'])->name('order_sipments.response')->middleware('auth');
# Controller
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class OrderSipmentController extends Controller
{
// リクエストされた値をそのまま返すだけ!
public function response(Request $request)
{
return $request;
}
}
肝としてはViewファイルのAjax処理の書き方ですね。
変更ボタンを押した際にAjaxで非同期にモーダル上のフォームのinputタグにvalueとして$order_sipment->sipment_quantityという値を与えます。
$order_sipment->sipment_quantityについては記述を省略しておりますが、DBの中のテーブルから持ってきた出荷数のデータの値になります。
Viewファイルで書いたAjax処理を行なったときにajaxの中で定義されているdataがControllerに行きますが、サーバーでは処理せず、Controllerでそのままdataを返しています。
そして返ってきたdataはajax処理の.then()の処理に移行し、この時にモーダル上のinputタグにvalueとして$order_sipment->sipment_quantityの値が入ります。
このような処理を行うことで、モーダル表示した際に該当レコードの出荷数の値がフォームに入力された状態で表示されるというわけです。
それでは、今回はこんなところで!
コメント