Sesuai namanya, server event Page_Render dan Page_Rendering bisa diartikan dengan ketika halaman sedang di-render ke browser. Kedua server event ini berfungsi untuk menjalankan kode PHP yang akan mengubah tampilan Aplikasi Web pada detik-detik sebelum ditampilkan ke browser Pengguna.
Sekilas kedua server event itu mirip. Yang satu tanpa akhiran ing, dan yang satunya lagi dengan akhiran ing. Lantas, apa bedanya?
Perbedaan pertama, server event Page_Rendering dijalankan terlebih dulu daripada server event Page_Render. Jadi, Page_Rendering duluan, lalu diikuti dengan Page_Render.
Perbedaan kedua, server event Page_Rendering berada di level/scope global, sedangkan server event Page_Render berada di level Table.
Dari kedua perbedaan tersebut, maka dapat disimpulkan bahwa karena Page_Rendering dieksekusi duluan daripada Page_Render, kita dapat menulis kode PHP di dalam server event Page_Rendering untuk mengubah tampilan Aplikasi Web untuk semua halaman.
Contoh, pada project demo2021, kita bisa menyembunyikan field OrderID yang berada di table orders dan orderdetails, tanpa harus menulis kode di server event Page_Render milik masing-masing kedua table tersebut.
Sebagai gantinya, kita cukup menulis kode PHP berikut pada server event Page_Rendering:
if (CurrentPage()->TableName == "orders" || CurrentPage()->TableName == "orderdetails") { CurrentPage()->OrderID->Visible = false; }
Karena level global, maka kita harus mengoptimalkan object CurrentPage(), baik untuk mengenali nama table melalui property TableName, maupun untuk mengekspos object Field yang dalam hal ini adalah OrderID, lalu menyembunyikannya dengan menugaskan nilai false kepada property Visible.
Jika kita tidak menggunakan server event Page_Rendering tersebut, maka kita harus mengeset property Visible milik object Field OrderID tadi di masing-masing server event Page_Render milik table orders dan orderdetails, seperti ini:
Satu di Page_Render milik table orders
// di table "orders" $this->OrderID->Visible = false;
dan yang satunya lagi di Page_Render milik table orderdetails:
// di table "orderdetails" $this->OrderID->Visible = false;
Kalau hanya dua table itu saja mungkin tidak masalah kita menulis pada server event Page_Render. Tapi bagaimana jika ada puluhan atau ratusan table? Tentu tidak efektif bukan, jika kita harus menulis di seluruh table tadi?
Nah, untuk itulah server event Page_Rendering disediakan oleh PHPMaker, sehingga kita dapat menggunakannya sebagai solusi yang efektif. Tapi, jangan lupa, untuk case seperti di contoh kode atas tadi, kita harus menyebutkan nama table-nya, karena jika tidak, maka akan menimbulkan error.
Meskipun demikian, bukan berarti server event Page_Render menjadi tidak berguna, lho ya! Jika misalnya kita menggunakan kedua server event tadi, maka kode pada server event Page_Render dalam hal ini bisa meng-override kode yang sudah ditulis pada server event Page_Rendering. Mengapa? Karena scope-nya berada pada level Table.
Jadi, kedua server event Page_Render bisa sama-sama digunakan dengan server event Page_Rendering. Contoh, kita ingin mengubah tampilan Aplikasi Web untuk semua halaman/table melalui kode PHP pada server event Page_Rendering, lalu kita ingin meng-override kode PHP tersebut hanya untuk table tertentu melalui server event Page_Render.
Betapa fleksibel dan mudahnya, bukan? 😉
Rizal mengatakan
Salam kenal Pak Masino,
Saya memiliki 1 tabel (sebut saja tabel A). Tabel ini dipakai dibeberapa menu dengan kondisi filter berbeda-beda (saya biasa sebut step yang berbeda) dan dengan kolom input pada halaman edit juga berbeda-beda.
Apakah mungkin fitur tsb bisa dibuat di PHPMaker?
Terima Kasih
Masino Sinaga mengatakan
Salam kenal kembali. Tentu saja bisa.
Rizal mengatakan
Ada contohnya pak?
Karena yg saya tau di PHPMaker itu 1 Tabel untuk 1 Page, kecuali jika dibuat view / custom view.
Masino Sinaga mengatakan
Baca topik Server Events and Client Scripts dari menu Help PHPMaker, lalu lihat contoh kode di bagian server event yang bernama Recordset_Selecting.