我做了复选框,当用户选中lain-lain时,它会再次弹出一个表单,以给予详细的desc The Checkbox Pic,但当用户为详细的lain表单提供另一个desc时,数据无法存储并显示在我的详细信息或索引上。
下面是我的表单代码
<div class="row mb-3">
<div class="col-sm-12">
<label for="pembayaran" class="col-form-label">Pembayaran</label>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="booking"
name="pembayaran[]" value="Booking">
<label class="form-check-label" for="booking">Booking</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="dp"
name="pembayaran[]" value="DP">
<label class="form-check-label" for="dp">DP</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="cbth"
name="pembayaran[]" value="CBTH">
<label class="form-check-label" for="cbth">CBTH</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="angsuran"
name="pembayaran[]" value="Angsuran">
<label class="form-check-label" for="angsuran">Angsuran ke</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="ket"
name="pembayaran[]" value="KET">
<label class="form-check-label" for="ket">KET</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="lainlain"
name="pembayaran[]" value="Lain-lain">
<label class="form-check-label" for="lainlain">Lain-lain</label>
</div>
</div>
</div>
<div id="lainlain-form" style="display: none;">
<div class="row mb-3">
<div class="col-sm-12">
<label for="lainlaininput" class="col-form-label">Detail Lain-lain</label>
<input type="text" class="form-control" id="lainlaininput"
name="lainlaininput" placeholder="Masukkan detail lain-lain">
</div>
</div>
</div>
<script>
// Dapatkan semua elemen checkbox
var checkboxes = document.querySelectorAll('input[type="checkbox"]');
// Tambahkan event listener untuk setiap checkbox
checkboxes.forEach(function(checkbox) {
checkbox.addEventListener('change', function() {
// Jika checkbox yang sedang diubah adalah checkbox yang telah dicentang, nonaktifkan yang lainnya
if (this.checked) {
checkboxes.forEach(function(otherCheckbox) {
if (otherCheckbox !== checkbox) {
otherCheckbox.disabled = true;
}
});
} else {
// Jika checkbox yang sedang diubah tidak dicentang, aktifkan yang lainnya
checkboxes.forEach(function(otherCheckbox) {
otherCheckbox.disabled = false;
});
}
});
});
</script>
<script>
// Dapatkan elemen checkbox "Lain-lain"
var lainlainCheckbox = document.getElementById('lainlain');
// Dapatkan elemen form tambahan
var lainlainForm = document.getElementById('lainlain-form');
// Tambahkan event listener ke checkbox "Lain-lain"
lainlainCheckbox.addEventListener('change', function() {
// Jika checkbox "Lain-lain" dicentang, tampilkan form tambahan
if (this.checked) {
lainlainForm.style.display = 'block';
} else {
// Jika checkbox "Lain-lain" tidak dicentang, sembunyikan form tambahan
lainlainForm.style.display = 'none';
}
});
</script>
这是我的控制器代码
<?php
namespace App\Http\Controllers;
use App\Exports\ExportKwitansi;
use App\Models\Kwitansi;
use Exception;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
class KwitansiController extends Controller
{
protected $kwitansis;
public function __construct()
{
$this->kwitansis = Kwitansi::all();
}
public function index(Request $request)
{
if ($request->has('search')) {
$kwitansis = Kwitansi::where('nomor_kwitansi', 'LIKE', '%' . $request->search . '%')
->orWhere('nama_lengkap', 'LIKE', '%' . $request->search . '%')
->get();
if ($kwitansis->count() == 0) {
session()->flash('error', 'Kwitansi tidak ditemukan');
return redirect('/kwitansi');
}
} else {
$kwitansis = Kwitansi::all();
}
return view('kwitansi.index', [
'kwitansis' => $kwitansis,
]);
}
public function create()
{
$lastSerialNumber = Kwitansi::latest('nomor_kwitansi')->first();
if ($lastSerialNumber) {
$lastNumber = (int) substr($lastSerialNumber->nomor_kwitansi, 4);
$nextNumber = $lastNumber + 1;
} else {
$nextNumber = 1;
}
$serialNumber = 'SMS-' . str_pad($nextNumber, 2, '0', STR_PAD_LEFT);
return view('kwitansi.create', compact('serialNumber'));
}
public function store(Request $request)
{
try {
$lastSerialNumber = Kwitansi::latest('nomor_kwitansi')->first();
if ($lastSerialNumber) {
$lastNumber = (int) substr($lastSerialNumber->nomor_kwitansi, 4);
$nextNumber = $lastNumber + 1;
} else {
$nextNumber = 1;
}
$serialNumber = 'SMS-' . str_pad($nextNumber, 2, '0', STR_PAD_LEFT);
$validatedData = $request->validate([
'nama_lengkap' => 'required',
'alamat' => 'required',
'no_hp' => 'required',
'terbilang' => 'required',
'lokasi' => 'required',
'no_kavling' => 'required',
'type' => 'required',
'jumlah' => 'required',
]);
// Mengubah pilihan checkbox menjadi string yang dipisahkan oleh koma
$pembayaran = implode(', ', $request->input('pembayaran'));
// Memeriksa apakah checkbox "Lain-lain" dicentang
// Periksa apakah kotak centang "Lain-lain" dicentang
if ($request->has('lainlain')) {
// Ambil data input "Lain-lain" dan tambahkan ke dalam kolom "pembayaran"
$lainlaininput = $request->input('lainlaininput');
$pembayaran .= ', ' . $lainlaininput;
}
$validatedData['nomor_kwitansi'] = $serialNumber;
$validatedData['pembayaran'] = $pembayaran; // Menyimpan pilihan checkbox ke dalam kolom 'pembayaran'
Kwitansi::create($validatedData);
return redirect('/kwitansi');
} catch (Exception $e) {
session()->flash('error', $e->getMessage());
return back();
}
}
public function detail($id)
{
$kwitansi = $this->kwitansis->find($id);
if (!$kwitansi) {
session()->flash('error', 'Kwitansi tidak ditemukan');
return redirect('/kwitansi');
}
return view('kwitansi.detail', compact('kwitansi'));
}
public function print($id)
{
$kwitansi = $this->kwitansis->find($id);
if (!$kwitansi) {
session()->flash('error', 'Kwitansi tidak ditemukan');
return redirect('/kwitansi');
}
return view('kwitansi.cetak', compact('kwitansi'));
}
public function edit(Kwitansi $kwitansi)
{
return view('kwitansi.edit', compact('kwitansi'));
}
public function update(Request $request, Kwitansi $kwitansi)
{
// dd($request->all());
try {
$rules = [
'nama_lengkap' => 'required',
'alamat' => 'required',
'no_hp' => 'required',
'terbilang' => 'required',
'lokasi' => 'required',
'no_kavling' => 'required',
'type' => 'required',
'jumlah' => 'required',
];
$validatedData = $request->validate($rules);
// Mengubah pilihan checkbox menjadi string yang dipisahkan oleh koma
$pembayaran = implode(', ', $request->input('pembayaran'));
// Memeriksa apakah checkbox "Lain-lain" dicentang
if ($request->has('lainlain')) {
// Ambil data input "Lain-lain" dan tambahkan ke dalam kolom "pembayaran"
$lainlaininput = $request->input('lainlaininput');
$pembayaran .= ', ' . $lainlaininput;
}
$validatedData['pembayaran'] = $pembayaran; // Menyimpan pilihan checkbox ke dalam kolom 'pembayaran'
// Update data kwitansi
$kwitansi->update($validatedData);
return redirect('/kwitansi')->with('success', 'Kwitansi berhasil diperbarui');
} catch (Exception $e) {
session()->flash('error', $e->getMessage());
return back();
}
}
public function destroy(Kwitansi $kwitansi)
{
Kwitansi::destroy($kwitansi->id);
return redirect('/kwitansi');
}
function export_excel()
{
return Excel::Download(new ExportKwitansi(), 'Kwitansi.xlsx');
}
}
这是我的表视图代码
<table class="table table-hover text-center" id="kwitansi-table">
<thead>
<tr class="bg-info">
<th style="width: 2rem; justify-content: center; align-items: center; cursor: pointer;"
id="sortNo">No.</th>
<th style="width: 4.5rem; cursor: pointer;" id="sortKwitansi">No. Kwitansi</th>
<th style="width: 6rem; cursor: pointer;" id="sortNama">Nama Lengkap</th>
<th style="width: 10rem;">Alamat</th>
<th style="width: 4.5rem;">No. HP</th>
<th style="width: 8.5rem;">Terbilang</th>
<th style="width: 4rem;">Pembayaran</th>
<th style="width: 4rem;">Nama Perumahan</th>
<th style="width: 1rem;">No. Kavling</th>
<th style="width: 1rem;">Type</th>
<th style="width: 5rem;">Jumlah</th>
<th style="width: 6.7rem;">Action</th>
</tr>
</thead>
<tbody>
@foreach ($kwitansis as $kwitansi)
<tr onclick="window.location.href='{{ route('kwitansi.detail', $kwitansi->id) }}';"
style="cursor: pointer;">
<td>{{ $loop->iteration }}</td>
<td>{{ $kwitansi->nomor_kwitansi }}</td>
<td>{{ $kwitansi->nama_lengkap }}</td>
<td>{{ $kwitansi->alamat }}</td>
<td>{{ $kwitansi->no_hp }}</td>
<td>{{ $kwitansi->terbilang }}</td>
<td>
@if (in_array('Lain-lain', explode(', ', $kwitansi->pembayaran)))
{{ $kwitansi->lainlaininput }}
@else
{{ $kwitansi->pembayaran }}
@endif
</td>
<td>{{ $kwitansi->lokasi }}</td>
<td>{{ $kwitansi->no_kavling }}</td>
<td>{{ $kwitansi->type }}</td>
<td>{{ $kwitansi->jumlah }}</td>
<td
style="padding-left: 1rem; display: flex; height: 6rem; justify-content: space-around; align-items: center">
<button class="btn btn-warning"
style="margin:0 ; padding: 6.5px 8px 6.5px 8px; border-radius: 100%;">
<a href="{{ route('kwitansi.edit', $kwitansi->id) }}">
<img src="{{ asset('icon/pen2.svg') }}" alt=""
style="width: 26px; height: 26px">
</a>
</button>
<form action="{{ route('kwitansi.destroy', $kwitansi->id) }}}}" method="POST"
class="d-inline-grid">
@method('delete')
@csrf
<button class="btn btn-danger" onclick="return confirm('Are you sure?')"
style="margin:0 ; padding: 6.5px 8px 6.5px 8px; border-radius: 100%;">
<img src="{{ asset('icon/trash3.svg') }}" alt="">
</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
我需要添加lainlaininput到我的数据库表吗?My Database TableDebugging
我希望当用户填写详细的lain输入detail lain lain filled它将存储并显示在我的表上,它也可以编辑
1条答案
按热度按时间moiiocjp1#
您需要以某种方式存储该字段。如果愿意,您可以为此详细信息创建一个字段,但鉴于这是一个可选字段,您可能希望为lain-lain创建一个表,其中包含kwitansis表的外键和详细信息字段。
在这种情况下,你可以通过左连接你的lain-lain表到你的kwitansis来填充描述字段,或者通过外键单独阅读它,这取决于哪一个最适合你的场景。这个代码块
看起来不妙。首先,您不需要验证用户输入并直接将其存储到
$validatedData
中,其次,您将其附加到值中,而该字段不存在,并且可能也没有指定。你需要重构你的代码,我建议你也要关注安全性。但是,为了避免偏离我们的主题:我会创建一个lainlain表,其中包含kwitansis表的外键,当表单提交时,传递一个lainlain字段,然后在这个lainlain表中插入一条新记录,指定它属于哪个kwitansis以及它的描述是什么。