Setelah kita membahas server event di PHPMaker yang akan dipanggil oleh semua halaman, maka tiba saatnya membahas server event yang dijalankan pada level Table. Artinya, kode yang ditambahkan ke server event ini hanya dipanggil oleh Table yang menggunakannya. Server event level Table berguna jika Anda sebagai Web Developer tidak ingin menerapkannya ke semua Table, tapi hanya untuk Table tertentu saja. Mulai di artikel ini, saya akan membahas server event level Table tersebut, yang dimulai dari server event yang paling sering dipanggil, atau dikenal dengan istilah Common.
PHPMaker secara standar akan mengambil semua record di suatu Table dan menampilkannya pada halaman List yang di-generate olehnya. Permasalahan timbul ketika jumlah record di suatu Table sudah semakin banyak, sehingga waktu yang dibutuhkan untuk memuat halaman List menjadi semakin lama (sekalipun PHPMaker sudah membaginya ke dalam beberapa halaman berdasarkan pengaturan jumlah record per halaman). Tentu saja untuk kondisi ini diperlukan penyaringan record sebelum ditampilkan di halaman List.
PHPMaker sudah menyediakan sebuah server event yang bernama Recordset_Selecting yang lokasinya berada di bawah Server Events -> Table-Specific -> Common. Pastikan sebelumnya Anda sudah memilih salah satu tabel yang Anda inginkan dari panel Database di sebelah kiri dari project PHPMaker Anda, untuk memastikan Anda menambahkan kode di server event pada Table yang tepat.
Seperti namanya, server event Recordset_Selecting akan dipanggil sebelum, atau istilahnya lebih dekat pada saat memilih atau mengambil, semua record dari Table tertentu di Database. Artinya, Anda sebagai Web Developer masih diberi kesempatan oleh PHPMaker untuk menyaring record-record tersebut sebelum sistem mengambil semua record tadi. Argumen server event ini hanya satu, yaitu variabel $filter (yang merupakan bagian dari klausa WHERE di pernyataan SQL) untuk memilih record-record. Anda dapat mengkostumisasi penyaringan untuk mengubah record-record yang dipilih oleh sistem.
Dalam contoh berikut kita akan menambahkan kriteria penyaringan sendiri, di mana nilai argumen $filter bisa saja sudah memiliki nilai, sehingga kita disarankan untuk menambahkan dengan kriteria penyaringan lainnya, dan bukan menimpanya.
function Recordset_Selecting(&$filter) { ew_AddFilter($filter, "Field1 = '1234'"); // tambahkan ekspresi filter }
Dalam contoh tersebut, Anda sebagai Web Developer dapat menambahkan (bukan menimpa) kriteria penyaringan dengan menggunakan Global Function yang sudah disediakan oleh PHPMaker bernama ew_AddFilter. Fungsi ini memiliki dua argumen. Argumen pertama merupakan variabel $filter, dan argumen kedua merupakan ekspresi filter yang diinginkan. Pastikan ekspresi filter tersebut valid untuk disisipkan ke dalam pernyataan SQL.
Perlu diingat, bahwa server event Recordset_Selecting akan dipanggil di hampir semua halaman yang di-generate oleh PHPMaker, kecuali halaman Add. Dengan kata lain, server event ini akan dipanggil dari semua halaman berikut:
- List
- View
- Edit
- Delete
- Update
Jika seandainya Anda ingin menerapkan server event ini hanya untuk halaman List dan View saja, maka Anda dapat menggunakan kode seperti ini:
function Recordset_Selecting(&$filter) { if (CurrentPageID() == "list" || CurrentPageID() == "view") ew_AddFilter($filter, "Field1 = '1234'"); // tambahkan ekspresi filter }
Mudah sekali menerapkan penyaringan record berdasarkan kriteria Anda dengan menggunakan PHPMaker, bukan? Anda sebagai Web Developer cukup hanya menambahkan sedikit kode saja melalui server event Recordset_Selecting. Tidak perlu memodifikasi file script yang sudah di-generate oleh PHPMaker, dan tidak perlu juga mengkostumisasi file Template PHPMaker. 🙂
Herman mengatakan
Sore Pak.
Jika saya memiliki tabel Pegawai berisi data – data mengenai kepegawaian. Bagaimana supaya pengguna (seorang Pegawai juga) yang telah login hanya dapat mengakses data tabel Pegawai / pengguna tersebut saja. Misal di tabel Pegawai ada field “nip” dan di tabel User juga ada field “nip”. Pada Tabel Pegawai saya coba ketik script dibawah ini (saya tempatkan di Server Events -> Table-Specific -> Common
->Recordset_Selecting ):
tapi data tidak muncul. Kira-kira salahnya dimana ya Pak?
terima kasih sblmnya
Masino Sinaga mengatakan
Kriteria filter-nya masih kurang tepat. Coba dengan yang ini:
Herman mengatakan
Terima Kasih sebelumnya Pak.
Sudah saya coba seperti ini :
Namun muncul pesan error seperti ini Pak :
Failed to execute SQL. Error: Unknown column ‘nip’ in ‘field list’
Failed to execute SQL. Error: Unknown column ‘nip’ in ‘field list’
Padahal sudah saya cek di table user, field nip sudah ada kok
kira-kira apanya ya Pak yang menyebabkan error seperti ini?
terima kasih sebelumnya
Masino Sinaga mengatakan
Pastikan Anda sudah mengaktifkan (beri tanda centang) field ini dari Fields setup di kolom List Page -> List pada project PHPMaker, lalu generate ulang lagi semua file script.
Herman mengatakan
Kalau yang ini sudah saya lakukan tapi masih tetap belum bisa Pak
Kalau Pak Masino menuliskan :
“Kalau di PHPMaker, field ini dianggap sebagai User ID yang akan menandai record tersebut milik Pengguna yang sedang login di tabel lain.”
maskudnya gimana Pak? kalau di table User saya ada field iduser sendiri dan ada field nip sendiri (field nip ini baru saya tambahkan )
mohon pencerahannya Pak
Masino Sinaga mengatakan
Ups, sori. Pastikan field nip tersebut ada di tabel users tempat menyimpan data Pengguna untuk login. Artinya, field ini bisa saja namanya tidak sama dengan nip di tabel users. Kalau di PHPMaker, field ini dianggap sebagai User ID yang akan menandai record tersebut milik Pengguna yang sedang login di tabel lain.
Masino Sinaga mengatakan
Herman, maksudnya sudah diuraikan dengan sangat jelas di topik berikut pada file Help aplikasi PHPMaker: Tutorial – Advanced Security – User ID Security.
Herman mengatakan
Sekarang sudah berhasil Pak, ternyata saya yang keliru seharusnya table Employees bukan table User
seperti yang saya katakan sebelumnya
Terima Kasih Pak atas respon yang cepat dan bimbingannya
Masino Sinaga mengatakan
Sama-sama. Senang rasanya bisa membantu. 🙂
Rijal mengatakan
Pak Masino, mau tanya tentang Penyaringan Hak Akses.
saya punya Tabel:
1.Tabel_BAGIAN :
kode_bagian, nama_bagian
2.Tabel_Surat :
nomor_surat, tanggal_surat, tujuan, kode_bagian.
3.Tabel_User :
id_user, password, hak_akses, kode_bagian
saya akan buat jika yang login user dengan kode_bagian :001 (HRD) hanya bisa melihat Record di Tabel_Surat yang Punya Kode_bagian 001(HRD) juga, Jika yang Login Kode_Bagian : 002(Pemasaran) maka hanya bisa melihat Record di Tabel_Surat dengan kode Bagian 002(Pemasaran) juga dst….
saya sudah coba buat Script seperti ini :
saya sudah coba Script diatas tapi yang kebaca selalu yang ‘IF’ pertama yaitu 001, bahkan kalo yg login Admin pun hanya bisa lihat kode_bagian : 001 (IF Pertama).
kira2 dimana ya Pak Kesalahannya.
maaf masih belajar.
Masino Sinaga mengatakan
Karena dari SQL yang Anda gunakan di atas tidak menggunakan kriteria WHERE … sehingga secara standar (default), dia akan selalu mengambil Record pertama dari kumpulan Record yang di-SELECT dari table tersebut, yang dalam hal ini Record yang memiliki kode 001 pada urutan pertama.
heri w mengatakan
Selamat pagi,
perkenalkan saya heri :), saya baru 1 minggu mencoba phpmaker ini dan belum punya experience di php sebelumnya…kl boleh mau bertanya.
terkait artikel ini, kalau kita mau menampilkan transaksi dr suatu tabel saat pertama di load hanya untuk transaksi today date seperti apa ya caranya?
sudah coba code brikut :
$dateTransact_search = date(‘Y-m-d’);
ew_AddFilter($filter, “DATE_IN = ‘”.$dateTransact_search.”‘”);
namun saat data sudah tampil dan kita lakukan search dgn tanggal berbeda namun hasilnya ‘record not found”.
sepertinya data yg kita masukkan saat search tidak mengoverwrite code di Recordset_Selecting ini.
please adv.
Masino Sinaga mengatakan
Memang seperti itu.
Anda bisa menggunakan variabel global untuk mendeteksi halaman List tersebut baru pertama kali dimuat, maka terapkan filter tadi. Sedangkan jika sudah lebih dari sekali dimuat dan/atau jika user melakukan pencarian data, maka abaikan filter itu.
heri w mengatakan
terima kasih sarannya,
btw..adakah parameter bawaan phpmaker (semisal CurrentPageID) yang bisa digunakan untuk me-deteksi halaman tersebut pertama kali dimuat atau tidak?
please adv.
Masino Sinaga mengatakan
Tidak ada kalau bawaan PHPMaker. Tapi jika Anda menggunakan Masino Extensions untuk PHPMaker, Anda dapat memanfaatkan session variable yang saya tambahkan di setiap halaman, dan berisi nilai counter sudah berapa kali sebuah halaman yang berisi table tertentu diakses oleh user dalam satu session.
heri w mengatakan
terima kasih info nya.
saya coba dulu dengan ‘memainkan’ session/global variable.
salam
Masino Sinaga mengatakan
Sama-sama.
Mulyadi mengatakan
Selamat Pagi Pak,
mohon info contact bapak, bagaimana cara2 mendapatkan fitur2 /contoh2 coding bapak di website bapak ?
bagaimana cara registrasinya ? dan berapa biaya donasinya ? terima kasih
Salam
Mulyadi
reffli mengatakan
gimana caranya menampilkan recordset dari tabel yang satu ke tabel transaksi
Masino Sinaga mengatakan
Menampilkan atau menambahkan?
bagus mengatakan
pake filter cari ini, user masih bisa lihat data lainnya yg bukan milik dia. dengan cara ketik langsung di URL nya dan ganti dengan ID recordnya. agar tidak bisa diganti di URLnya bagaimana cara nya bang Masino ? selain pake cara setting di Advanced Security User ID. terimakasih sebelumnya
Masino Sinaga mengatakan
Anda bisa menggunakan server event Row_Selected.
bagus mengatakan
beginikah yang dimaksud kan server event Row_Selected. ?
tapi kok masih bisa user edit URL nya dan lihat record punya userid lain
mohon koreksinya. terimakasih
Masino Sinaga mengatakan
Itu logic-nya masih salah. Buat apa dibandingkan lagi antara $rs[“lembaga_id”] dengan variable $my_id yang sebelumnya sudah diisi dengan nilai dari $rs[“lembaga_id”]?
Ya pasti kondisi itu tidak akan mungkin terpenuhi dong. Perbaiki logic if nya, dan pastikan dulu menggunakan kondisi yang sederhana, dengan cara membandingkan dengan satu nilai tertentu.
Selain itu, method terminate menggunakan huruf kecil di awal. Jadi, bukan Terminate, tapi terminate.
Charly mengatakan
Selamat Sore,
perkenalkan saya Charly.
Pak Masino, mohon pencerahannya, untuk kasus Filter. Saya punya halaman Kontrol Progres Pekerjaan yang di dalamnya terdapat 3 Filter, yaitu Program, Kegiatan, dan Bulan. Yang ingin saya tanyakan bagaimana menyaring data berdasarkan Filter Bulan, artinya sebelum Filter Bulan dipilih walaupun sudah menekan tombol Search data tidak akan ditampilkan dan hanya menampilkan informasi, Filter bulan wajib dipilih…mohon bantuannya Pak Masino. Terima kasih
Masino Sinaga mengatakan
Selamat sore Charly, salam kenal kembali…
Untuk menentukan field yang mandatory (wajib diisi/dipilih) sebelum proses pencarian, silahkan kunjungi artikel ini ya:
Mudahnya Menentukan Field Mandatory pada Kriteria Pencarian dari PHPMaker
Charly mengatakan
Makasih banyak atas bantuannya Pak Masino.
Masino Sinaga mengatakan
Sama-sama.