Update mencegah input contact agar tidak ada duplikasi inisial

This commit is contained in:
mikael-zakaria 2026-04-09 14:22:32 +07:00
parent f67960311b
commit 16769a3998
3 changed files with 163 additions and 10 deletions

View File

@ -180,7 +180,8 @@ $routes->get('/testemail','Activites::email_test');
$routes->get('/contacts', 'Contacts::index'); $routes->get('/contacts', 'Contacts::index');
$routes->get('/contacts/view/(:num)', 'Contacts::view/$1'); $routes->get('/contacts/view/(:num)', 'Contacts::view/$1');
$routes->match(['get','post'],'/contacts/edit/(:num)', 'Contacts::edit/$1'); $routes->match(['get','post'],'/contacts/edit/(:num)', 'Contacts::edit/$1');
$routes->match(['get','post'],'/contacts/create', 'Contacts::edit/0'); // $routes->match(['get','post'],'/contacts/create', 'Contacts::edit/0');
$routes->post('/contacts/create', 'Contacts::createFromActivities');
// emails // emails
$routes->get('/emails', 'Emails::index'); $routes->get('/emails', 'Emails::index');

View File

@ -31,18 +31,38 @@ class Contacts extends Controller {
public function edit($contactid = null) { public function edit($contactid = null) {
$db = \Config\Database::connect(); $db = \Config\Database::connect();
$data = array(); $data = array();
if($contactid != 0) { if($contactid != 0) {
$sql = "select * from contacts where contactid='$contactid'"; $sql = "select * from contacts where contactid='$contactid'";
$query = $db->query($sql); $query = $db->query($sql);
$results = $query->getResultArray(); $results = $query->getResultArray();
$data['contacts'] = $results; $data['contacts'] = $results;
} }
if ($this->request->getMethod() === 'POST') { if ($this->request->getMethod() === 'POST') {
if ($contactid != 0) {
$ruleInitial = "required|is_unique[contacts.initial,contactid,{$contactid}]";
} else {
$ruleInitial = "required|is_unique[contacts.initial]";
}
$rules = [ $rules = [
// 'contactid' => 'required',
'firstname' => 'required', 'firstname' => 'required',
'email_1' => 'required', 'email_1' => 'required|valid_email',
'initial' => 'required' 'initial' => $ruleInitial
];
$messages = [
'firstname' => [
'required' => 'Nama depan harus diisi, tidak boleh kosong.'
],
'email_1' => [
'required' => 'Email wajib diisi.',
'valid_email' => 'Format email yang anda masukkan tidak valid.'
],
'initial' => [
'required' => 'Initial tidak boleh kosong.',
'is_unique' => 'Initial ini sudah dipakai orang lain, silakan cari yang unik.'
]
]; ];
$data['new_value'] = [ $data['new_value'] = [
'firstname' => $this->request->getVar('firstname'), 'firstname' => $this->request->getVar('firstname'),
@ -58,7 +78,7 @@ class Contacts extends Controller {
'siteid' => $this->request->getVar('siteid') ?? null //Untuk Create dari AR 'siteid' => $this->request->getVar('siteid') ?? null //Untuk Create dari AR
]; ];
if($this->validate($rules)){ if($this->validate($rules, $messages)){
if($contactid != 0) { if($contactid != 0) {
$contactsModel = new contactsModel(); $contactsModel = new contactsModel();
$contactsModel->set('enddate', NULL); $contactsModel->set('enddate', NULL);
@ -90,4 +110,71 @@ class Contacts extends Controller {
} }
return view('contacts_editor', $data); return view('contacts_editor', $data);
} }
public function createFromActivities() {
$db = \Config\Database::connect();
$rules = [
'firstname' => 'required',
'email_1' => 'required|valid_email',
'initial' => 'required|is_unique[contacts.initial]'
];
$messages = [
'firstname' => [
'required' => 'Nama depan harus diisi, tidak boleh kosong.'
],
'email_1' => [
'required' => 'Email wajib diisi.',
'valid_email' => 'Format email yang anda masukkan tidak valid.'
],
'initial' => [
'required' => 'Initial tidak boleh kosong.',
'is_unique' => 'Initial ini sudah dipakai orang lain, silakan cari yang unik.'
]
];
$data['new_value'] = [
'firstname' => $this->request->getVar('firstname'),
'lastname' => $this->request->getVar('lastname'),
'title' => $this->request->getVar('title'),
'initial' => $this->request->getVar('initial'),
'birthdate' => ($this->request->getVar('birthdate') == '') ? NULL : $this->request->getVar('birthdate'),
'email_1' => $this->request->getVar('email_1'),
'email_2' => $this->request->getVar('email_2'),
'phone' => $this->request->getVar('phone'),
'mobile_1' => $this->request->getVar('mobile_1'),
'mobile_2' => $this->request->getVar('mobile_2'),
'siteid' => $this->request->getVar('siteid') ?? null //Untuk Create dari AR
];
if ($this->validate($rules, $messages)) {
$contactsModel = new ContactsModel();
$contactsModel->set('createdate', 'NOW()', FALSE);
$contactsModel->set('enddate', NULL);
$contactsModel->insert($data['new_value']);
$contactid = $contactsModel->getInsertID();
if ($this->request->getVar('siteid') != null) {
$siteContactModel = new SiteContactModel();
$siteContactValue = [
'siteid' => $this->request->getVar('siteid'),
'contactid' => $contactid,
'contactemail' => $this->request->getVar('email_1'),
];
$siteContactModel->insert($siteContactValue);
}
// Kembalikan JSON Sukses
return $this->response->setJSON(['status' => 'success', 'message' => 'Data berhasil disimpan']);
} else {
// --- JIKA VALIDASI GAGAL ---
// Ubah HTTP Status menjadi 400 (Bad Request) agar AJAX tahu ini adalah "Error"
return $this->response->setStatusCode(400)->setJSON([
'status' => 'error',
'errors' => $this->validator->getErrors() // Ambil list errornya
]);
}
}
} }

View File

@ -26,9 +26,9 @@
</div> </div>
<div class="row mb-3 align-items-center"> <div class="row mb-3 align-items-center">
<label for="lastname" class="col-sm-3 col-form-label">Last Name <span class="text-danger">*</span></label> <label for="lastname" class="col-sm-3 col-form-label">Last Name </label>
<div class="col-sm-9"> <div class="col-sm-9">
<input type="text" class="form-control form-control-sm" id="lastname" name="lastname" required> <input type="text" class="form-control form-control-sm" id="lastname" name="lastname">
</div> </div>
</div> </div>
@ -265,6 +265,57 @@ function deleteTrainingRow(btn, contactid) {
flatpickr(".trainingdate", { allowInput: true, dateFormat: "Y-m-d" }); flatpickr(".trainingdate", { allowInput: true, dateFormat: "Y-m-d" });
// $('#formCreateContact').submit(function(e) {
// // 1. Cegah form melakukan reload halaman bawaan HTML
// e.preventDefault();
// // 2. Ambil URL action dan data dari form
// var url = $(this).attr('action');
// var formData = $(this).serialize();
// // 3. Kirim data ke controller menggunakan AJAX POST
// $.ajax({
// type: "POST",
// url: url,
// data: formData,
// success: function(response) {
// // Tutup modal dan bersihkan isian formnya
// $('#createContactModal').modal('hide');
// $('#formCreateContact')[0].reset();
// // Tampilkan pesan sukses
// alert('Contact berhasil ditambahkan!');
// // --- INI BAGIAN REFRESH-NYA ---
// var siteid = $('#siteid').val();
// var current_actid = $('#current_actid').val();
// // Siapkan format url untuk current_actid (sama seperti logika sebelumnya)
// if (current_actid !== '' && current_actid !== undefined) {
// current_actid = '/' + current_actid;
// } else {
// current_actid = '';
// }
// // Jalankan ulang $.get milikmu khusus untuk training_form
// if(siteid !== '') {
// $.get("<?=base_url();?>/activities/getsitecontact/" + siteid + current_actid, function(data) {
// $('#training_form').html(data);
// // Re-inisialisasi select2 agar tampilannya kembali rapi
// $('.select2').select2({
// theme: 'bootstrap-5',
// width: '100%'
// });
// });
// }
// },
// error: function(xhr, status, error) {
// alert('Terjadi kesalahan saat menyimpan data!');
// console.error(xhr.responseText);
// }
// });
// });
$('#formCreateContact').submit(function(e) { $('#formCreateContact').submit(function(e) {
// 1. Cegah form melakukan reload halaman bawaan HTML // 1. Cegah form melakukan reload halaman bawaan HTML
e.preventDefault(); e.preventDefault();
@ -278,6 +329,7 @@ $('#formCreateContact').submit(function(e) {
type: "POST", type: "POST",
url: url, url: url,
data: formData, data: formData,
dataType: "json", // [UBAHAN 1] Beritahu AJAX bahwa kita mengharapkan balasan JSON
success: function(response) { success: function(response) {
// Tutup modal dan bersihkan isian formnya // Tutup modal dan bersihkan isian formnya
$('#createContactModal').modal('hide'); $('#createContactModal').modal('hide');
@ -286,7 +338,7 @@ $('#formCreateContact').submit(function(e) {
// Tampilkan pesan sukses // Tampilkan pesan sukses
alert('Contact berhasil ditambahkan!'); alert('Contact berhasil ditambahkan!');
// --- INI BAGIAN REFRESH-NYA --- // --- INI BAGIAN REFRESH-NYA (TIDAK ADA YANG DIUBAH) ---
var siteid = $('#siteid').val(); var siteid = $('#siteid').val();
var current_actid = $('#current_actid').val(); var current_actid = $('#current_actid').val();
@ -311,8 +363,21 @@ $('#formCreateContact').submit(function(e) {
} }
}, },
error: function(xhr, status, error) { error: function(xhr, status, error) {
alert('Terjadi kesalahan saat menyimpan data!'); // [UBAHAN 2] Tangkap error 400 dari validasi Controller
console.error(xhr.responseText); if (xhr.status === 400 && xhr.responseJSON && xhr.responseJSON.errors) {
var errorMessages = "Gagal menyimpan data karena:\n\n";
// Looping semua error (misal firstname kosong, atau initial duplikat)
$.each(xhr.responseJSON.errors, function(key, value) {
errorMessages += "" + value + "\n";
});
alert(errorMessages);
} else {
// Error sistem lainnya (misal server down atau koneksi putus)
alert('Terjadi kesalahan saat menyimpan data!');
console.error(xhr.responseText);
}
} }
}); });
}); });