Pernahkah Anda sebagai Web Developer ingin menonaktifkan, atau istilah kerennya: men-disable, Field tertentu pada sebuah form saat Pengguna mengubah data? Kalau saya sering menghadapi kondisi ini di sebagian besar Aplikasi Web yang saya bangun dengan PHPMaker. Saya pun yakin hal tersebut pasti sering juga Anda alami. Jika selama ini Anda mengalami kesulitan mengenai hal itu, maka silahkan simak solusi berikut ini.
PHPMaker sudah menyediakan sebuah server event bernama Row_Rendered yang bisa mengatasi kondisi tadi. Seperti namanya, server event ini akan dipanggil saat sistem sedang me-render atau mengeluarkan output HTML dari sebuah baris Record (Row) ke browser Pengguna. Karena itu, maka untuk kasus di atas tadi bisa menggunakan server event ini untuk memanipulasi tampilan object atau Field yang terdapat di sebuah Form pada halaman Edit.
Katakanlah kita ingin menonaktifkan salah satu Field yang bernama Nama_Pegawai di sebuah Form pada halaman Edit (Ubah Data), dengan tujuan supaya Pengguna tidak dapat mengubah data tersebut. Maka solusinya cukup tambahkan kode berikut ke dalam server event Row_Rendered:
// Pertama, pastikan kode berikut untuk halaman "Edit" dan tidak sedang dalam mode konfirmasi if (CurrentPageID() == "edit" && $this->CurrentAction != "F") { $this->Nama_Pegawai->EditValue = $this->Nama_Pegawai->CurrentValue; $this->Nama_Pegawai->ReadOnly = TRUE; } // Kedua, pastikan untuk halaman "Edit" dan sedang dalam mode konfirmasi (jika diaktifkan dari Field Setup) if ($this->CurrentAction == "edit" && $this->CurrentAction=="F") { $this->Nama_Pegawai->ViewValue = $this->Nama_Pegawai->CurrentValue; }
Kalau kita perhatikan dengan lebih teliti pada kode di atas, maka ada dua bagian kode di sana.
Bagian Pertama adalah bagian yang paling penting, di mana sistem akan memastikan bahwa kode tersebut hanya saat ID Halaman yang sedang aktif bernilai edit (halaman berisi Form untuk mengubah data), dan Aksi yang terakhir (CurrentAction) tidak bernilai F (Form dalam kondisi terbuka dengan mode Ubah). Sebelum men-disable Field tersebut dengan menugaskan property ReadOnly dengan nilai TRUE, maka kita harus menampilkan terlebih dulu nilai pada property EditValue dengan nilai yang diambil dari nilai sekarang (CurrentValue).
Bagian Kedua adalah bagian yang tidak selalu harus ada, tapi perlu juga kita antisipasi jika Anda mengaktifkan mode Konfirmasi di halaman Edit dari bagian Fields Setup project PHPMaker Anda. Artinya, jika halaman Edit berada dalam mode Konfirmasi, maka kita harus menampilkan nilai Field tersebut yang diambil dari property CurrentValue dan berasal dari mode Ubah pada bagian Pertama sebelumnya.
Kadang-kadang, selain kode di server event Row_Rendered tadi, dibutuhkan juga kode tambahan di server event Row_Updating yang akan dipanggil saat sistem sedang menyimpan data hasil perubahan. Jadi, kode berikut ini hanya digunakan jika diperlukan saja (just in case), ehm.
// Pastikan data yang disimpan berasal dari recordset awal $rsnew["Nama_Pegawai"] = $rsold["Nama_Pegawai"];
Betapa mudah dan simpel sekali, bukan? 🙂
angga mengatakan
pak mau tanya misal ada 3 teksbox (A,B,C). yg A sudah di edit lalu disave pas mau di edit seharusnya teksbox B, tapi tanpa sengaja si A terhapus. bisakah si A itu di disable sehabis edit pertama kali
makasih
Masino Sinaga mengatakan
Bisa saja, prinsip cara men-disable sama dengan contoh kode di artikel ini. Anda harus membuat kondisi yang memeriksa apakah field tersebut sudah pernah diedit pertama kali, misalnya dengan menyimpan status setiap field yang sudah diubah ke tabel lain, lalu cek dari tabel tersebut setiap kali user akan mengubah data di suatu field.
Untuk mengecek apakah suatu field akan diubah saat akan disimpan, tinggal bandingkan nilai field tersebut dari recordset lama ($rsold) dan recordset baru ($rsnew). Jika keduanya tidak sama, berarti field itu akan diubah.
angga mengatakan
sebelumnya terima kasih pak atas jawabannya. saya sudah tester dgn script diatas dan sudah saya coba2 . mungkin petanyaan saya juga yg keliru :). saya coba modifikasi spt berikut
if (CurrentPageID() == “edit” && $this->CurrentAction != “F”) {
$this->field_1->EditValue = $this->field_1->CurrentValue;
$this->field_1->ReadOnly = TRUE;
}
else {
//$this->field_1->EditValue = $this->field_1->CurrentValue = NULL;
$this->field_1->OldValue = $this->field_1->CurrentValue;
$this->field_1->ReadOnly = FALSE;
}
if ($this->CurrentAction == “edit” && $this->CurrentAction==”F”) {
$this->field_1->ViewValue = $this->field_1->CurrentValue;
}
}
dan kalau boleh bertanya kembali, jika field_1 sudah ada data maka teksboxA disable, tetapi jika data masih kosong teksboxA enable.
terima kasih
Masino Sinaga mengatakan
Kode Anda tersebut tidak menangani kondisi jika data di field_1 tersebut sudah ada datanya atau kosong. Kode itu hanya menangani kondisi jika di halaman form Edit dan tidak dalam mode konfirmasi, dan juga sebaliknya selain kondisi tadi.
angga mengatakan
sudah bisa akhirnya pak. makasih yah pak ntar boleh tanya2 lagi 🙂
Masino Sinaga mengatakan
Sama-sama.
Pramudiyanto mengatakan
Salam kenal Pak Masino
Seandainya yg akan di disable adalah combobox dengan pilihan modal dialog for lookup, bagaimana scriptnya ya.
saya coba dengan script ini
$this->Nama_Pegawai->ReadOnly = TRUE;
tidak berhasil, mohon bantuannya
terima kasih
Masino Sinaga mengatakan
Cek id elemennya dari View Page Source browser, lalu gunakan jQuery untuk menyembunyikan elemen berdasarkan id-nya.
Pramudiyanto mengatakan
Akhirnya berhasil
Terima kasih Pak Masino
Masino Sinaga mengatakan
Sama-sama. Kebetulan saya baru saja menulis artikel yang terkait dengan ini: Begini Mudahnya Membuat Field Lookup dengan Modal Dialog Menjadi ReadOnly.
Pramudiyanto mengatakan
Wah, ini dia yang saya cari..
Sekali lagi, terima kasih Pak Masino
Masino Sinaga mengatakan
Oke, sama-sama.
Septian mengatakan
Salam kenal pak masino,
Bagaimana jika kita ingin menonaktifkan field pada halaman “add”? Karena case yang saya buat adalah field yang akan saya disable ini telah otomatis terisi berdasarkan field lain pada tabel tersebut..
Terima kasih sebelumnya pak 🙂
Masino Sinaga mengatakan
Gunakan jQuery code, dan taruh di bagian Client Scripts -> Startup Script pada halaman bertalian.
Henry mengatakan
Pak Masino, saya pemula pengen belajar.
1. Hal edit kalo di phpmaker standartnya namanya apa ya? Apa ‘namatabeledit’?
Masino Sinaga mengatakan
Iya betul.
Pieter Allan mengatakan
Pak saya mau tanya..
Bagaimana cara mengatasi sebuah kondisi seperti ini :
ketika user ingin mengubah data pada satu table namun ada satu filed yang tidak boleh diubah tapi jika kondisi field tersebut kosong (tidak ada datanya) data bisa terubah
namun ketika field itu sudah ada datanya, data tidak bisa diubah
Terimakasih..
Masino Sinaga mengatakan
Pakai server event Row_Inserting jika ingin menambah data, atau Row_Updating jika ingin mengubah data. Tinggal periksa saja nilai field yang terkait, dan jika tidak sesuai, tampilkan pesan error, dan di bawahnya kembalikan nilai FALSE.
Julian mengatakan
Bang masino Ysh
Bang saya mau tanya… saya mebuat input select misal:
POOL
Bubutan
Perak
Sawahan
Simpang
Gubeng
maksud saya begini bang…kalau kita pakai ceckbox untuk memilih pool yang sama pada saat input dan yang terpilih pool itu terus, atau yang saya maksud seperti Nama Pengirim sama pada aplikasi internal kantor (mungkin bang masino tau maksud saya) itu gimana bang… maaf newbie bang masih belajar. hatur nuhun kang.
Masino Sinaga mengatakan
Pakai jQuery code untuk menangani saat user memilih Checkbox, simpan nilai pilihan itu di Cookie, lalu saat form dimuat kemudian, ambil kembali nilai di Cookie tadi, untuk ditampilkan lagi pada Checkbox yang terakhir terpilih tersebut.
Charly mengatakan
Pak Masino, mohon bantuannya.
Jika saya mau menambah data baru dan men-disable sebuah field berdasarkan pilihan pada combo box yang terpilih. Misalkan pilihan di combo box = A, Field Keterangan tidak aktif, tetapi pada saat pilihan combo box = B, Field Keterangan menjadi aktif kembali. Mohon bantuannya Pak Masino. Makasih
Masino Sinaga mengatakan
Pakai jQuery code, dan taruh di bagian Startup Script.