Custom Fields adalah salah satu fitur unggulan pada PHPMaker sejak versi 12. Fitur ini memungkinkan Web Developer dapat dengan mudah menambahkan field yang nilainya dapat dikostumisasi sendiri. Dengan cara ini, maka kita tidak perlu lagi menambahkan field tersebut ke tabel yang bertalian dari Database. Artinya, field ini cukup ditangani dari dalam project PHPMaker.
Supaya lebih mudah dipahami, mari simak contoh berikut. Katakanlah kita ingin mengetahui nilai selisih antara dua buah tanggal (Tanggal_Awal dan Tanggal_Akhir; kedua field ini masing-masing tipenya adalah DateTime) pada database MySQL, lalu menampilkan hasilnya pada sebuah field yang bernama Durasi_Waktu.
Field Durasi_Waktu tadi dalam hal ini merupakan Custom Field, dan tidak terdapat di table yang bertalian. Nilai pada field ini merupakan selisih antara Tanggal_Akhir dan Tanggal_Awal dalam satuan detik. Mengapa harus dalam satuan detik? Supaya nanti kita bisa mengkonversikan nilai tersebut dalam format sekian hari, jam, menit, dan detik.
Karena nilai pada field ini sudah ditangani melalui Custom Field, maka itu artinya kita tidak perlu lagi menampilkannya di form atau halaman Add dan Edit. Kita hanya menampilkannya dalam mode Read-Only di halaman List dan View. Di sinilah lagi-lagi kita sebagai Web Developer dapat menyederhanakan business-logic tanpa harus menulis kode sampai berpuluh atau beratus baris panjangnya.
Bisakah Anda bayangkan sekarang jika pekerjaan ini Anda kerjakan secara manual dengan cara menulis kode dari awal? Berapa lama waktu yang harus Anda butuhkan untuk menghasilkannya?
Penasaran ingin tahu bagaimana cara mengimplementasikannya melalui fitur Custom Fields dari PHPMaker? Oke, langsung saja ikuti langkah-langkah berikut.
Pertama, buka project PHPMaker Anda dan pastikan table yang mengandung dua buah field dalam contoh di atas, yaitu: Tanggal_Awal dan Tanggal_Akhir sudah terpilih dari panel Database. Tentu saja Anda dapat menyesuaikan dengan nama field yang Anda punya.
Kedua, klik kanan table yang bertalian dari panel Database tadi, lalu pilih menu Add Custom Field, lalu akan muncul jendela kecil yang berjudul Add Custom Field.
Ketiga, masukkan Durasi_Waktu pada bagian Field Name, lalu masukkan Durasi Waktu pada bagian Caption, dan masukkan kode berikut ke bagian Expression:
TIMESTAMPDIFF(SECOND,Tanggal_Awal,Tanggal_Akhir)
lalu jangan lupa untuk mengklik tombol OK untuk menyimpan perubahan. Kode ini untuk menghitung selisih dari dua buah tanggal dan menampilkan hasilnya dalam satuan Detik (Seconds).
Keempat, pastikan field Durasi_Waktu sedang terpilih, klik tab Fields, lalu hapus tanda centang pada kolom Edit dan Add yang masing-masing berada di bawah kolom Edit Page. Tujuannya supaya field Durasi_Waktu tidak ditampilkan pada halaman Add dan Edit.
Kelima, kita harus mempunyai function yang dapat mengkonversi nilai Detik menjadi nilai durasi waktu dalam format sekian hari, sekian jam sekian menit dan sekian detik. Untuk itu, salin kode berikut ke bagian Global Code yang terdapat di bawah lokasi Server Events -> Global -> All Pages:
function ConvertSecondsToDuration($seconds) { /** * Convert number of seconds into years, days, hours, minutes and seconds * and return an string containing those values * * @param integer $seconds Number of seconds to parse * @return string */ $y = floor($seconds / (86400*365.25)); $d = floor(($seconds - ($y*(86400*365.25))) / 86400); $h = gmdate('H', $seconds); $m = gmdate('i', $seconds); $s = gmdate('s', $seconds); $string = ''; if($y > 0) { $yw = $y > 1 ? ' years ' : ' year '; $string .= intval($y) . $yw; } if($d > 0) { $dw = $d > 1 ? ' days ' : ' day '; $string .= intval($d) . $dw; } if($h > 0) { $hw = $h > 1 ? ' hours ' : ' hour '; $string .= intval($h) . $hw; } if($m > 0) { $mw = $m > 1 ? ' minutes ' : ' minute '; $string .= intval($m) . $mw; } if($s > 0) { $sw = $s > 1 ? ' seconds ' : ' second '; $string .= intval($s) . $sw; } return preg_replace('/\s+/',' ',$string); }
Keenam, tambahkan kode pada server event Row_Rendered milik table tadi untuk menampilkan hasil perhitungan dalam format durasi waktu hari, jam, menit, dan detik, sehingga kode selengkapnya menjadi seperti ini:
// Row Rendered event function Row_Rendered() { // To view properties of field class, use: //var_dump($this-><FieldName>); $this->Durasi_Waktu->ViewValue = ConvertSecondsToDuration($this->Durasi_Waktu->CurrentValue); }
Selesai! Hanya begitu saja? Ya, hanya begitu saja! Tentu, Anda harus men-generate ulang semua file script dengan menggunakan PHPMaker seperti biasa. Biarkan PHPMaker yang bekerja buat Anda, dan bukan Anda yang diperbudak pekerjaan seperti yang selama ini Anda alami dalam membangun Aplikasi Web!
Wow, betapa mudah, cepat, dan menyenangkan sekali, bukan? 😀
hamsah mengatakan
Pak Masino bisakah sy membuat custom field tanggal dengan model dropdown bukan menggunakan extensi pop up calendar ? hanya saja saya terkendala karena setiap field pada halaman add disusun per row sedangkan saya ingin tanggal tersebut sejajar secara horizontal dengan drop down untuk memilih buland an tahun…
Masino Sinaga mengatakan
Untuk saat ini belum bisa.
hamsah mengatakan
Pak Masino bisakah sy membuat custom field tanggal dengan model dropdown? kendalanya pada halaman add setiap field akan muncul per row sedangkan saya ingin mereka muncul pada satu row yang sama untuk field tanggal bulan dan tahun maaf kalo pertanyaannya terlalu noobish…
Masino Sinaga mengatakan
Sama dengan jawaban di atas, saat ini belum bisa.
Nanda mengatakan
Pak Masino Sinaga, saya kok mengalami error yang aneh ya..
jadi setelah saya bikin Custom Field kok tiba2 ketika melakukan Pencarian muncul error seperti ini
Padahal Hasil Custom Field di Halaman List dan ADD sendiri Normal (tidak eror) dan tetap bisa dimunculkan.
kira2 penyebabnya apa ya pak… apakah di Database nya atow apa?
NB :
saya sempet gonta ganti setting File Koneksi (manual di file nya) dari Database A ke Database B (jadi yg Database B hanya untuk Uji coba Namun isinya sama dengan A)
yang lebih aneh lagi ketika saya cari data HASIL INPUT hari kemarin Normal, Namun ketika saya cari DATA HASIL INPUT hari ini Malah muncul Error tersebut.
Masino Sinaga mengatakan
Coba aktifkan mode Debug, untuk memeriksa apakah ada sintaks SQL yang error terkait Custom Field tadi.
Nanda mengatakan
Terimakasih Jawabannya Pak Masino,
setelah saya aktifkan mode Debug , ketika pertama kali diakses (belum login) justru sudah muncul Peringatan error yaitu :
(mysqlt): SET NAMES ‘utf8’
Error (0):
dan setelah login banyak muncul error di setiap halaman, salah satunya mengarah ke Tabel USER, kira2 seperti ini :
dan error lainnya yaitu Error Query ke Tabel-Tabel selain Tabel User,
kira2 seperti ini
(mysqlt): SELECT* bla bla bla…..
Error (0):
intinya error diawali ‘(mysqlt): ‘ dan di akhiri ‘Error (0): ‘
Nah munculnya Error tersebut apakah Permasalahan di Database nya atau ada yang harus Di Ubah pada Advance Setting di dalam project PHP Maker ?
Masino Sinaga mengatakan
Error (0) itu artinya tidak ada error. Jika ada error, maka nilai 0 berubah jadi 1, dan di sebelah kanannya akan ditampilkan pesan error-nya.
Kalau melihat pesan sebelumnya, maka itu artinya Custom Fields tidak akan berfungsi jika Record yang dikembalikan dari lebih dari satu row. Oleh karena itu, solusinya usahakan agar Record yang dikembalikan hanya satu row.
Nanda mengatakan
oh.. itu bukan error ya, artinya hanya bisa untuk melakukan pencarian 1 Row ?
tapi kok aneh juga ya..
Errornya memang hanya saat melakukan Pencarian (baik Quick Search maupun Advance)
Jadi di dalam Advance Search disitu ada Pencarian per Tanggal (pake Between)
saya coba melakukan Search Perhari :
# tanggal 16 : error semua (baik quick search maupun Advance, baik pencarian satu record maupun semua)
# tanggal 17 : Tidak error dan LANCAR (baik quick search maupun Advance, baik pencarian satu record maupun semua)
# tanggal 18 s.d. hari ini : Kembali Error seperti semula.
NB :
pada tanggal 17 saya sempat GENERATE ULANG dengan menghilangkan beberapa ‘centang’ pada Quick Search/ kriteria pencarian pada Quick Search saya batasi hnya utk 3 field.
(sehingga tidak error pada hari itu) namun keesokan harinya saya coba lagi mengalami error seperti semula.
Jadi pada awalnya terdapat 4 buah ‘CUSTOM FIELD’ dan Tidak terjadi error, namun setelah saya tambahkan 1 buah ‘ CUSTOM FIELD’
lagi muncul Error tersebut (sehingga terdapat 5 CUSTOM FIELD).
saya sendiri masih bingung, apakah error terjadi karena Custom Field tersebut.. mungkin dibatasi hanya 4 buah ?
atau ada pengaturan lain yang sempat saya ubah ?
Masino Sinaga mengatakan
Seharusnya field yang dibuat dengan Custom Field tidak perlu disertakan dalam fitur Pencarian, baik Quick Search, Extended Search, dan Advanced Search.
Nanda mengatakan
sudah saya coba hilangkan yang Pencarian melibatkan Custom Field tersebut.
tapi masih tetep error.
seingat saya perubahan lain yg sempat saya lakukan adalah :
awalnya Project tersebut terkoneksi dengan DATABASE =’A’
lalu saya buat Database Baru dengan Nama = ‘B’ (isinya sama persis dengan ‘A’)
Project tersebut saya ubah koneksi nya Manual dari ‘Text Editor’ menjadi koneksi ke Database ‘B’.
dan baru ketahuan error nya setelah saya tambahkan Custom Field baru tersebut.
Masino Sinaga mengatakan
Coba koneksi ke database-nya dilakukan dari dalam project; jangan diubah manual pakai Text Editor.
Nanda mengatakan
Maaf Pak Masino, ternyata masalahnya adalah di Tabel Master nya.
Jadi saya itu buat Custom Field (pada Tabel Transaksi relasi ke Tabel Master.)
Nah masalah itu terjadi karena Isi Field (Kode) di Tabel Master ada yang ganda, misalnya ‘Kode 001’ di tabel master yang saya jadikan rujukan ada 3 buah record yang sama, maka akan muncul error tersebut.
sedangkan jika di Tabel Master nya tidak ganda tidak muncul error, misal ‘Kode =002’ pada Tabel Master hanya satu Record maka tidak akan terjadi error.
Tabel Master tersebut saya Import dari Excel, sehingga saya belum sempat melihat ada Kode yang Ganda.
Terimakasih atas Responnya, Maaf.
Masino Sinaga mengatakan
Baiklah kalau begitu. 🙂
ridan hari mengatakan
pak kalau mau membuat date picker di phpmaker bagaimana?
Masino Sinaga mengatakan
Aktifkan extension JSCalendar dari menu Tools -> Extensions, lalu generate ulang semua file script dari PHPMaker.
Bayu mengatakan
Pak Masino. Saya kesulitan menambah Custom Field pada Linked Tables.
Jadi ceritanya, saya memiliki beberapa linked tables yang sumbernya dari 1 table untuk menampilkan field yang berbeda.
Source table: Table1 (field A, B, C, D, E)
Linked table: Link1a (ditampilkan A, B)
Linked table: Link1b (ditampilkan C, D, E)
Saya Add Custom Field di Link1a. Masukin field, caption, dan Expression. Ketika saya klik Ok, ada pesan error berupa “Failed to add Custom Field. #42S02Table ‘project.Link1A’ doesn’t exist.
Bahkan saya isi Expression “0” saja error. Apakah ada cara lain? Terima kasih.
Masino Sinaga mengatakan
Cek ulang lagi nama linked table-nya. Link1a tidak sama dengan Link1A.
Bayu mengatakan
Itu saya hanya typo error. Intinya saya tidak bisa menambahkan Custom Field di Linked Tables. Anda pernah kejadian seperti ini? Apakah ada cara lain? Terima kasih.
Masino Sinaga mengatakan
Gak pernah.
Bayu mengatakan
Terima kasih.
bagus mengatakan
izin bertanya bang Masino: saya punya 3 custom fields. dan ingin menjumlahkan value dari custom fields 1 dan 2 ke custom fields ke 3. bagaimana solusinya atau ada cara lain ? . saya memakai custom fields karena ada pemakaian case when yang banyak kondisi memakai field field di tabel tadi. terimakasih sebelumnya
Masino Sinaga mengatakan
Kalau untuk halaman Add, gunakan server event Row_Inserting. Sedangkan untuk halaman Edit, gunakan server event Row_Updating.
Asep mengatakan
Maaf mas, mohon pencerahan. saya pengguna baru.
saya buat input data waktu saja misal 12:05 ( jam masuk dan jam keluar dengan nama field masuk dan keluar)
tapi di database waktu yang tersimpan di kedua fieldnya sama dan anehnya jamnya berbeda dengan real di PC. (saya pkai XAMPP sudah set timezone diphp.ini)
Apa saya salah? apa yang mesti saya perbaiki?
thanks mas mohon bantuannya.
Masino Sinaga mengatakan
Coba atur Timezone-nya dari menu Tools -> Locale Settings, lalu pilih bahasa yang digunakan di project tersebut, kemudian sesuaikan di bagian time_zone (asumsi pakai PHPMaker v2023).
Asep mengatakan
mas, saya coba tutor ini, jika ingin data hasil perhitungan disimpan di database. caranya bagaimana pak?
terimakasih, karena mas, saya jadi paham custom field.
Masino Sinaga mengatakan
Kalau memang data durasi tersebut ingin disimpan saat menambah data, maka gunakan server event Row_Inserting, sedangkan saat mengubah data, gunakan server event Row_Updating.
Contoh, nama field untuk menyimpan data durasi di database adalah Durasi_DB, maka tinggal menulis kode ini saja di server event yang saya sebutkan tadi:
Asep mengatakan
saya coba menambahkan script diatas pada Row_Inserting. namun di db tetap kosong mas. begitu juga di Row_Updating.
apa yang mesti saya periksa? saya belum banyak paham alur phpmaker ini. thanksmas responnya..
Masino Sinaga mengatakan
Custom Field-nya sudah diaktifkan untuk halaman Add dan Edit?