Ada yang masih ingat dengan server event Row_CustomAction? Dengan menggunakan server event ini, yang dikombinasikan dengan server event Page_Load milik halaman List, kita sebagai Web Developer dapat memperbarui satu atau beberapa Record yang terpilih dengan tanda centang sesuai dengan kebutuhan.
Di versi 11, PHPMaker hanya mendukung penggunaan HTTP POST supaya dapat mengeksekusi kode di server event Row_CustomAction tadi. Hal ini bisa Anda lihat dari artikel melalui link di atas. Artinya, sistem akan memuat ulang kembali halaman List tersebut, supaya dapat menjalankan kode PHP yang terdapat di server event ini.
Sejak versi 12, PHPMaker menambahkan satu pilihan baru lagi. Di samping masih mendukung pemakaian HTTP POST, di versi 12, server event Row_CustomAction tadi mendukung pemakaian AJAX. Dengan menggunakan AJAX, maka sistem tidak perlu lagi memuat ulang halaman List setiap kali akan mengeksekusi kode PHP di dalam server event tersebut.
Untuk membedakan apakah ingin menggunakan AJAX atau HTTP POST, maka bisa dilihat dari kode PHP berikut.
Jika menggunakan AJAX, maka pastikan menggunakan kode PHP berikut di server event Page_Load milik halaman List, sehingga kode selengkapnya kira-kira menjadi seperti ini:
// Page Load event function Page_Load() { //echo "Page Load"; // v12: // Use AJAX: $this->CustomActions["star"] = new cListAction("star", "Add Star", TRUE, EW_ACTION_AJAX, EW_ACTION_MULTIPLE, "Add Star to selected records?");}
Sedangkan jika menggunakan HTTP POST, maka kode di atas menjadi seperti ini:
// Page Load event function Page_Load() { //echo "Page Load"; // v12: // Use HTTP POST: $this->CustomActions["star"] = new cListAction("star", "Add Star", TRUE, EW_ACTION_POSTBACK, EW_ACTION_MULTIPLE, "Add Star to selected records?"); }
Perhatikanlah pada parameter keempat, jika menggunakan AJAX, konstanta yang digunakan adalah EW_ACTION_AJAX, sedangkan jika menggunakan HTTP POST, maka konstantanya adalah EW_ACTION_POSTBACK.
Dari kode di atas (baik menggunakan AJAX maupun HTTP POST), maka PHPMaker akan menterjemahkannya ke dalam kode HTML yang di dalamnya terdapat kotak pesan konfirmasi berupa pertanyaan sebelum mengeksekusi kode di server event Row_CustomAction tadi. Kemampuan ini juga baru ditambahkan di versi 12. Pada versi 11 PHPMaker belum mendukung untuk menampilkan pesan sebelum mengeksekusi kode di server event tadi.
Setelah kita membahas kode di server event Page_Load, maka saatnya kita melihat kode di server event Row_CustomAction. Dalam contoh berikut, katakanlah kita menggunakan table orders yang di dalamnya ada field Active yang nilainya apakah Y atau N:
// Row Custom Action event function Row_CustomAction($action, $row) { // Return FALSE to abort // v12: if ($action == "star") { // Check action name $new_value = ($row["Active"]=="Y") ? "N" : "Y"; $rsnew = array("Active" => $new_value); // Array of field(s) to be updated, you can use ["Starred" => "Y", ...] if PHP >= 5.4 $result = $this->Update($rsnew); // Note: The Update() method updates the current record only if (!$result) { // Failure $this->setFailureMessage("Failed to update record, OrderID = " . $row["OrderID"]); return FALSE; // Abort and rollback } elseif ($this->SelectedIndex == $this->SelectedCount) { // Last row $this->setSuccessMessage("All ".$this->SelectedCount." selected records updated."); } return TRUE; // Success } return TRUE; }
Dengan menggunakan kode barusan, kita dapat memperbarui Record yang terpilih dengan menggunakan method Update milih object Page dari halaman List, sekaligus menampilkan pesan yang berisi jumlah Record yang sudah berhasil diperbarui.
Sayangnya, kode di atas, memiliki keterbatasan. Dengan menggunakan method Update tadi, jika ada beberapa Record yang nilai field Active-nya berbeda, maka nilai baru di field tersebut untuk semua Record menjadi sama. Mengapa? Karena parameter dari method Update tadi menggunakan object Recordset $rsnew yang diterapkan sekali untuk semua Record terpilih.
Sekarang mari kita bandingkan dengan kode PHP berikut. Kode di bawah ini digunakan di versi 11. Tentu saja kode ini masih berlaku juga untuk versi 12. Kabar baiknya, kode tersebut bisa membedakan nilai lama di setiap Record, sehingga nilai baru di setiap Record yang terpilih itu akan menjadi kebalikan dari nilai lamanya. Mengapa? Karena kode ini akan memproses setiap satu Record dari yang terpilih.
// Row Custom Action event function Row_CustomAction($action, $row) { // Return FALSE to abort $new_value = ($row["Active"]=="Y") ? "N" : "Y"; if ($action == "star") ew_Execute("UPDATE orders SET Active = '".$new_value."' WHERE OrderID = ".$row["OrderID"]); return TRUE; }
Tentu tidak ada istilah mana yang lebih bagus; apakah menggunakan AJAX atau HTTP POST. Semua itu tergantung kebutuhan. Jika kita ingin agar Pengguna dapat mengetahui nilai baru yang memang ditampilkan di halaman List tersebut setelah menjalankan kode di server event Row_CustomAction tadi, maka pilihan HTTP POST adalah yang paling cocok digunakan.
Sebaliknya, jika kita tidak ingin memuat ulang halaman setiap kali mengeksekusi kode di server event Row_CustomAction, apalagi jika di halaman List tadi tidak menampilkan kolom yang berisi nilai yang akan diubah, maka pilihan AJAX adalah yang terbaik.
Satu lagi kemudahan dan fleksibelitas yang diberikan oleh PHPMaker, membuat proses pengembangan Aplikasi Web dapat dilakukan dengan sangat cepat. Tidak perlu menulis kode sampai berpuluh-puluh atau beratus-ratus baris. Sangat sederhana sekaligus powerful.
Betapa rapinya framework yang disediakan oleh PHPMaker. Hanya dengan menggunakan kode sedikit itu saja, kita dapat menghasilkan kemampuan di Aplikasi Web untuk memproses beberapa Record sekaligus pada halaman List. Bandingkanlah jika hal ini harus dilakukan dengan cara-cara manual. 🙂
Fendi Oviyanto mengatakan
Salam Kenal pak masino
udah lama saya mengikuti ilmu2 yang bapak share sejak masih jaman VB 🙂
saya mw share sedikit pak selaku programmer…
case yag memang saya hadapi dalam php ada 2 baik php native dan framework
walopun natife teteap fokus pada konsel OOP php itu sendiri
saya memang ada rencana untuk membuat aplikasi menggunakan wizard seperti phpmaker, ini aplikasi sudah ada sejak dlu, cma saya kurang yakin saja dalam pemecahan kasus kedepannya, menurut pak masino sendiri bagaimana?
kasus lain, yang saya lihat dari phpmaker itu membuilt CRUD, bagaimana jika ada bbrp link atau modul aplikasi saya hanya melihat / dasboard, dll, atau dengan kata lain page yang dibuat custimize dari script kita sendiri,
Terimakasih
Rgds
Masino Sinaga mengatakan
Salam kenal kembali. Curhat nih ceritanya? Hehe… 🙂
Semua yang Anda khawatirkan itu sudah ada jawabannya di PHPMaker. Gak percaya? Silahkan eksplorasi sendiri PHPMaker. Belajarlah dari contoh file demo project yang bisa Anda download dari situs resmi PHPMaker, lalu coba dan generate ulang dari localhost. Baca juga menu Help karena semua yang Anda butuhkan sudah ada di sana.
Khusus untuk page yang isinya ingin Anda customize sendiri, Anda bisa menggunakan fitur Custom Files. Baca juga topik ini dari menu Help. Di sana sudah dijelaskan dengan sangat detail. Di file demo project juga sudah ada contoh pemakaiannya, yaitu: home.php.
Ahmed mengatakan
Dear Pak Masino,
Saya mau bertanya. tabel saya ada seperti dibawah ini
Tabel Koneksi:
1.nama
2.IP
Tabel koneksi ini menyimpan beberapa alamat IP.
Yang mau saya tanyakan,
Bagaimana mengambil nilai salah satu data dalam tabel untuk dijadikan variabel selanjutkan pada fungsi lain.
Misal,
$koneksi= new koneksi(“192.168.1.1”); koneksi seperti ini berhasil namun
<- IP address ini saya mau ganti dengan data IP yang tersimpan dalam tabel koneksi.
yang sudah saya coba tapi tidak dapat konek adalah sebagai berikut
$sql="select nama,ipaddress";
$koneksi=new koneksi($sql[1]);
hasilnya di browser error.
terimakasih atas pencerahannya
Masino Sinaga mengatakan
Pesan error-nya apa?
ahmed mengatakan
ini pesan errornya pak
Warning: socket_recvfrom(): unable to recvfrom [10060]: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
Masino Sinaga mengatakan
Pastikan setting koneksi yang Anda gunakan valid.
Ahmed mengatakan
Sebenarnya pak, yang valid/original code itu adalah sebagai berikut:
$koneksi = new $koneksi(“192.168.1.1”,80);
namun saya ingin mengkastum IP dan menyimpannya di tabel.
jadi nanti saat ingin membuat koneksi baru pake IP baru, tidak perlu lagi masuk ke skrip dan compile lagi.
nah ini lah yang saya bingung, jika IP “192.168.1.1” di ganti dengan variable IP yang sudah di simpan dalam tabel.
IP dari tabel saya sudah load dan simpan pada variabel $sql[0].
gimana pak ya, caranya?
Terimakasih
Masino Sinaga mengatakan
$koneksi = new $koneksi($sql[0], 80);
Joko mengatakan
salam kenal, curhat, saya mempelajari phpmaker sduah dari tahun 2009 namun belum ada project yang serius saya buat denganya, saya selalu mentok karena tak ada buku yang membahas secara lengkap lewat studi kasus yang kongkrit. kalau ada saya ingin membelinya.
kesempatan ini saya mau tanya. cara membuat view di phpmaker.
saya punya struktur seperti berikut :
SELECT varietas.var_nama AS Varietas,
(Sum(kedatangan.ked_jumlah) – Sum(sortir.sor_jumlah)) AS `Belum Sortir`,
((((Sum(sortir.sor_jumlah) – Sum(sortir.sor_jumlah_kecil)) –
Sum(sortir.sor_jumlah_busuk)) – Sum(sortir.sor_jumlah_lost_lain)) –
Sum(cuci.cuc_jumlah)) AS `Sudah Sortir`,
((((Sum(cuci.cuc_jumlah) + Sum(cuci.cuc_jumlah_tambahan)) –
Sum(cuci.cuc_jumlah_apung)) – Sum(cuci.cuc_jumlah_busuk)) –
Sum(pemakaian.pem_jumlah)) AS `Sudah Cuci`,
Sum(pemakaian.pem_jumlah) AS `Sudan Diproduksi`
FROM (((((varietas
LEFT JOIN kedatangan ON varietas.var_kode = kedatangan.var_kode)
LEFT JOIN sortir ON kedatangan.ked_kode = sortir.ked_kode)
LEFT JOIN cuci ON sortir.sor_kode = cuci.sor_kode)
LEFT JOIN pemakaian ON cuci.cuc_kode = pemakaian.cuc_kode)
LEFT JOIN petani ON petani.pet_kode = kedatangan.pet_kode)
LEFT JOIN supplier ON supplier.sup_kode = petani.sup_kode
GROUP BY varietas.var_nama
view ini berjalan namun jika di run hasilnya kurang sempurna seperti : http://prntscr.com/a4p4bk ,
kesalahannya adalah misal :
Sum(kedatangan.ked_jumlah) – Sum(sortir.sor_jumlah)) AS `Belum Sortir`,
jika salah satunya nilainya nol maka hasil tidak ditampilkan
bagaimana mengatasinya ya,
saya sudah coba beberapa alternatif joint namun yang paling bisa mendekati adalah left joint,
mohon pencerahannya,
terimakasih,
Joko
Masino Sinaga mengatakan
Silahkan Google “mysql sum display 0”
Joko mengatakan
thanks solved
(If(isnull(Sum(kedatangan.ked_jumlah)), 0, Sum(kedatangan.ked_jumlah)) –
If(isnull(Sum(sortir.sor_jumlah)), 0, Sum(sortir.sor_jumlah))) AS Belum Sortir,
ameisfine mengatakan
Dear Pak Masino,
Saya sudah buat syntax di ListOptions_Rendered sbb:
$this->ListOptions->Items[“checksoap”]->Body = “ Check“;
Tapi saya ingin merubahnya pake row_customaction. Bagaimana syntaxnya jika dibuat di row_customaction ya pak? Thanks
Masino Sinaga mengatakan
Tidak bisa diubah dari server event Row_CustomAction, karena kode di server event ini hanya untuk memproses record yang terdapat di table pada halaman List.
ameisfine mengatakan
Baik. Makasih pencerahannya pak. Berarti saya tetap pake ListOptions_Rendered saja ya.
Masino Sinaga mengatakan
Yes.