Ada yang pernah menggunakan fungsi global CurrentUserInfo di PHPMaker tapi mendapatkan hasil yang tidak diharapkan? Penulis pernah, dan baru ketahuan penyebabnya beberapa menit sebelum menulis artikel ini.
Berawal dari kejadian data yang diambil dari salah satu field di tabel users tidak sesuai dengan yang diharapkan. Saat itu Penulis ingin mengambil data Nama Awal dari tabel users, ternyata yang muncul milik Pengguna lain.
Setelah dicek, ternyata Pengguna yang memiliki Nama Awal yang tidak tepat itu memiliki data Kantor yang sama dengan Pengguna yang sedang login. Langsung curiga, pasti ada yang tidak beres dengan fungsi global CurrentUserInfo.
Artinya, selama ini kita menggunakan fungsi global CurrentUserInfo yang tidak sesuai harapan, dan baru ketahuan pada PHPMaker versi 2023! Itu artinya lagi, kondisi ini terjadi juga pada versi 2022, 2021, dan 2020. Paling tidak, pada 4 versi major tersebut, isu tersebut masih terjadi!
Sekedar mengingatkan kembali, fungsi global CurrentUserInfo memiliki satu parameter di dalamnya, yaitu nama field. Jika digunakan, fungsi ini akan mengembalikan data yang tersimpan pada field tersebut pada table users, berdasarkan data Pengguna yang sedang login saat itu.
Contoh, jika Pengguna yang sedang login di aplikasi web memiliki username sonto, dan data pada field Nama_Awal si Pengguna tadi adalah Sontoloyo, maka kode di bawah ini akan mengembalikan string Sontoloyo:
echo CurrentUserInfo("Nama_Awal");
Sekilas, tidak ada yang salah dari fungsi global tersebut. Permasalahan baru timbul, jika kita mengaktifkan User ID Field dari Advanced Security project PHPMaker, dan data yang tersimpan di field User ID tersebut tidak unik untuk setiap data Pengguna.
Isu tidak terjadi jika data di field User ID tadi bersifat unik untuk setiap Pengguna, maka CurrentUserInfo berfungsi sebagaimana mestinya. Itulah sebabnya pada project demo2023 tidak menjadi masalah, karena data User ID di sana unik untuk setiap Pengguna.
Tapi sayangnya, tidak semua data pada field User ID tadi bersifat unik untuk setiap Pengguna. Penulis sering menggunakan data Kantor pada field User ID tersebut. Itu artinya, bisa saja lebih dari satu Pengguna memiliki data Kantor yang sama.
Isu terjadi saat menampilkan data Nama Awal si Pengguna seperti pada contoh di atas, ternyata mengacu kepada Pengguna yang lain; yang bukan sedang login saat itu. Setelah Penulis cek ke table users, data Pengguna yang salah tadi memiliki data kantor yang sama dengan data kantor si Pengguna yang sedang login saat itu.
Setelah Penulis selidiki lebih dalam lagi, tentu saja dengan membongkar kode yang terkait, ternyata penyebab isu tadi ada pada file template src/AdvanceSecurity.php:
<# if (hasUserId) { #>
$filter = GetUserFilter(Config("USER_ID_FIELD_NAME"), $this->CurrentUserID);
<# } else { #>
$filter = GetUserFilter(Config("LOGIN_USERNAME_FIELD_NAME"), $this->currentUserName());
<# } #>
Perhatikan kode di atas ini. PHPMaker 2023 akan men-generate kode dengan filter berdasarkan User ID Field yang terdapat di file hasil generate bernama src/config.php jika kita mengaktifkan User ID Field dari menu Advanced Security di project PHPMaker 2023.
Filter yang digunakan untuk mengambil data Pengguna bukan berdasarkan Username, tapi berdasarkan User ID yang berisi data kantor tadi.
Lalu bagaimana solusinya? Cukup mengubah kode di atas menjadi seperti di bawah ini:
$filter = GetUserFilter(Config("LOGIN_USERNAME_FIELD_NAME"), $this->currentUserName());
Hanya begitu saja? Ya, benar. Hanya begitu saja. Artinya, kita cukup menggunakan filter berdasarkan data Username Field. Kita mengabaikan filter berdasarkan User ID Field. Mengapa?
Karena data Username biasanya selalu unik. Jarang atau bahkan tidak pernah ada data Username yang kembar di sebuah table users. Sementara data User ID bisa saja tidak unik untuk setiap Pengguna. Contohnya ya data Kantor tadi.
Pertanyaan selanjutnya, apakah kita harus menyesuaikan kode tadi pada template PHPMaker yang kita gunakan? Jawabannya: tidak perlu, jika Anda menggunakan Masino Extensions for PHPMaker 2023, perubahan tadi sudah ditangani oleh Masino Extensions for PHPMaker 2023.
Silahkan download ulang Masino Extensions for PHPMaker 2023 dari website ILovePHPMaker.com.
Meskipun cukup terlambat diketahui dan baru ketahuan pada PHPMaker versi 2023, kita patut bersyukur karena akhirnya permasalahan tadi bisa tersolusikan lewat penggunaan Masino Extensions.
Hal ini juga sudah Penulis laporkan melalui forum diskusinya pada hari Jumat, 2 Desember 2023. Tapi sayangnya, sepertinya mereka bertahan untuk tetap mempertahankan penggunaan filter berdasarkan User ID Field.
Alasannya, User ID seharusnya unik untuk setiap Pengguna. Hmm, aneh ya? Sementara sebagian besar aplikasi web yang Penulis buat menggunakan User ID untuk menyimpan data Kantor yang tentu saja tidak unik untuk setiap Pengguna.
Ya sudahlah kalau begitu. Akhirnya, lebih baik Penulis yang mengalah. Tidak ada gunanya berdebat dengan mereka meskipun sudah dijelaskan bahwa ada kemungkinan data User ID tidak unik untuk setiap Pengguna.
Solusinya cukup dengan menggunakan Masino Extensions for PHPMaker 2023. Toh filter berdasarkan Username bisa berlaku untuk semua kondisi di atas, baik bagi mereka yang mengaktifkan User ID Field, maupun yang tidak mengaktifkan User ID Field di project PHPMaker-nya.
Jadi, bagi yang membutuhkan penyesuaian kode di atas agar filter selalu berdasarkan Username dan tetap bisa menggunakan fungsi global CurrentUserInfo, maka sudah saatnya menggunakan Masino Extensions for PHPMaker 2023. Semoga bermanfaat!
Tinggalkan Balasan