[英]Laravel: Submit dynamically generated form fields
我正在嘗試使用 Ajax 向控制器提交一個具有動態生成字段的表單。 它就像一張發票。 有日期、客戶、sub_total、tax 和 ttl 字段是永久性的(發票標題)。 然后有 n 個動態生成的表單字段(發票行)。 這是動態生成的html。 每個輸入字段都有不同的名稱和 ID。
<tbody id="list">
<tr>
<td>
<input name="sku1" id="sku1" readonly="" type="text" value="K5693">
</td>
<td>
<input name="name1" id="name1" readonly="" type="text" value="HANDLEBAR">
</td>
<td>
<input name="rate1" id="rate1" readonly="" type="text" value="45.00">
</td>
<td>
<input name="qty1" id="qty1" readonly="" type="text" value="2">
</td>
<td>
<input name="disc1" id="disc1" readonly="" type="text" value="0">
</td>
<td>
<input name="ttl1" id="ttl1" readonly="" type="text" value="90.00">
</td>
<td class="text-center">
<a onclick="removeField(this)"><i class="fas fa-trash-alt"></i></a>
</td>
</tr>
<tr>
<td>
<input name="sku2" id="sku2" readonly="" type="text" value="K5693">
</td>
<td>
<input name="name2" id="name2" readonly="" type="text" value="HANDLEBAR">
</td>
<td>
<input name="rate2" id="rate2" readonly="" type="text" value="45.00">
</td>
<td>
<input name="qty2" id="qty2" readonly="" type="text" value="2">
</td>
<td>
<input name="disc2" id="disc2" readonly="" type="text" value="10">
</td>
<td>
<input name="ttl2" id="ttl2" readonly="" type="text" value="80.00">
</td>
<td class="text-center">
<a onclick="removeField(this)"><i class="fas fa-trash-alt"></i></a>
</td>
</tr>
</tbody>
永久字段 HTML
<div class="form-group">
<label for="date">Date</label>
<input type="text" class="form-control" id="date" name="date" placeholder="00/00/0000"></input>
</div>
<div class="form-group">
<label for="customer">Customer</label>
<select class="form-control" id="customer">
@foreach($customers as $customer)
<option value="{{$customer->id}}">{{$customer->name}}</option>
@endforeach
</select>
</div>
<div class="card p-3">
<table>
<tr>
<td class="h5">SUB TOTAL</td>
<td class="h5 text-right pr-3">AED</td>
<td><input type="text" class="form-control text-right" id="sub_total"placeholder="00.00" value="0.00" readonly></input></td>
</tr>
<tr>
<td class="h5">VAT</td>
<td class="h5 text-right pr-3">AED</td>
<td><input type="text" class="form-control text-right" id="tax" placeholder="00.00" value="0.00" readonly></input></td>
</tr>
<tr>
<td class="h5">TOTAL</td>
<td class="h5 text-right pr-3">AED</td>
<td><input type="text" class="form-control text-right" id="ttl" placeholder="00.00" value="0.00" readonly></input></td>
</tr>
</table>
</div>
此處的 javascript 是通過單擊按鈕觸發的:
function createData(){
var date = document.getElementById('date').value;
var customer = document.getElementById('customer').value;
var sub_ttl = document.getElementById('sub_total').value;
var tax = document.getElementById('tax').value;
var ttl = document.getElementById('ttl').value;
}
我從永久字段中獲取值開始。 不確定如何從 n 個動態生成的字段中收集值並將其傳遞給控制器。 已經閱讀了很多關於此的文章,但無法弄清楚。 請問有什么幫助嗎?
你將不得不做這樣的事情:
<tbody id="body">
<tr>
<td>
<input name="skus[]"readonly="" type="text" value="K5693">
</td>
<td>
<input name="names[]" readonly="" type="text" value="HANDLEBAR">
</td>
<td>
<input name="rates[]" readonly="" type="text" value="45.00">
</td>
<td>
<input name="qtys[]" readonly="" type="text" value="2">
</td>
<td>
<input name="discs[]" readonly="" type="text" value="0">
</td>
<td>
<input name="ttls[]" readonly="" type="text" value="90.00">
</td>
<td class="text-center">
<a onclick="removeField(this)"><i class="fas fa-trash-alt"></i></a>
</td>
</tr>
然后在您的控制器中,您將能夠獲得如下所有值:
$skus = request('skus');
$names = request('names');
...
for($i = 0 ; $i < count($skus) ; $i++)
{
$sku = $skus[$i];
$name = $names[$i];
...
}
更改您的代碼如下。 把<form>
和提交按鈕放在你想要的地方。
//submit opening invoice data $('#invoice_form').on('submit', function(event){ event.preventDefault(); $.ajax({ url:"put your url", method:'post', data:$(this).serialize(), dataType:'json', success:function(data) { //do whatever you want } }) });
<form id ="invoice_form"> <tbody id="body"> <tr> <td> <input name="skus[]"readonly="" type="text" value="K5693"> </td> <td> <input name="names[]" readonly="" type="text" value="HANDLEBAR"> </td> <td> <input name="rates[]" readonly="" type="text" value="45.00"> </td> <td> <input name="qtys[]" readonly="" type="text" value="2"> </td> <td> <input name="discs[]" readonly="" type="text" value="0"> </td> <td> <input name="ttls[]" readonly="" type="text" value="90.00"> </td> <td class="text-center"> <a onclick="removeField(this)"><i class="fas fa-trash-alt"></i></a> </td> </tr> </tbody> <button type="submit" class="btn btn-success"><i class="fas fa-download"></i> Save</button> </form>
控制器.php
public function create(Request $request){
if($request->ajax())
{
$skus= $request->skus;
$names= $request->names;
$rates= $request->rates;
$qtys= $request->qtys;
for($count = 0; $count < count($skus); $count++)
{
$data = array(
'skus' => $skus[$count],
'names' => $names[$count],
'rates' => $rates[$count],
'qtys' => $qtys[$count]
);
$insert_data[] = $data;
}
Invoice::insert($insert_data);
return response()->json([
'success' => 'Invoice Saved Successfully!'
]);
}
}
您真正需要的是一種序列化整個表單的方法。
下面是如何用 jQuery 做到這一點:
https://api.jquery.com/serialize/
以下是使用純 Javascript 執行此操作的方法:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.