Quantcast
Channel: Masino Sinaga
Viewing all 176 articles
Browse latest View live

Mudahnya Menerapkan Rule Penyimpanan Data di Master/Detail Add dari PHPMaker

$
0
0

Salah satu fitur unggulan di PHPMaker sejak dulu sampai sekarang adalah kemampuan untuk menambah data Master dan Detail sekaligus dalam satu halaman. Pengguna bisa langsung menambahkan data di bagian Master, dan juga data yang bisa mencapai lebih dari satu baris di bagian Detail.

Mungkin tidak banyak di antara kita yang mengetahui, bagaimana business-logic penyimpanan data di Master/Detail Add tadi. Karena ada lebih dari satu tabel yang terlibat di halaman ini (tabel Master dan tabel Detail), maka kita harus bisa memastikan terlebih dulu, bagaimana aturan yang digunakan oleh PHPMaker saat proses penyimpanan datanya.

Sampai dengan versi 2020, PHPMaker masih menggunakan aturan yang apabila validasi di bagian tabel Detail tidak lolos, maka data di tabel Master akan tetap tersimpan ke Database. Artinya, dalam hal ini data di bagian tabel Detail yang terkait dengan record di tabel Master tadi menjadi kosong. Hanya data di tabel Master saja yang tersimpan.

Tentu saja, sebagai Web Developer, kadang-kadang kita tidak menginginkan kondisi tersebut terjadi. Seringkali bahkan kita harus menerapkan aturan, bahwa data di bagian Detail juga harus ada tersimpan ke Database jika data Master-nya berhasil masuk ke Database. Artinya, kita tidak boleh mengijinkan data Detail kosong, sementara data Master-nya berhasil masuk ke Database.

Jadi, dalam hal ini kita harus bisa menangani kemungkinan jika data di tabel Detail tidak lolos proses validasi, maka data di bagian Master tidak boleh tersimpan ke Database. Kesimpulannya, data di bagian Master dan Detail tadi benar-benar harus sudah lolos proses validasi oleh sistem, barulah bisa disimpan sekaligus ke Database.

Pertanyaannya, bagaimana cara kita untuk menerapkan aturan tadi? Sementara yang kita ketahui, PHPMaker masih membolehkan data Master tersimpan, tapi data di tabel Detail tidak tersimpan sama sekali.

Untungnya, PHPMaker sudah menyediakan server event yang bernama Grid_Inserting. Melalui server event ini, kita bisa menangani jika data di tabel Master sudah terlanjur tersimpan, maka kita harus menghapusnya, karena sistem masih tetap menampilkan form Master/Detail Add dalam keadaan terbuka, jika proses validasi di bagian tabel Detail tidak lolos.

Untuk menerapkan aturan yang kita inginkan tersebut, maka kita bisa menggunakan kode berikut di dalam server event Grid_Inserting milik tabel Detail, selengkapnya begini:

// Grid Inserting event
function Grid_Inserting() {
	// Enter your code here
	// To reject grid insert, set return value to FALSE

	$rsnew = $this->getGridFormValues(); // Get the form values of the new records as an array of array
	$Jumlah_Kirim = 0;
	$sMsg = "";
	$i = 0;
	foreach ($rsnew as $row) { // Loop through the new records
		$Jumlah_Kirim = intval($row["Jumlah_Kirim"]);
		if (empty($Jumlah_Kirim)) {
			$sMsg .= "<strong>" . $row["Barang"] . "</strong>, ";
			$i++;
		}
	}
	$sMsg = rtrim($sMsg, ",");
	if (!empty($sMsg)) {
		Execute("DELETE FROM kirim WHERE ID_Transaksi = '" . $GLOBALS['kirim']->ID_Transaksi->CurrentValue . "'");
		$this->setFailureMessage("Ada <strong>" . $i . "</strong> barang yang Jumlah Kirimnya masih kosong, yaitu: " . $sMsg . ".<br><br>Pastikan Jumlah Kirim tidak kosong ...");
		return FALSE;
	}
	
	return TRUE;
}

Dari contoh kode di atas, kita memvalidasi bahwa tidak boleh ada record yang nilai di field Jumlah_Kirim bernilai nol atau kosong. Jika ada, maka kita harus menampung data Barangnya ke dalam variabel $sMsg di dalam blok loop foreach, dan jika variabel ini tidak kosong, maka itu artinya ada data di bagian Detail yang tidak lolos validasi.

Selanjutnya, kita menampilkan pesan dengan memanggil method setFailureMessage milik object Table atau Page, dengan menampilkan Barang mana saja yang tidak lolos validasi, tapi… sebelumnya kita harus menghapus data di tabel kirim sebagai Master-nya. Jangan lupa, kita harus mengembalikan FALSE supaya form Master/Detail Add masih dalam posisi terbuka.

Betapa mudah dan menyenangkan sekali, bukan? Cukup melalui server event Grid_Inserting, kita sudah bisa menerapkan business-logic penyimpanan data di halaman Master/Detail Add.

Hehe, masih membuat aplikasi web dengan cara-cara konvensional, dan belum menggunakan PHPMaker? 😉


Mudahnya Menyembunyikan Tombol Add di Halaman View dari PHPMaker

$
0
0

Seperti di artikel-artikel saya terdahulu yang membahas betapa mudah dan cepatnya kita menyembunyikan suatu elemen atau tombol di halaman View, maka di artikel ini kita akan membahas betapa mudah dan cepatnya kita menyembunyikan tombol Add atau Tambah di halaman View.

Cukup dengan menulis satu baris kode saja di server event Page_Render milik halaman View, seperti kode di bawah ini:

// Page Render event
function Page_Render() {
	//echo "Page Render";
	$this->OtherOptions["action"]->Items["add"]->Visible = FALSE;
}

Dari kode tersebut, kita hanya mengubah property Visible milik item tombol add menjadi FALSE. Tombol Add merupakan bagian dari object OtherOptions dari object Table atau Page milik halaman View.

Kode tersebut sangat berguna jika Anda sebagai Web Developer tidak ingin mengekspos tombol Tambah di halaman View dari suatu tabel Master. Tentu ada alasannya. Biasanya, karena Anda ingin mewajibkan Pengguna Akhir menambah data melalui halaman Master/Detail Add.

Jadi, tidak diijinkan menambah data hanya melalui halaman Add milik tabel Master. Harus dilakukan dari halaman Master/Detail Add, yang melibatkan tabel Detailnya juga. Inilah alasan utama mengapa kita harus dapat menyembunyikan tombol Add di halaman View milik tabel Master.

Rasanya hidup menjadi lebih menyenangkan dan mengasyikkan lagi ketika menggunakan PHPMaker sebagai solusi cepat untuk membangun Aplikasi Web.

Jumlah Record Detail Nol Sekarang Otomatis Disembunyikan dari PHPMaker 2020

$
0
0

Seperti kita ketahui, di aplikasi web yang dihasilkan oleh PHPMaker 2020, jika jumlah record nol di tabel Detail pada mode Master/Detail, maka akan tetap ditampilkan, baik di halaman List mauapun halaman View. Hal ini sering kali mengganggu, karena tidak nyaman rasanya jika sistem menampilkan nilai 0 tersebut.

Mulai hari ini, Minggu, 22 Maret 2020, di aplikasi web yang dihasilkan dengan PHPMaker 2020 dan Masino Extensions untuk PHPMaker 2020, jumlah record nol di tabel Detail akan otomatis disembunyikan. Dengan cara ini, maka Pengguna Akhir tidak merasa terganggu ketika melihat jumlah record nol tersebut.

Pengguna Akhir aplikasi web sekarang menjadi lebih nyaman ketika menampilkan bagian Detail ketika tombol plus kecil di sebelah kiri record Master diklik. Jika tidak ada record di tabel Detail, maka di sebelah kanan dari judul tab yang bertalian tidak lagi menampilkan angka nol. Pengguna dengan cepat mengetahui bahwa tidak ada data di tabel Detail.

Jadi, informasi jumlah record di tabel Detail ini hanya ditampilkan jika ada record di tabel Detail. Kita langsung bisa membedakan dengan cepat, dan menjadi lebih nyaman lagi ketika kita mem-browser data di tabel yang memiliki relasi Master/Detail.

Perubahan tadi baru hari ini saya tambahkan ke Masino Extensions untuk PHPMaker 2020. Oleh karena itu, jika Anda sudah terdaftar di situs ILovePHPMaker.com, silahkan login lalu download ulang Masino Extensions untuk PHPMaker 2020. Sesudah di-extract, copy-kan semua file ke sub folder extensions seperti biasa (timpa yang lama dengan yang baru ini).

Langkah selanjutnya, pastikan Anda men-generate ulang semua file script seperti biasa dengan menggunakan PHPMaker. Ya, secepat dan semudah itu. Perubahan di atas akan otomatis Anda nikmati. Tidak itu saja, hari ini juga saya menyesuaikan Masino Extensions ke file Template PHPMaker yang versi terakhir.

Inilah bukti bahwa Masino Extensions tetap dan selalu diperbarui ke PHPMaker versi terakhir. Sekecil apapun perubahan itu, langsung diimplementasikan. Bayangkan kalau kita membangun aplikasi web dengan cara-cara manual, hal seperti ini sering kali luput dari perhatian Web Developer.

File Javascript Berisi Client Side Event Sekarang Otomatis Dimuat di PHPMaker 2020

$
0
0

Seperti yang kita ketahui, aplikasi web yang dihasilkan oleh PHPMaker sampai dengan versi 2020 belum mendukung penggunaan versi yang ditambahkan di belakang file-file .css dan .js. Akibatnya, apabila ada kode style atau kode Javascript yang kita (sebagai Web Developer) tambahkan di file-file tersebut, maka Pengguna Akhir belum tentu dapat merasakan secara langsung perubahan tadi.

Sekalipun file-file .css dan .js tadi sudah kita upload ke web server, mereka harus terlebih dulu melakukan hard-refresh atau hard-reload dengan cara memuat ulang file-file .css dan/atau .js tersebut secara eksplisit. Mengapa? Karena file-file .css dan/atau .js yang kontennya sudah berubah tadi tidak bisa otomatis dimuat oleh browser.

Browser masih menggunakan versi yang lama. Browser tidak dapat mengenali apakah konten file tersebut berubah atau tidak, karena tidak ada penandanya. Biasanya, mereka harus melakukan View Page Source dari browser, lalu mengklik link ke file .css atau .js.

Sayangnya, tidak semua file-file .css dan .js tadi menampilkan link ke filenya. Ada juga kode seperti ini yang dihasilkan oleh PHPMaker:

// User event handlers
ew.ready(ew.bundleIds, "js/userevt.js", "load", function() {

	// Global startup script
	// Write your global startup script here
	// console.log("page loaded");

});

Perhatikan kode js/userevt.js. Di sana tidak ada link ketika kita melihatnya melalui menu View Page Source di browser. Untuk memuatnya, kita harus meng-copy paste alamat tersebut ke browser dengan menambahkan awalan berupa alamat domain ke aplikasi web-nya, sehingga menjadi kira-kira seperti ini:

http://localhost/demo2020/js/userevt.js

Bayangkan, ada berapa banyak file .css dan .js yang digunakan oleh aplikasi web yang dibangkitkan oleh PHPMaker tadi? Apakah wajar jika Pengguna Akhir harus melakukan hal-hal seperti itu? Atau paling tidak, apa iya kita harus selalu menginstruksikan mereka untuk melakukan hal tadi?

Untuk itulah sudah saatnya setiap file-file .css dan .js yang digunakan oleh Aplikasi Web harus menggunakan versi file. Caranya, cukup menambahkan versi file setelah nama filenya. Jadi, ketika konten file tersebut berubah, maka sistem akan otomatis mengganti versi file tersebut. Browser yang digunakan oleh Pengguna Akhir pun akan otomatis memuat ulang file-file dengan versi yang baru tadi.

Supaya Anda tidak bingung, mari kita lihat lagi salah satu contoh penggunaan file .css yang terdapat di bagian Header dari aplikasi web yang dihasilkan oleh PHPMaker 2020:

<link rel="stylesheet" type="text/css" href="css/demo2020.css">

Perhatikanlah kode di atas. Di sana tidak terdapat versi dari file demo2020.css.

Seharusnya, supaya browser yang digunakan oleh Pengguna Akhir dapat otomatis men-download ulang file .css yang baru yang berisi perubahan tadi, maka kita harus menambahkan versi setelah nama file tersebut, seperti di bawah ini:

<link rel="stylesheet" type="text/css" href="css/demo2020.css?v=1585131820">

Nah, sudah tahu sekarang perbedaannya? Di kode terakhir, sistem menambahkan versi setelah nama file-nya, dengan menambahkan parameter v (singkatan dari versi), lalu karakter = (sama dengan), dan diikuti dengan nomor versinya.

Untuk mengatasi permasalahan tersebut, penggunaan Extensions adalah solusi yang paling mudah dan cepat. Dengan membuat Extensions, kita dapat menambahkan fitur-fitur baru yang belum tersedia di PHPMaker. Tidak itu saja, lebih detail dan teknis lagi, kita bisa mengubah atau menyesuaikan kode yang ada di file template PHPMaker, melalui pemakaian Extensions di dalam project PHPMaker.

Beruntunglah Anda yang selama ini sudah menggunakan Masino Extensions untuk PHPMaker 2020. Mengapa? Karena Masino Extensions sudah memikirkan hal ini sejak di beberapa versi major PHPMaker sebelumnya. Termasuk pada Masino Extensions untuk PHPMaker 2020. Sebagian besar file-file .css dan .js sudah otomatis ditambahkan versi.

Dengan cara ini, maka Pengguna Akhir aplikasi web Anda tidak perlu lagi diperintahkan untuk memuat ulang file-file .css dan/atau .js tadi, supaya dapat merasakan perubahan kode yang sudah Anda tambahkan ke dalamnya. Mereka akan langsung merasakan perubahan tersebut ketika mereka mengakses kembali aplikasi web tersebut.

Meskipun Masino Extensions sudah otomatis menambahkan versi file pada sebagian besar file-file .css dan .js yang digunakan oleh Aplikasi Web yang dihasilkan oleh PHPMaker, sekitar dua hari yang lalu saya baru menyadari, bahwa ada satu file .js yang belum menggunakan versi file.

File apa itu? File userevt.js yang berada di dalam sub-folder js di bawah root folder aplikasi web Anda. Hal ini baru saya sadari, ketika saya menambahkan kode Javascript ke dalam property Client side events yang terdapat di Fields setup -> panel Edit Tag. Setelah semua file script saya generate ulang, kenapa aplikasi web-nya seolah tidak mengenali kode yang sudah saya tambahkan tadi ya?

Sebagai informasi buat Anda, kode Javascript yang kita tambahkan dari property Client side events tadi, akan ditempatkan oleh PHPMaker 2020 ke dalam file js/userevt.js. Jadi, file ini sebaiknya harus otomatis bisa dimuat oleh sistem ketika Pengguna Akhir mengakses aplikasi web yang dihasilkan oleh PHPMaker. Tapi sayangnya PHPMaker belum menangani hal ini.

Kembali ke topik. Setelah saya cek ulang link ke file tersebut dari kode HTML aplikasi web yang bertalian, ternyata di sana belum ada versi file-nya. Itulah penyebab mengapa browser belum secara otomatis mengenali kode Javascript yang sudah saya tambahkan tadi.

Melihat kondisi ini, maka tanpa perlu berlama-lama lagi, langsung saya menyesuaikan kode yang terkait dari Masino Extensions untuk PHPMaker 2020. Lalu, setelah saya generate ulang semua file script seperti biasa, saya mencoba kembali dari Aplikasi Web yang dihasilkannya. Tarraaaaa! Sekarang saya dapat langsung merasakan perubahannya.

Itu artinya, sekarang Masino Extensions sudah otomatis menambahkan versi file userevt.js. Versi tersebut akan dibaca dari tanggal dan jam dari file tersebut terakhir diubah.

Dari contoh di atas, maka kode untuk file userevt.js tadi menjadi seperti berikut ini:

// User event handlers
ew.ready(ew.bundleIds, "js/userevt.js?v=1585293460", "load", function() {

	// Global startup script
	// Write your global startup script here
	// console.log("page loaded");

});

Sekarang, Pengguna Akhir tidak perlu lagi melakukan hard-refresh atau hard-reload dari browser, supaya dapat merasakan perubahan kode di file userevt.js tadi. Browser akan otomatis memuat file userevt.js tersebut ketika mengenali versi file yang terbaru. Sudah saatnya kita memanjakan Pengguna Akhir aplikasi web.

Bagi Anda yang sudah berlangganan di situs ILovePHPMaker.com, silahkan download ulang file Masino Extensions untuk PHPMaker 2020. Setelah di-download, extract file-file .zip dan .xml yang ada di dalamnya, lalu copy paste ke dalam sub-folder extensions yang terdapat di bawah folder instalasi PHPMaker 2020 Anda.

Setelah itu, pastikan Anda sudah men-generate ulang semua file script dari PHPMaker 2020. Biarkan sistem yang bekerja untuk Anda saat ini. Saat proses generate berlangsung, kita sebagai Web Developer masih sempat ambil minum, ke toilet, atau gerak badan sejenak. Coba, kurang enak apa lagi bekerja menggunakan PHPMaker dan Masino Extensions?

Anda sebagai Web Developer tidak perlu lagi pusing-pusing untuk mengatasi permasalahan sepele, tapi dampaknya cukup besar tadi. Semuanya sudah ditangani oleh Masino Extensions untuk PHPMaker 2020. Tinggal generate ulang, dan semuanya sudah otomatis menyesuaikan.

Hehe, masih bertahan dengan cara-cara manual atau konvensional dalam membuat Aplikasi Web? Hohoho… 😀

Mudahnya Mengubah Kode di Class ExportCSV dari PHPMaker 2020

$
0
0

Salah satu kelebihan dan fleksibilitas di PHPMaker adalah, adanya kemampuan untuk mengubah kode di class yang digunakan untuk mengekspor data ke file CSV. Artinya, kita dapat membuat class sendiri, berdasarkan class yang secara standar digunakan oleh PHPMaker.

Katakanlah kita ingin menghapus baris pertama data yang terdapat di file hasil Export to CSV, yang menampilkan nama-nama field. Cukup dengan menulis beberapa baris kode PHP berikut, dari bagian Global Code yang terdapat di bawah Server Events -> Global -> All Pages project PHPMaker Anda:

class MyExportCSV extends ExportCsv {
    // timpa kode di exportCaption dengan mengosongkannya
    public function exportCaption(&$fld) {}
    // timpa kode di endExportRow dengan kode berikut
    public function endExportRow($rowCnt = 0) 
    {
        if ($rowCnt != 0)
            $this->Line .= "\r\n";
        $this->Text .= $this->Line;
    }
}
// Ganti class standar ExportCsv dengan class buatan sendiri
Config('EXPORT_CLASSES.csv', 'MyExportCSV');

Dari kode di atas, kita dapat membuat class sendiri yang bernama MyExportCSV yang merupakan perluasan (extends) dari class ExportCsv.

Di dalam class yang baru ini, kita menimpa salah satu method exportCaption yang fungsinya mengekspor nama field atau caption, dengan tidak menulis kode apapun di dalamnya.

Selain itu, kita juga mengganti kode yang terdapat di method endExportRow, yang bertujuan untuk menghapus baris pertama yang kosong, sehingga data pertama akan berada di baris pertama. Jika kode di method ini tidak kita sesuaikan, maka data akan ditempatkan di baris kedua dan baris pertama menjadi kosong.

Terakhir, jangan lupa kita harus mengganti nama class yang digunakan untuk mengekspor data ke file CSV dengan nama class kita sendiri. PHPMaker sudah menyediakan fungsi global yang bernama Config(). Parameter pertama EXPORT_CLASSES.csv adalah tipe class CSV, sedangkan parameter kedua MyExportCSV adalah nama class yang kita buat tadi.

See? Betapa mudah dan cepatnya bukan? Bukan mudah dan cepat saja, tapi betapa fleksibelnya PHPMaker yang sudah menyediakan kemampuan untuk mengganti kode di class yang digunakan untuk mengekspor data ke file CSV.

Menampilkan Modal Dialog Saat Baris Tabel Diklik atau Dobel Klik di PHPMaker 2020

$
0
0

Entah sudah berapa banyak keuntungan yang kita peroleh ketika menggunakan PHPMaker untuk membangun Aplikasi Web. Selain fitur-fiturnya yang sangat lengkap, demikian juga fleksibilitas yang sangat tinggi.

Kita bisa menambahkan sedikit kode saja, untuk menampilkan fitur yang sebelumnya tidak pernah kita sangka bisa dilakukan dari PHPMaker.

Di artikel ini kita akan membahas bagaimana mudahnya menampilkan jendela Modal Dialog, ketika Pengguna Akhir mengklik atau melakukan dobel klik pada baris tabel yang terdapat di halaman List.

Sebelumnya, pastikan kita sudah mengaktifkan opsi Modal dialog masing-masing pada kelompok Edit Page maupun View Page yang terdapat di bawah Table setup dari project PHPMaker.

Setelah mengaktifkan kedua pengaturan itu, selanjutnya kita cukup menambahkan kode berikut dari bagian Startup Script yang terdapat di bawah lokasi: Client Scripts -> Table-Specific -> List Page pada project PHPMaker 2020:

<?php if (Security()->canEdit()) { // jangan lupa untuk security, jika akses bisa mengubah record ?>
	$(".table.ew-table tr").dblclick(function(e) { // event dobel klik untuk Edit Page
		// periksa saat kondisi apa saja event dobel klik tidak dieksekusi
		if (!$(e.target).hasClass('ew-preview-row-btn') && !$(e.target).hasClass('custom-control-label') && !$(e.target).hasClass('btn')) {
			var edit_modal = $(this).find("a.ew-row-link.ew-edit").attr("onclick"); // ambil sintax javascript modal dialog
			var edit_url = edit_modal.substring(edit_modal.lastIndexOf(":'") + 2, edit_modal.lastIndexOf("'")); // ambil url dari setiap baris tabel
			ew.modalDialogShow({lnk:this, url: edit_url, caption: '<?php echo Language()->phrase("Edit"); ?>', btn: 'SaveBtn'}); // tampilkan Edit Page dalam Modal Dialog
		}
	});

	$(document).on("preview", function(e, args) { // preview row 
		args.$tabpane.find("tr").dblclick(function (e) { // dobel klik
			// periksa saat kondisi apa saja event klik tidak dieksekusi
			if (!$(e.target).hasClass('btn') && !$(e.target).hasClass('ew-preview-row-btn') && !$(e.target).hasClass('custom-control-label')) {
				var edit_modal = $(this).find("a.ew-row-link.ew-edit").attr("onclick"); // ambil sintaks javascript modal dialog
				var edit_url = edit_modal.substring(edit_modal.lastIndexOf(":'") + 2, edit_modal.lastIndexOf("'")); // ambil url dari setiap baris tabel
				ew.modalDialogShow({lnk:this, url: edit_url, caption: '<?php echo Language()->phrase("Edit"); ?>', btn: 'SaveBtn'}); // tampilkan Edit Page dalam Modal Dialog
			}
		});
	});
<?php } ?>

<?php if (Security()->canView()) { // jangan lupa untuk security, jika akses bisa menampilkan satu record ?>
	$(".table.ew-table tr").click(function(e) { // event klik untuk View Page
		// periksa saat kondisi apa saja event klik tidak dieksekusi
		if (!$(e.target).hasClass('ew-preview-row-btn') && !$(e.target).hasClass('custom-control-label') && !$(e.target).hasClass('btn')) {
			var view_modal = $(this).find("a.ew-row-link.ew-view").attr("onclick"); // ambil sintaks javascript modal dialog 
			var view_url = view_modal.substring(view_modal.lastIndexOf(":'") + 2, view_modal.lastIndexOf("'")); // ambil url dari setiap baris tabel
			ew.modalDialogShow({lnk:this, url: view_url, caption: '<?php echo Language()->phrase("View"); ?>', btn: null}); // tampilkan View Page dalam Modal Dialog
		}
	});

	$(document).on("preview", function(e, args) { // preview row 
		args.$tabpane.find("tr").click(function (e) { // singel klik
			// periksa saat kondisi apa saja event klik tidak dieksekusi
			if (!$(e.target).hasClass('btn') && !$(e.target).hasClass('ew-preview-row-btn') && !$(e.target).hasClass('custom-control-label')) {
				var view_modal = $(this).find("a.ew-row-link.ew-view").attr("onclick"); // ambil sintaks javascript modal dialog
				var view_url = view_modal.substring(view_modal.lastIndexOf(":'") + 2, view_modal.lastIndexOf("'")); // ambil url dari setiap baris tabel
				ew.modalDialogShow({lnk:this, url: view_url, caption: '<?php echo Language()->phrase("View"); ?>', btn: null}); // tampilkan View Page dalam Modal Dialog
			}
		});
	});
<?php } ?>

Sekarang, mari kita bahas kode di atas.

Secara garis besar, kode di atas terbagi dua. Pertama untuk menangani event dblclick atau dobel klik, dan yang Kedua untuk menangani event click atau single klik.

Kita harus menangani beberapa kemungkinan berikut supaya kode untuk menampilkan jendela Modal Dialog tersebut tidak dieksekusi:

1. Jika control Checkbox ditampilkan di kolom pertama pada tabel di halaman List. Control ini akan ditampilkan jika pilihan Selected records untuk Export dipilih dari lokasi PHP -> Page Options (Global) -> Export -> Export type pada project PHPMaker 2020.

Selain itu, control Checkbox akan ditampilkan, jika kita menulis kode di server event Row_CustomAction dan Page_Load dengan kondisi multiple records.

Selengkapnya baca artikel saya berjudul Cara Menampilkan Checkbox di Setiap Record pada Halaman List dari PHPMaker,

2. Jika fitur Master/Detail diaktifkan, sehingga sistem akan menampilkan icon plus kecil di sebelah kiri dari setiap baris (+) untuk meng-expand, termasuk tombol minus kecil (-) untuk meng-collpase area tabel Detail,

3. Jika pilihan Use button dropdown for links diaktikfan dari lokasi PHP -> Page Options (Global) project PHPMaker 2020, sehingga di setiap baris tabel memiliki tombol Dropdown yang menampilkan menu-menu seperti View, Edit, Copy, Master/Detail, dan sebagainya.

Artinya, selain dari ketiga kondisi tadi, maka kita boleh mengeksekusi kode yang untuk menampilkan jendela Modal Dialog tersebut.

Jika beberapa kondisi tadi tidak ditangani, maka ketika Pengguna Akhir memberi tanda centang pada Checkbox, atau mengklik icon plus kecil atau minus kecil, atau mengklik tombol Dropdown, maka kode untuk menampilkan jendela Modal Dialog tadi akan dieksekusi.

Supaya fitur ini efektif dijalankan di Aplikasi Web kita, maka disarankan supaya kita tidak mengaktifkan opsi Use button dropdown for links dari lokasi berikut: PHP -> Page Options (Global) project PHPMaker 2020.

O iya, sebelumnya saya sudah share mengenai fleksibilitas PHPMaker ini, melalui Forum Diskusi PHPMaker, dengan topik berjudul How to Display ViewPage in Modal Dialog on Row Click (v2019).

Mudahnya Menangani Data Secara Hirarki Menggunakan PHPMaker 2020

$
0
0

Ada yang pernah mengalami kesulitan untuk mengimplementasikan pengolahan data secara hirarki? Buat yang belum tahu apa yang dimaksud pengolahan data secara hirarki, dapat membaca referensi berikut:

What are the options for storing hierarchical data in a relational database?
Models for Hierarchical Data with SQL and PHP —> lihat slide ke-69 yang berjudul Choosing the Right Design
The simplest(?) way to do tree-based queries in SQL

Setelah Anda membaca ketiga referensi tadi, maka kita bisa menyimpulkan bahwa cara yang paling efektif dan efisien adalah dengan menggunakan model Closure Table atau sering dikenal dengan istilah Bridge Table.

Sebagai Developer, sebenarnya kita sudah pernah mengimplementasikan data hirarki ini. Misalnya, kita mengelompokkan data berdasarkan Kategori. Nah, itu salah satu bentuk dari pengolahan data secara hirarki. Biasanya kita membuat field Kategori di tabel yang terkait.

Jika hanya satu level Kategori saja, tentu tidak masalah menggunakan cara itu. Permasalahan akan timbul ketika kita harus mengelola data Kategori yang tingkat kedalamannya bisa lebih dari satu, dua, atau tiga level. Kita akan mengalami kesulitan saat membuat Query ke Database.

Model seperti itu disebut dengan Adjacency List, dan ini adalah model yang paling umum dan paling sering kita gunakan selama ini. Disadari atau tidak. Untuk mengatasi permasalahan yang sering timbul di model ini, maka kita disarankan untuk menggunakan model Closure Table.

Model Closure Table menggunakan dua Table di Database. Table pertama untuk menyimpan data utama berupa Node (contoh: Komentar). Table kedua untuk menyimpan path atau lokasi atau relasi antar Node (biasanya disebut dengan Treepaths).

Dari sekian banyaknya model yang digunakan untuk mengelola data secara hirarki, model Closure Table memiliki paling banyak kelebihan dibandingkan model lainnya. Apa saja itu?

Query Child, mudah membuat Query untuk mencari Node tertentu yang berperan sebagai Child,
Query Subtree, mudah membuat Query untuk menampilkan beberapa Node Child secara hirarki berdasarkan Node Parent-nya,
Delete Node, mudah membuat Query untuk menghapus salah satu Node beserta seluruh Node di bawahnya (jika ada),
Insert Node, mudah membuat Query untuk menambahkan Node yang baru beserta seluruh relasi ke Node terkait lainnya,
Move Subtree, mudah membuat Query untuk memindahkan satu Node beserta seluruh Node yang berada di bawahnya (jika ada),
Referential Integrity, memiliki aturan untuk memastikan sebuah Node memiliki relasi ke Node lainnya, atau jika hanya ada satu Node, minimal untuk relasi ke dirinya sendiri.

Sebenarnya masih banyak artikel-artikel di luar sana yang membahas mengenai model atau cara/teknik untuk menangani data secara hirarki menggunakan Closure Table. Tapi sayangnya, dari semua artikel-artikel tersebut, hampir semuanya, atau bisa dikatakan, nyaris semuanya tidak ada menyediakan contoh aplikasi web yang mewakili beberapa operasi yang umum digunakan, seperti CRUD.

Semuanya hanya menampilkan contoh-contoh yang tidak lengkap. Kebanyakan hanya membahas bagaimana sintaks SQL untuk menambah, mengubah, memindahkan, atau menghapus data saja. Tapi tidak ada satupun yang menampilkan contoh nyata yang mengimplementasikan model Closure Table tadi.

Misalnya, bagaimana cara menampilkannya di halaman web sesuai urutan hirarkinya? Bagaimaana cara menyimpan data jika sebuah Node ditambah atau disisipkan di tengah-tengah? Bagaimana cara memindahkan sebuah Node (beserta semua Node yang berada di bawahnya, jika ada)? Bagaimana cara menjadikan sebuah Node menjadi Node Induk yang baru? Bagaimana cara menghapus sebuah Node (beserta semua Node yang berada di bawahnya, jika ada)?

Beruntunglah Anda jika menggunakan tools PHPMaker untuk membangun Aplikasi Web. Mengapa? Karena penanganan data secara hirarki ini dapat dihasilkan dengan sangat mudah dan cepat. Bahkan, kita cukup hanya menambahkan sedikit kode saja melalui beberapa server event. Selebihnya ditangani oleh PHPMaker.

Jadi, tidak perlu membuat Aplikasi Web dari awal. Kita hanya perlu fokus untuk mengimplementasikan logic untuk membaca dan menampilkan data secara hirarki, termasuk logic untuk menyimpan data yang bisa terdiri dari beberapa record sekaligus menggunakan model Closure Table.

Sebagai informasi tambahan, sebenarnya salah satu model lainnya yang bernama Nested Sets, sudah pernah saya implementasikan untuk menampilkan Breadcrumb Links di Aplikasi Web yang dihasilkan oleh Masino Extensions untuk PHPMaker. Model Nested Sets ini memang cocok digunakan untuk menampilkan Breadcrumb Links, apalagi lewat Stored Procedures.

Tapi sayangnya, model Nested Sets tidak cocok untuk digunakan dalam mengolah data Komentar. Mengapa? Karena di model ini hanya memiliki satu node yang berperan sebagai Top Parent (Node yang posisinya berada paling atas).

Sedangkan model Closure Table memiliki potensi yang sangat besar untuk dikembangkan, sehingga memungkinkan untuk membuat logic menyimpan lebih dari satu Node yang posisinya berada paling atas. Contoh sederhananya adalah pengelolaan data Komentar.

Oke, kita kembali ke topik. Supaya tidak penasaran seperti apa sih pengelolaan data secara hirarki menggunakan model Closure Table, model baru di samping model Nested Sets pada Aplikasi Web yang dihasilkan oleh PHPMaker 2020, silahkan klik di sini.

Dari demo tersebut, kita dapat menambah, memindahkan, menghapus, dan menampilkan data Komentar (Comments) secara hirarki menggunakan model Closure Table. Oleh karena itu, demo Aplikasi Web ini saya namakan dengan Closure Comment.

Banyak hal yang bisa Anda pelajari mengenai model Closure Table melalui file project PHPMaker dan file Database-nya. Semuanya diawali dengan dua buah kata yaitu: Betapa mudahnya … :

  1. Merancang Tables dan juga Database Views yang digunakan,
  2. Membaca data secara hirarki dan menampilkannya lewat kode HTML dan Custom File di project PHPMaker,
  3. Membuat function yang dapat memanggil dirinya sendiri (recursive function) di PHP untuk menampilkan data secara hirarki,
  4. Mengolah data yang terdiri dari beberapa record sekaligus saat sebuah Komentar Baru disimpan,
  5. Menjadikan beberapa Komentar sebagai Komentar Induk (jadi, tidak hanya satu Komentar saja yang dapat berperan sebagai Induk),
  6. Mengolah data yang terdiri dari beberapa record saat sebuah Komentar dibalas (Reply)
  7. Memindahkan sebuah Komentar (beserta seluruh Komentar yang berada di bawahnya; jika ada) ke bawah parent/induk Komentar lainnya yang berada di atasnya,
  8. Memindahkan sebuah Komentar (beserta seluruh Komentar yang berada di bawahnya; jika ada) menjadi sebuah Komentar Induk yang Baru,
  9. Menghapus sebuah Komentar (beserta seluruh Komentar yang berada di bawahnya; jika ada),
  10. Membuat logic untuk memperbarui tingkat kedalaman beberapa Komentar sekaligus jika suatu Komentar dipindahkan atau dihapus,
  11. Mengetahui Komentar-komentar mana saja yang berada di bawah dari sebuah Komentar yang posisinya berada di atas levelnya,
  12. Mencari data Ancestor (Induk/Parent) berdasarkan data Descendant (Anak/Child) tertentu.
  13. Mencari data Descendant (Anak/Child) berdasarkan data Ancestor (Induk/Parent) tertentu.
  14. Mengetahui Komentar-komentar mana saja yang posisinya berada paling atas (Top Parent Comment),
  15. Menampilkan jendela Modal Dialog berisi form untuk memindahkan atau menghapus Komentar yang terdapat di Tables lain melalui halaman Custom Files,
  16. Menggunakan Custom Field yang menampilkan berisi pilihan Komentar untuk membantu proses pemindahan Komentar,
  17. Membuat logic untuk menyaring (filter) Komentar-komentar mana saja yang dapat dipilih sebagai Komentar tujuan di Custom Field,
  18. Mencegah Pengguna Akhir untuk membuka form Edit yang berusaha ingin memindahkan Komentar paling atas,
  19. Mengoptimalkan penggunaan Database View yang dapat digunakan untuk memisahkan proses yang berbeda,
  20. Membuat dua business-logic yang berbeda untuk menambahkan Komentar dalam sebuah object Database View; satu untuk menambah Komentar Baru, dan yang satunya lagi untuk menambah/membalas (Reply) Komentar yang sudah ada,
  21. Membuat logic untuk menampilkan atau menyembunyikan Custom Field di form berdasarkan kondisi tertentu,
  22. Dan masih banyak lagi …

Satu lagi bukti bahwa PHPMaker dapat mengatasi hal-hal yang sebelumnya sama sekali tidak kita duga apakah dapat dilakukan lewat PHPMaker. Jangan lupa, kunjungi Demo of Closure Table via Web Application that Generated by PHPMaker 2020.

Mudahnya Menyembunyikan Tab di Preview Row dari PHPMaker 2020

$
0
0

Sejak versi 2018, PHPMaker memperkenalkan sebuah server event baru yang bernama ListOptions_Rendering. Sesuai dengan namanya, server event ini berfungsi untuk menjalankan kode saat Options di setiap baris atau row di tabel halaman List sedang di-Render atau Rendering.

Hari ini, salah satu aplikasi web yang saya buat dengan PHPMaker memiliki business-logic untuk menyembunyikan elemen Tab pertama ketika bagian Preview Row ditampilkan, dengan cara mengklik tombol plus kecil (+) di sebelah kiri dari datanya.

Supaya tidak bingung, mari kita simak contoh nyatanya berikut ini.

Saya membuat relasi Master/Detail antara satu table Master dengan dua table Detail. Table Master bernama userlevels (Level Pengguna), sedangkan table Detail masing-masing bernama dan users (Pengguna) dan table/view pendaftaran_pengguna (Pendaftaran Pengguna).

Meskipun relasi Master/Detail sudah dibuat di antara ketiga table tadi, saya tidak ingin memberikan permission sama sekali table users kepada level pengguna apapun (kecuali untuk Administrator dengan level pengguna -1).

Dalam hal ini, saya hanya ingin memberikan permission kepada table/view Pendaftaran Pengguna. Jadi, diharapkan hanya ada 1 Tab saja yang ditampilkan di bagian Preview Row.

Sayangnya, sampai dengan PHPMaker 2020 ini, sistem akan tetap menampilkan Tab yang berisi table Pengguna di atas tadi, dan di bagian bawahnya akan muncul pesan yang isinya kira-kira berbunyi Anda tidak memiliki ijin untuk mengakses table ini. Jadi, dalam hal ini ada 2 Tab yang ditampilkan beserta Tab yang berisi table/view Pendaftaran Pengguna.

Tentu saja kondisi ini tidak kita harapkan, bukan? Seharusnya, jika Tab yang berisi table yang permission List-nya tidak pernah kita berikan, maka sistem tidak akan pernah juga menampilkan sama sekali Tab berisi table Pengguna tadi. Jadi, cukup hanya Tab Pendaftaran Pengguna saja yang ditampilkan.

Bukan PHPMaker namanya, jika kita sebagai Web Developer tidak dapat mengatasi permasalahan tersebut. Di sinilah server event ListOptions_Rendering dibutuhkan.

Saya cukup hanya menambahkan satu baris kode saja ke dalam server event ListOptions_Rendering yang terdapat di lokasi ini: Server Events -> Table-Specific -> List Page untuk menyembunyikan Tab yang memuat table users atau Pengguna tadi:

	$this->DetailPages->Items["users"]->Visible = FALSE;

Perhatikanlah kode tersebut. Kita cukup mengoptimalkan object DetailPages yang menangani element Tab. Object ini memiliki property Items yang merupakan array object. Kita menyertakan nama table users, kemudian kita menugaskan nilai FALSE ke property Visible milik object tadi untuk menyembunyikan Tab tersebut.

Wow! Hanya dengan satu baris kode itu saja, kita sudah bisa menyembunyikan Tab tertentu sesuai dengan business-logic yang kita tentukan dari dalam project PHPMaker. Selanjutnya, cukup generate ulang semua file script, maka PHPMaker akan menerapkannya di Aplikasi Web yang kita buat.

Biarkan PHPMaker yang menangani sisanya. Kita cukup fokus untuk menerapkan business-logic dan business-process ke dalam Aplikasi Web kita. Hidup pun menjadi lebih menyenangkan. Tidak perlu lagi stress memikirkan bagaimana cara menulis coding yang mungkin bisa berpuluh-puluh atau beratus-ratus baris panjangnya jika masih membuat Aplikasi Web dengan cara-cara manual atau konvensional.

Hohoho…! PHPMaker gitu, lho…! 😀


Ternyata Menggemaskan Juga Saat Menunggu Detik-Detik PHPMaker 2021 Dirilis

$
0
0

Hari Sabtu, 25 Juli 2020 yang lalu, Team Developer aplikasi PHPMaker merilis System Requirements Update. Ini adalah informasi awal bagi Web Developer untuk mempersiapkan spesifikasi teknis untuk lingkungan development dan production, supaya kelak dapat menggunakan PHPMaker 2021.

Pada saat saya membaca post berisi pengumuman kebutuhan sistem untuk update tadi, rasanya senang sekali. Perkiraan saya saat itu, berarti hari Senin, 27 Juli 2020 lusa, PHPMaker 2021 akan segera dirilis. Ternyata perkiraan saya itu meleset. Sepanjang satu hari itu saya menanti-nanti pengumuman dirilisnya PHPMaker 2021, tak kunjung datang juga. Sedikit kecewa memang, tapi tetap harus saya sabarkan diri ini.

Seminggu berikutnya saya tunggu lagi, tidak juga dirilis. Dua minggu beberapa hari kemudian sampai dengan hari ini, Selasa, 11 Agustus 2020, PHPMaker 2021 belum juga dirilis. Padahal kalau melihat 2 versi major berturut-turut sebelumnya, yaitu PHPMaker 2019 dan PHPMaker 2020, keduanya dirilis masing-masing pada tanggal 25 Juli 2018 dan 6 Agustus 2019 .

Sampai akhirnya timbul pertanyaan dalam hati: Secanggih apa sih fitur-fitur yang akan ditambahkan di PHPMaker 2021 ini? Sudah lewat tanggal 6 Agustus 2020, belum juga dirilis. Apakah itu artinya Team Developer PHPMaker membutuhkan waktu lebih lama dari perkiraan mereka jika melihat 2 versi major sebelumnya?

Akhirnya, saya buka-buka kembali beberapa topik di bagian Feature Requests (PHPMaker). Ada 2 topik yang berisi request dengan vote relatif banyak, yaitu:

Form Layouts (27 votes)
Push notifications / web notifications (21 votes)

Masih bertanya-tanya dalam hati, apakah kedua feature requests ini akan mereka tambahkan ke dalam PHPMaker 2021? Setiap hari menimbulkan pertanyaan, dan semakin menambah rasa penasaran untuk menunggu jawabannya. Cukup menggemaskan saat menunggu beberapa hari terakhir ini. Sudah tidak sabar rasanya ingin “mencicipi” fitur-fitur baru yang ditambahkan di versi 2021 ini.

Sambil menunggu dirilisnya PHPMaker 2021, paling tidak saya juga masih mempunyai waktu, untuk mempersiapkan theme aplikasi apa sebaiknya yang akan saya implementasikan di Masino Extensions for PHPMaker 2021. Yang jelas, theme-nya diusahakan sedapat mungkin untuk memakai teknologi terbaru, seperti Bootstrap 4.5.x (versi terakhir ketika artikel ini saya tulis) dan jQuery versi terakhir (seperti biasa, PHPMaker pun selalu menggunakan versi terakhir dari kedua library Javascript ini).

Hehehe, penasaran juga kan? Ternyata bukan PHPMaker 2021 saja yang membuat penasaran. Tetapi juga Masino Extensions for PHPMaker 2021. Baiklah kalau begitu. Kita tunggu saja bersama-sama ya, PHPMaker 2021 akan segera dirilis dalam beberapa hari ke depan.

Yang jelas, tidak mungkin molornya sampai satu tahun kemudian atau tahun depan, hahahaha… kalau itu yang terjadi, kebangetan memang itu Team Developer PHPMaker. Memangnya mereka tidak ingin produknya dibeli segera, apa? 😀

Extension MasinoCalendarScheduler16 Kini Menggunakan FullCalendar Versi Terbaru

$
0
0

Selamat bagi Anda yang sudah menjadi Member di situs ILovePHPMaker.com. Sekarang Anda sudah bisa menggunakan Extension MasinoCalendarScheduler16 versi terbaru. Ini adalah salah satu dari beberapa Masino Extensions yang saya buat untuk PHPMaker 2020 (dan akan tetap dipertahankan nantinya di PHPMaker 2021).

Akhirnya, berhasil juga saya memperbaruinya ke FullCalendar versi 5.3.0 (versi stabil terakhir saat artikel ini saya tulis). Membutuhkan kurang lebih dua hari dan fokus untuk meng-upgrade-nya dari FullCalendar versi 3 ke versi 5. Ini juga salah satu alasan kuat mengapa Anda harus menggunakan Masino Extensions untuk PHPMaker, karena selalu diperbarui ke versi terakhir.

Dengan menggunakan Extension MasinoCalendarScheduler16 ini, maka Anda tidak perlu lagi repot-repot membuat modul pengolahan data (CRUD) di sebuah Kalender dari awal. Anda cukup hanya mengaktifkan Extension ini dari dalam project PHPMaker 2020 Anda, lalu mengatur beberapa setting dari sisi Extension sesuai kebutuhan, dan men-generate ulang semua file script menggunakan PHPMaker 2020 seperti biasa.

Melalui Kalender yang sudah dihasilkan di Aplikasi Web, maka Anda dapat menambah data Event atau Kegiatan dengan sangat mudah. Cukup klik di salah satu tanggal, atau bahkan Anda dapat memilih beberapa tanggal sekaligus dengan cara mengklik terlebih dulu di tanggal awal, lalu seret kursor mouse sampai ke posisi tanggal akhir. Selanjutnya sistem akan menampilkan form Modal untuk menambah data Event, dengan tanggal awal dan tanggal akhir yang otomatis terisi. Waktu untuk menginput data Event pun bisa lebih dihemat dengan cara tersebut.

Demikian juga jika ingin melihat informasi lebih lanjut dari sebuah Event, cukup mudah dilakukan. Cukup klik sekali saja Event tersebut melalui antarmuka Kalender. Sistem akan menampilkan informasi lengkap Event tersebut pada form Modal, dan semua control di form View tadi dalam keadaan read-only. Jika ingin mengubah data Event tadi, maka cukup tekan tombol Ubah, selanjutnya form akan berubah ke mode Ubah/Edit, di mana control yang tadinya read-only menjadi siap untuk digunakan.

Atau bahkan jika Anda ingin menghapus data Event tersebut, tinggal beri tanda centang pada Checkbox yang bertuliskan Hapus pada saat form dalam mode Ubah/Edit. Lalu tekan tombol Hapus, maka sistem akan menampilkan pesan konfirmasi yang berisi pertanyaan apakah Anda yakin akan menghapus Event tadi. Anda juga bisa menghapus hanya satu Event saja, atau bahkan bisa menghapus beberapa Event sekaligus, jika tipe Event tadi adalah berulang (Repeated Events).

O iya, barusan saya menyebut istilah Repeated Events. Event ini akan ditampilkan secara berulang di dalam Kalender. Misalnya, Anda dapat menambah sebuah Event, yang akan diulang; apakah setiap hari, setiap minggu, setiap bulan, atau bahkan setiap tahun; dilengkapi juga dengan parameter yang dapat Anda tentukan berapa kali perulangan akan dilakukan. Setelah itu, bagian back-end Kalender akan menangani penyimpanan datanya ke Database.

Tidak itu saja fitur-fiturnya. Anda bahkan dapat mengubah atau menyesuaikan ulang tanggal dari suatu Event, dengan berinteraksi secara langsung dengan komponen Kalender di sisi antarmuka Aplikasi Web. Cukup seret dan jatuhkan (drag and drop) suatu Event ke tanggal yang Anda inginkan, maka di sisi back-end Kalender akan otomatis menyesuaikan ke tanggal baru tadi. Tidak hanya untuk satu Event tunggal, tapi untuk Event yang terjadi di beberapa hari sekaligus.

Masih ada lagi kemudahan yang disediakan oleh FullCalendar. Anda dapat memperluas atau mengubah hanya tanggal akhirnya saja. Syaratnya, data jam pada tanggal terakhir harus diset ke 00:00:00. Cukup geser kursor mouse Anda ke ujung paling kanan dari antarmuka Event tersebut. Selanjutnya icon kursor mouse akan berubah menjadi panah kanan, lalu seret bagian ujung paling kanan tersebut ke posisi tanggal akhir yang Anda inginkan di Kalender.

Eit, masih ada fitur-fitur hebat lainnya yang tersedia di FullCalendar. Kita bisa berpindah mode, dari tampilan Month (seperti kalender per bulan pada umumnya), atau Mingguan, atau Harian (seperti catatan di Agenda), atau bahkan Tahunan. Tersedia juga tombol browse untuk maju atau mundur, sesuai dengan mode atau tampilan yang sedang aktif. Bahkan, ada tombol browse untuk berpindah tahun. Yang lebih mengagumkan lagi adalah, kita dapat menambah, menampilkan, mengubah, dan menghapus Event dari setiap mode tadi. Wow, keren kan?

Sangat menarik memang fitur-fitur yang tersedia di FullCalendar. Sayang jika tidak dioptimalkan di aplikasi web kita, apalagi jika menggunakan PHPMaker untuk menghasilkan aplikasi web tersebut. Perlu diingat, bahwa FullCalendar hanya menyediakan sisi front-end-nya saja, mereka belum menyediakan code di sisi back-end. Nah, untuk bagian back-end sudah ditangani sekarang oleh Extension MasinoCalendarScheduler16.

Kembali ke FullCalendar 5. Ada beberapa perubahan major di FullCalendar versi terakhir ini. Di samping untuk meningkatkan peformansi, juga untuk mengatasi isu penggunaan jQuery yang sangat cepat berubah versinya. FullCalendar sudah tidak lagi menggunakan atau tergantung kepada jQuery. Tentu saja ada alasan khusus mengapa langkah ini ditempuh oleh si developer FullCalendar.

Dengan perubahan ini, sekaligus menyebabkan performansi FullCalendar pun menjadi jauh lebih baik, dan aksesnya menjadi lebih cepat dibandingkan dengan versi-versi sebelumnya. Selengkapnya mengenai perubahan tersebut, bisa Anda lihat di sini.

Saya jadi teringat dengan feedback dari salah seorang member di ILovePHPMaker.com yang mengalami error saat mencoba menambahkan data Event baru dengan menggunakan mode atau tampilan Week (bukan Month). Usut punya usut, sepertinya karena di FullCalendar versi 4 dan versi sebelumnya masih menggunakan jQuery lama, sementara di PHPMaker sudah menggunakan versi terbaru. Tentu saja ini salah satu isu yang cukup besar.

Itulah mungkin salah satu alasan developer FullCalendar tidak lagi menggunakan atau tergantung kepada file jQuery. Untuk mengatasi isu utama tersebut, maka jQuery tidak lagi digunakan di dalam library Javascript FullCalendar. Jadi, di FullCalendar versi 5 ini, mereka sudah kembali menggunakan sintaks Javascript versi klasik. Kadang-kadang, keputusan ini harus diambil demi mengutamakan performansi dan kehandalan suatu library Javascript.

FullCalendar 5 juga sudah tidak lagi tergantung dengan file Moment.js, meskipun kita masih bisa tetap menggunakannya, apalagi PHPMaker 2020 masih tetap menggunakan Moment.js. Termasuk di Extension MasinoCalendarScheduler16 ini, saya masih tetap menggunakan Moment.js, mengikuti framework yang masih digunakan oleh PHPMaker 2020.

Adapun perubahan selengkapnya yang saya lakukan di Extension MasinoCalendarScheduler16 adalah sebagai berikut:

  1. Bye bye FullCalendar 3 (baru sadar saya masih menggunakan versi yang lama ini, duh!), and Welcome FullCalendar 5! Lebih tepatnya, FullCalendar versi 5.3.0 (versi stabil terakhir saat saya memperbarui Extension saya tersebut).
  2. Menyesuaikan beberapa property dan method yang sudah tidak bisa digunakan lagi di FullCalendar versi 5; tentu saja supaya kompatibel dengan versi 5. Terima kasih kepada dokumentasi FullCalendar versi 5 yang cukup membantu proses ini.
  3. Memperbaiki error saat menambahkan event baru pada Kalendar mode Week (mingguan). Sebenarnya tidak secara khusus diperbaiki, cukup dengan menggunakan FullCalendar 5, maka isu error tadi hilang dengan sendirinya. Untungnya error ini tidak terjadi pada Calendar mode Month (bulanan).
  4. Mengubah mode control/element pada form/modal View saat menampilkan data Event yang diklik dari Kalender, dimana sebelumnya warna latar belakang control Textbox adalah putih, menjadi warna yang mewakilik control yang sedang dalam keadaan non-aktif disabled.
  5. Menyesuaikan id milik control element di 3 form (View, Add, dan Edit) sehingga tidak sama. Jika tidak, maka browser akan menampilkan pesan warning yang menyatakan bahwa ada beberapa control/element di Form yang memiliki id yang sama. Duh, seharusnya ini sejak awal saya lakukan, hehehe…
  6. Menyesuaikan link ke file Javascript dan CSS ke versi terbaru, dengan menggunakan nama folder yang sesuai dengan versinya.
  7. Memastikan semua fungsi di Kalendar berjalan sebagaimana mestinya, seperti CRUD, drag-and-drop Event, sampai dengan proses back-end, yaitu penyimpanan data ke Database.

Satu lagi improvement yang cukup signifikan telah dilakukan oleh pengembang FullCalendar ini, dengan menghilangkan ketergantungan terhadap file jQuery dan Moment.js. Keputusan tepat di waktu yang tepat.

Selain itu, penyesuaian Extension MasinoCalendarScheduler16 ini bisa saya lakukan menjelang PHPMaker versi 2021 dirilis. Untungnya, masih sempat saya update untuk Masino Extensions for PHPMaker 2020. Semoga juga bisa cepat disesuaikan nantinya jika PHPMaker 2021 sudah dirilis.

O iya seperti biasa… kurang pas rasanya jika tidak mencicipi demonya. Silahkan klik di sini untuk melihat FullCalendar versi 5 in action di Web Aplikasi yang dihasilkan oleh PHPMaker 2020.

Cihuuuyyyy … PHPMaker 2021 Sudah Dirilis

$
0
0

Penantian panjang itu akhirnya berakhir juga. Hari ini, Senin, 7 September 2020, PHPMaker versi 2021 resmi dirilis. Barusan saya langsung purchase upgrade License-nya. Sambil menunggu License Key diproses, langsung download dan install, termasuk file project demonya.

O iya, hati-hati saat menjalankan script demo2021.sql dari demo project, yang berisi perintah untuk membentuk table dan data di database. Mengapa saya ingatkan demikian, karena di versi-versi sebelumnya, script .sql ini hanya untuk membangkitkan table dan data. Sedangkan di versi 2021 ini, script .sql tadi juga berisi perintah untuk membuat database baru bernama demo2021.

Selain itu, di dalam script demo2021.sql ini, ada 2 lokasi yang menggunakan COLLATE = utf8mb4_0900_ai_ci. Hal ini menimbulka error jika di database MySQL kita belum mendukung COLLATE tersebut. Oleh karena itu, jika saat Anda menjalankan script .sql tersebut mengalami error, tinggal ganti saja utf8mb4_0900_ai_ci menjadi utf8mb4_general_ci.

Oke itu dulu untuk script .sql, yang tadi sempat menimbulkan hambatan kecil ketika akan membentuk table dan data di database demo2021 yang biasanya selalu saya create terlebih dulu. Sekarang mari kita bedah satu per satu, apa saja yang baru di versi 2021 ini.

Seperti biasanya Saudara-saudara… ada perubahan besar di versi major yang baru ini. Tidak seperti di versi-versi major sebelumnya, di versi 2021 ini, PHPMaker resmi sudah menggunakan PHP Framework. Bukan Laravel, bukan Yii, bukan CodeIgniter, bukan CakePHP, tetapi yang dipilih adalah Slim Framework.

Tentu saja ada pertimbangan mengapa PHPMaker memilih untuk menggunakan Slim Framework. Sekilas dari dokumentasi yang saya baca melalui link di atas, Slim Framework meyakinkan kita bahwa framework mereka memang tidaklah sama dengan PHP Framework lainnya, seperti Symfony atau Laravel.

Berikut ini cuplikan dari dokumentasi di website-nya, dan sepertinya PHPMaker sengaja menggunakan Slim Framework karena kelebihan yang dimiliki oleh framework ini berbeda jauh dengan PHP Framework lainnya yang sudah banyak beredar di Internet:

Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs. At its core, Slim is a dispatcher that receives an HTTP request, invokes an appropriate callback routine, and returns an HTTP response. That’s it.

Slim is an ideal tool to create APIs that consume, repurpose, or publish data. Slim is also a great tool for rapid prototyping. Heck, you can even build full-featured web applications with user interfaces. More importantly, Slim is super fast and has very little code. In fact, you can read and understand its source code in only an afternoon!

You don’t always need a kitchen-sink solution like Symfony or Laravel. These are great tools, for sure. But they are often overkill. Instead, Slim provides only a minimal set of tools that do what you need and nothing else.

Slim adalah framework kecil PHP untuk membantu Anda dengan cepat menulis aplikasi web dan API yang sederhana tapi memiliki kemampuan yang luar biasa. Pada bagian intinya, Slim adalah sebuah operator yang menerima sebuah permintaan HTTP, memanggil balikan fungsi yang sesuai, dan mengembalikan dalam bentuk respon HTTP. Itu saja.

Perhatikan di alinea terakhir pada cuplikan tersebut. Diakui bahwa Symfony atau Laravel memang bagus, tapi sering kali PHP Framework seperti itu dianggap terlalu berlebihan dan tidak selalu cocok digunakan, khususnya untuk PHPMaker. Slim Framework, seperti namanya, berbeda jauh. Dia ramping, hanya menyediakan sekumpulan perangkat yang minimal yang hanya dibutuhkan oleh PHPMaker.

Jadi sekali lagi, Slim Framework fokus pada operator yang bertugas untuk menerima permintaan HTTP, memanggil rutinitas panggilan balik yang sesuai, dan mengembalikan sebuah respon HTTP. Ya, hanya itu saja. Begitulah core dari Slim Framework. Urusan lainnya, tentu saja sudah ditangani oleh PHPMaker itu sendiri.

Dengan menggunakan PHP Framework, itu artinya mulai PHPMaker 2021 sudah menggunakan 100% konsep MVC (Model-View-Controller). File-file script yang di-generate tidak lagi ditempatkan di bawah root dari folder aplikasi web. Tetapi sekarang ditempatkan masing-masing ke dalam tiga sub-folder models, views, dan controllers.

Seiring dengan perubahan ini, maka mulai versi 2021 ini, aplikasi web yang dihasilkan oleh PHPMaker sudah menggunakan URL yang SEO-Friendly. Itu artinya, kita wajib mengaktifkan rewrite_module di web server yang kita gunakan. Jadi, kalau misalnya dulu menggunakan URL seperti modelsview.php?ID=1, maka sekarang menggunakan modelsview/1. Bahkan, PHPMaker juga menangani jika Primary Key terdiri dari beberapa field! Wow, keren ya?

Fitur tersebut sekaligus menjawab beberapa permintaan di bagian Feature Requests yang menginginkan supaya URL yang dihasilkan oleh aplikasi web yang dibangkitkan oleh PHPMaker menjadi SEO-Friendly. Terjawab sudah. Satu lagi nilai plus yang diberikan oleh PHPMaker.

Fitur baru lainnya yang tak kalah canggih di versi 2021 ini adalah penggunaan component Select2 yang menggantikan control jadul Select atau Combobox yang biasa. Pertama kali waktu ingin mencoba fitur ini, saya sedikit mencari-cari settingan Select2 di Fields setup. Ternyata memang tidak ada opsi yang bernama Select2.

Sebagai solusinya, ternyata kita harus mengaktifkan pilihan Requires search yang terdapat pada panel Edit Tag di dalam Fields setup. Jika pilihan ini tidak kita aktifkan, maka PHPMaker akan men-generate control Select yang jadul atau yang biasa selama ini digunakan. Akhirnya, fitur yang dulu saya usulkan, dikabulkan juga di versi 2021. Senang rasanya.

Tapi,sayangnya, di versi 2021 ini, PHPMaker belum mengabulkan permintaan yang cukup banyak peminatnya, yaitu Form Layout. Cukup kecewa juga saya, karena fitur ini seharusnya sudah bisa mereka tambahkan di versi 2021 ini. Mungkin, karena perubahan besar yang mereka lakukan dengan menggunakan Slim Framework tersebut, membuat fitur Form Layout ini menjadi mereka tunda.

Kembali ke fitur baru lainnya. Mulai versi 2021 ini, PHPMaker juga sudah tidak lagi menggunakan ADODB (database library). Sebagai gantinya, dia menggunakan DBAL (database abstraction & access layer) and PDO.

Fitur baru lainnya, PHPMaker mulai menggunakan PSR-12, sebuah coding-standard yang menggunakan aturan penulisan nama method dengan camelCase. Oleh karena itu, server event seperti Row_Rendered (misalnya) yang sebenarnya adalah method dari class table, akan di-generate di file script menjadi rowRendered.

Sedangkan di dalam project PHPMaker itu sendiri, tetap menggunakan nama Row_Rendered. Jadi, jangan kaget jika Anda ingin mencari kode di server event Row_Rendered pada file script yang dibangkitkan oleh PHPMaker, kata tersebut tidak ada, tapi sudah diganti menjadi rowRendered. Di awal-awal memang kelihatan aneh dan lucu, tapi lama-kelamaan nanti kita pasti akan terbiasa, hehehe…

Fitur baru lainnya yang kelihatan sederhana tapi membawa dampak yang sangat besar khususnya jika kita membangun beberapa aplikasi web sekaligus, adalah fitur Locale File. Mulai versi 2021 ini, setting locale tidak lagi disimpan di file locale yang berekstensi .json, tapi disimpan di sisi project PHPMaker.

Itu artinya, jika kita upgrade file project ke versi major PHPMaker berikutnya, kita tidak perlu repot-repot men-setting ulang file .json tadi. Tapi, oleh PHPMaker akan otomatis membaca setting yang disimpan di sisi project. Wow, keren! Ini adalah salah satu request yang dulu pernah saya dukung.

Fitur baru yang canggih lainnya adalah, sekarang PHPMaker sudah mendukung pemakaian Git. Itu artinya, para Web Developer dapat men-share file project-nya di Github. Fitur atau menu Git ini akan aktif di project, setelah kita mengisi pengaturan yang terdapat di menu Tools -> Advanced Settings -> Git repor URL, Git username, Git password, Git auto fetch, Git auto fetch period (seconds).

Fitur baru lainnya yang mungkin bagi sebagai Web Developer dinantikan, yaitu pemakaian SweetAlert2 untuk menampilkan pesan dalam jendela kotak dialog atau pesan alert, menggantikan Modal dialog bawaan Bootstrap yang sangat standar itu. Saya sendiri sebenarnya masih tetap lebih suka dengan AlertifyJS.

Alasan mengapa saya lebih suka menggunakan AlertifyJS, karena di sini kita tidak saja bisa menggunakannya untuk menampilkan pesan, tapi juga bisa menampilkan jendela dialog yang bisa digeser/diseret ke posisi yang kita inginkan. Sedangkan SweetAlert2 tidak bisa, sehingga terkesan kurang dinamis. Namanya saja Sweet tapi kurang begitu manis terasa, hehehe, hiks! 😛

Secara umum, kalau dari sisi tampilan masih belum terlalu ada perbedaan, karena aplikasi web yang dihasilkan oleh PHPMaker masih menggunakan theme gratisan yaitu AdminLTE. Hal ini sekaligus menjadi peluang untuk tetap menggunakan theme/template yang saya pakai di Masino Extensions for PHPMaker 2020, akan saya implementasikan saja buat PHPMaker 2021. Tunggu tanggal mainnya, ya! Sabar… sabar… hehehe…

Masino Extensions untuk PHPMaker 2021 Sudah Dirilis

$
0
0

Hari ini, 7 Oktober 2020, di tanggal yang sama saat PHPMaker versi 2021 dirilis satu bulan yang lalu, Masino Extensions untuk PHPMaker versi 2021 akhirnya saya rilis. Saya membutuhkan sekitar 3 minggu untuk membuat Masino Extensions kompatibel dengan PHPMaker 2021, dan satu minggu untuk memastikan semua fitur berfungsi sebagaimana mestinya.

Senang sekali rasanya bisa menyesuaikan Masino Extensions sehingga bisa kompatibel dengan PHPMaker versi 2021. Seperti yang kita ketahui, ada begitu banyak perubahan yang dilakukan oleh PHPMaker Developer Team di versi terakhir ini. Salah satu perubahan besar adalah penggunaan konsep MVC (Model-View-Controller) pada kode yang dihasilkan.

Tentu saja perubahan besar ini cukup menyita waktu untuk menyesuaikan Masino Extensions, khususnya beberapa fitur yang membutuhkan antar muka khusus yang menggunakan Custom Files. Di antaranya: fitur Calendar Scheduler dengan CRUD menggunakan Modal dialog, pengelolaan Breadcrumb Links (Add, Check, Move, dan Delete) melalui bantuan Stored Procedure, menampilkan Help Online melalui jendela Alertify, About Us, serta Terms and Conditions.

Secara umum, fitur-fitur di Masino Extensions untuk PHPMaker 2021 sama dengan fitur-fitur yang sudah saya implementasikan pada Masino Exstensions untuk PHPMaker 2020. Beberapa fitur mengalami penyesuaian dan penyempurnaan dari fitur di versi sebelumnya, seperti misalnya menampilkan informasi session count down di bagian Footer dan pada jendela Alertify yang sekarang mendukung format {menit:detik}.

Untuk melihat demonya, Demo Masino Extensions for PHPMaker 2021.

Sedangkan untuk mendownload Masino Extensions untuk PHPMaker 2021, Download Masino Extensions for PHPMaker 2021.

Semoga bermanfaat.

Awas Menyesal Lho, Kalau Belum Pakai PHPMaker 2021!

$
0
0

Setelah sekitar sebulan lebih menggunakan PHPMaker 2021, mulai dari saat dirilis tanggal 9 September 2020 yang lalu, kemudian menyesuaikan Masino Extensions untuk PHPMaker 2021, betapa tools yang satu ini luar biasa powerful sekaligus fleksibel untuk membuat Aplikasi Web hanya dalam hitungan menit saja!

Saya merasakan sendiri, bahwa di versi terakhir ini, PHPMaker benar-benar mengikuti perkembangan teknologi web yang terakhir. Mulai pemakaian konsep MVC di kode yang dihasilkannya, meningkatkan fitur REST API, menyederhanakan template, sampai kepada diupdate-nya beberapa library yang digunakan, termasuk Bootstrap ke versi terakhir yaitu 4.5.3 pada PHPMaker versi minor 2021.0.3 yang baru saja dirilis kemarin (sejak saat artikel ini ditulis).

Itu hanya sebagian kecil saja. Ada banyak fitur-fitur dahsyat sekaligus fleksibel lainnya di PHPMaker 2021 ini. Tidak muat rasanya jika harus diuraikan di dalam satu tulisan. Harus dicoba dan dirasakan sendiri supaya bisa menyimpulkan apakah yang saya sampaikan ini sekedar omong kosong atau tidak.

Membeli PHPMaker sebenarnya bukan sekedar membeli sebuah tools pengembangan atau code generator semata. Di balik itu, kita benar-benar belajar bagaimana cara mengikuti perkembangan teknologi web development itu sendiri. Bahkan, sering kali beberapa hal yang belum kita ketahui di dunia pengembangan aplikasi web, akhirnya menjadi kita ketahui setelah menggunakan PHPMaker 2021 ini.

Tidak itu saja. Pengalaman saya dalam 5 tahun terakhir menggunakan PHPMaker, saya banyak belajar dari proses berkembangnya tools ini mulai dari versi minor yang satu ke versi minor berikutnya. Demikian juga ketika mereka merilis versi major yang baru, dengan segala fitur-fitur baru dan peningkatan/penyempurnaan fitur-fitur dari versi major sebelumnya.

Contoh, ketika saya mencoba suatu fitur di versi yang baru, saya menemukan ada isu atau masalah. Lalu saya sampaikan melalui forum diskusinya. Kemudian mereka tanggapi dengan memperbarui template (sebagian besar bisa diselesaikan melalui update template). Lalu saya update template-nya, coba lagi, dan terakhir saya konfirmasikan kembali bahwa setelah update template, maka masalah tadi bisa tersolusikan.

Kadang-kadang, permasalahan yang timbul tadi muncul sendiri setelah saya mengetes fitur-fitur yang saya implementasikan ke dalam Masino Extensions untuk PHPMaker 2021 ini. Tentu saya sangat bisa memaklumi, dengan perubahan di setiap versi major PHPMaker, ada saja satu atau dua fitur yang terlewatkan sehingga menimbulkan isu minor. Seperti keuntungan yang saling melengkapi dan saling menutupi.

Semua rangkaian proses tadi membangkitkan perasaan gembira bercampur semangat yang tidak dapat dilukiskan dengan kata-kata. Apalagi hampir sebagian besar isu yang saya temukan, setelah saya mengetes Masino Extensions yang saya buat untuk PHPMaker. Temuan tadi kemudian langsung saya sampaikan ke forum diskusinya. Sebagian lainnya saya kirim ke Support-nya. Dan untungnya, mereka langsung merespon dan tanggapi dengan super-cepat.

Aura positif seperti ini tentu saja menular kepada para Web Developer yang menggunakan PHPMaker. Menular dalam bentuk semangat untuk berbuat yang terbaik. Sampai akhirnya menular dengan cara beriteraksi kepada sesama pengguna PHPMaker di forum diskusinya. Itulah mengapa jika Anda perhatikan di forum diskusi PHPMaker, tiada hari tanpa aktivitas berupa tanya jawab, diskusi, masukan, usulan, dan informasi-informasi baru yang sungguh sayang untuk dilewatkan.

Umumnya Web Developer tidak ingin disibukkan dengan urusan remeh-temeh mengupdate ini dan itu di sebuah Aplikasi Web yang dibangunnya, seperti membuat CRUD, penangan security, session management, reset password, mempercantik tampilan, menambahkan fitur A, B, C, dan seterusnya yang wajib ada di sebuah Aplikasi Web.

Daripada mengurusi hal-hal yang sering kali terabaikan atau bahkan sama sekali belum terpikirkan tadi oleh para web Developer (khususnya mereka yang masih pemula; bahkan yang sudah mahir sekalipun), sudah seharusnya Web Developer tetap fokus pada proses penerapan business-logic ke dalam Aplikasi Web. Urusan yang lainnya, serahkan saja kepada PHPMaker dan Masino Extensions!

Dengan demikian, waktu pengembangan Aplikasi Web bisa dihemat. Yang tadinya baru selesai setelah 3 bulan, sekarang hanya dalam satu atau dua minggu, sudah selesai dengan kualitas yang tidak diragukan lagi.

Jadi, jika Anda sebagai Web Developer masih juga belum menggunakan PHPMaker 2021 mulai hari ini, saya hanya bisa mengingatkan: Awas Menyesal Lho, Kalau Belum Pakai PHPMaker 2021!

Mudahnya Menambahkan Custom Validation di Sisi Client pada PHPMaker 2021

$
0
0

Sejak versi 2021, PHPMaker mengubah cara menampilkan pesan berisi hasil validasi form yang dilakukan di sisi client. Kalau di versi-versi sebelumnya, PHPMaker menampilkan pesan tersebut melalui kotak dialog alert. Sedangkan di versi 2021 ini, PHPMaker tidak lagi menggunakan cara tersebut, tapi menampilkan langsung di bawah dari setiap control yang bertalian di form tersebut.

Ada yang bilang bahwa sebaiknya pesan validasi lebih baik ditampilkan di dekat control yang bertalian, daripada menampilkannya dengan menggunakan kotak dialog alert. Alasannya, karena user tidak perlu lagi mengklik tombol OK pada kotak dialog tadi. Hm, masuk akal juga.

Selain itu, dengan cara ini maka semua pesan hasil validasi dapat ditampilkan sekaligus. Sementara kalau menggunakan kotak dialog, biasanya pesan validasi ditampilkan satu per satu untuk setiap control yang divalidasi, sehingga kurang efektif. Dan ini yang lebih masuk akal lagi.

Ini juga salah satu bukti bahwa Aplikasi Web yang dihasilkan oleh PHPMaker 2021 ini semakin user-friendly lagi dibandingkan dengan versi-versi sebelumnya. Dengan adanya perubahan ini, maka sintaks untuk menampilkan pesan validasi tersebut pun mengalami sedikit penyesuaian.

Katakanlah kita ingin membandingkan nilai yang terdapat pada Field_Pertama dengan nilai pada Field_Kedua. Jika nilai pada Field_Pertama lebih besar daripada nilai pada Field_Kedua, maka tampilkan pesan error.

Maka cukup tambahkan kode berikut pada lokasi: Client Scripts -> Table-Specific -> Add/Copy Page dan/atau Edit Page dari table yang bertalian.

var $row = $(this).fields(); // Ambil fields sebagai jQuery objects berdasarkan nama field
// bandingkan nilai pada Field_Pertama dan nilai pada Field_Kedua
if ($row["Field_Pertama"].toNumber() > $row["Field_Kedua"].toNumber())
    // jika memenuhi kriteria validasi, tampilkan pesan error di bawah control Field_Pertama
    return this.addCustomError("Field_Pertama", "Nilai pada Field Pertama harus lebih kecil atau sama dengan nilai pada Field Kedua.");

Perhatikanlah kode tersebut. Kita menggunakan method addCustomError dari object form yang bertalian untuk menampilkan pesan error. Parameter pertama dari method tadi adalah Field_Pertama, yang artinya kursor mouse akan otomatis fokus pada field tersebut. Sedangkan parameter kedua adalah pesan error yang ingin kita tampilkan di bawah control Field_Pertama tadi.

Betapa mudahnya bukan? Hanya dengan sedikit kode Javascript itu saja, kita sudah dapat menambahkan validasi data milik kita sendiri. Tidak perlu lagi menulis kode yang panjang seperti jika Anda membuat Aplikasi Web dengan cara-cara manual.

Kita juga tidak perlu mengubah kode di sisi file yang sudah dihasilkan. Semuanya cukup dilakukan dari dalam project PHPMaker saja. Hidup Anda sebagai Web Developer pun menjadi lebih menyenangkan. Waktu pengembangan Aplikasi Web pun bisa lebih cepat.

Menyesuaikan Format Tanggal pada Data yang Diimport di PHPMaker 2021

$
0
0

Apakah Anda pernah mengalami kesulitan saat mengimport data dari file .csv di aplikasi web yang dihasilkan oleh PHPMaker? Saat proses import data, muncul pesan error “Invalid field value”, dan semua data gagal total di-import. Setelah dicek ulang, ternyata nilai pada field yang tidak valid tersebut adalah data tanggal.

Pernah mengalami kejadian tersebut? Lalu apa yang Anda lakukan? Bingung, lalu menyerah begitu saja? Hmmm… sebaiknya jangan, karena kita akan menemukan solusinya melalui tulisan ini.

Supaya lebih mudah dipahami, saya akan mencoba menerangkan melalui sebuah contoh yang sederhana. Katakanlah Anda memiliki struktur table sebagai berikut di database MySQL:

CREATE TABLE `test_import` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `My_Date` date NOT NULL,
  `Description` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

Lalu Anda ingin data di tabel test_import tersebut tidak dientri satu per satu, melainkan melalui proses import data. Karena PHPMaker sudah memiliki fitur Import Data, maka kita tinggal mengaktifkan pilihan Import dari Table setup -> List Page dari dalam project PHPMaker.

Selanjutnya, Anda sudah mempunyai data dalam sebuah file data_import.csv yang isinya sebagai berikut:

"My_Date", "Description"
"22/10/2020", "One"
"23/10/2020", "Two"
"24/10/2020", "Three"
"25/10/2020", "Four"
"26/10/2020", "Five"
"27/10/2020", "Six"
"28/10/2020", "Seven"

Perhatikanlah kembali data di file .csv tadi. Apa kesimpulannya setelah Anda melihat data di field My_Date? Yes, betul… jika Anda menjawab bahwa formatnya adalah dd/mm/yyyy.

Nah, inilah penyebab mengapa error di atas terjadi. Format data yang akan di-import tidak sama dengan format tanggal default di database MySQL yaitu yyyy-mm-dd. Lantas bagaimana dong solusinya?

Hehe… tenang… tenang… hal ini bisa diatasi dengan sangat mudah dan cepat, jika Anda menggunakan PHPMaker 2021, yaitu versi terakhir saat artikel ini saya buat.

PHPMaker sudah menyedikan sebuah server event bernama Row_Import milik dari List Page. Server Event ini dieksekusi sebelum sebuah record di-import. Ada dua argumen dalam server event ini. Argumen pertama adalah $row, yaitu array data yang akan di-import. Sedangkan argumen kedua adalah $cnt, merupakan nilai Integer yang mengandung jumlah record yang akan di-import.

Secara standar, server event ini mengembalikan nilai true. Jika kita ingin mengabaikan proses import, maka cukup dengan mengembalikan nilai false. Tapi bukan itu yang akan kita bahas di sini.

Kembali kepada persoalan di atas. Kita dapat menggunakan server event Row_Import untuk mengubah atau menyesuaikan format tanggal data yang akan di-import, supaya sama dengan format yyyy-mm-dd. Caranya bagaimana?

Cukup dengan menulis sedikit kode PHP berikut pada server event tersebut:

	$dTanggal = $row["My_Date"];  // tampung dulu ke variabel $dTanggal
	$sTanggal = str_replace('/', '-', $dTanggal); // ganti separator "/" dengan "-", lalu tampung ke $sTanggal
	$row["My_Date"] = date('Y-m-d', strtotime($sTanggal)); // ubah format tanggal menjadi yyyy-mm-dd, lalu proses!

Hanya dengan 3 baris kode PHP itu saja, maka permasalahan di atas sudah bisa kita atasi dengan sangat mudah dan cepat. Tidak perlu menulis kode sampai ratusan atau ribuan baris untuk menciptakan fitur Import Data.

Selengkapnya kode di dalam server event Row_Import tadi seharusnya seperti ini:

// Row Import event
function Row_Import(&$row, $cnt)
{
    //Log($cnt); // Import record count
    //var_dump($row); // Import row
    //return false; // Return false to skip import

    $dTanggal = $row["My_Date"];  // tampung dulu ke variabel $dTanggal
    $sTanggal = str_replace('/', '-', $dTanggal); // ganti separator "/" dengan "-", lalu tampung ke $sTanggal
    $row["My_Date"] = date('Y-m-d', strtotime($sTanggal)); // ubah format tanggal menjadi yyyy-mm-dd, lalu proses!
	
    return true;
}

O iya, jangan lupa generate ulang semua file script seperti biasa, lalu cobalah lagi sekarang meng-import data melalui aplikasi web yang sudah di-generate tadi.

Seharusnya sekarang sudah tidak error lagi. Semua data berhasil di-import, yang ditandai dengan pesan: Imported 7 of 7 records from data_import.csv successfully.

Luar biasa memang fleksibelnya PHPMaker!


Tiga Pilihan untuk Menyimpan Password di Aplikasi Web dari PHPMaker 2021

$
0
0

Tahukah Anda bahwa di PHPMaker 2021 kita bisa menggunakan 3 pilihan untuk menyimpan data Password melalui Aplikasi Web yang di-generate olehnya? Ketiga pilihan itu adalah Plain Text Password, MD5 Password, dan Hashed Password.

Plain Text Password

Ini adalah pilihan default atau standar yang disediakan oleh PHPMaker, jika kita tidak mengaktifkan beberapa pengaturan yang akan kita bahas pada dua pilihan di bawah ini. Artinya, data Password yang disimpan di table users (table berisi data Pengguna untuk login) adalah teks sederhana, tanpa dienkripsi sama sekali. Tentu saja, pilihan ini sangat tidak disarankan, demi alasan keamanan. Tapi kalau untuk keperluan demo, tidak ada salahnya menggunakan pilihan ini.

MD5 Password

Pilihan kedua adalah Password akan disimpan dalam bentuk enkripsi satu arah yang bernama MD5. Tentu kita sudah tidak asing dengan pilihan ini, apalagi jika sering menggunakan database MySQL. Kita bisa menggunakan function MD5() untuk menghasilkan Password dengan jenis enkripsi satu arah ini. Syaratnya, kita harus mengaktifkan pengaturan Hashed password dari menu Security -> Advanced -> User Login Options -> Password. Tipe dan panjang field Password yang disarankan adalah varchar(50). O iya, akan lebih baik juga, jika sekalian kita mengaktifkan pengaturan yang berada di bawahnya, yaitu Case-sensitive password.

Hashed Password

Pilihan ketiga adalah Password akan disimpan dalam bentuk password hashed dengan algoritma CRYPT_BLOWFISH (algoritma default yang digunakan). PHPMaker menggunakan function password_hash untuk menghasilkan password tersebut. Syaratnya, pastikan kita sudah mengaktifkan kedua pengaturan yang terdapat pada pilihan MD5 Password di atas tadi, lalu aktifkan juga pengaturan Use password hash dari menu Tools -> Advanced Settings. Tipe dan panjang field Password yang disarankan adalah varchar(255). Pilihan ini sangat disarankan pada Aplikasi Web yang Anda generate dengan PHPMaker, apalagi ketika sudah berada di production server.

Setelah Anda menentukan salah satu dari ketiga pilihan tadi, pastikan untuk men-generate ulang semua file script seperti biasa.

Perlu diingat bahwa jika Anda menggunakan pilihan ketiga tapi data Password yang tersimpan di table users ((table berisi data Pengguna untuk login)) masih dalam bentuk MD5 Password atau bahkan masih dalam bentuk Plain Text Password, maka Pengguna tidak akan dapat login ke Aplikasi Web.

Karena MD5 Password merupakan password satu arah yang tidak dapat didekripsi, maka Anda harus mereset password Pengguna Akhir Aplikasi Web Anda, atau minta mereka untuk mereset sendiri Password mereka.

PHPMaker 2021 Menggunakan DBAL Menggantikan ADOdb

$
0
0

Sejak versi 2021, PHPMaker menggunakan DBAL (DataBase Abstraction Layer) menggantikan ADOdb.

DBAL menawarkan layer runtime yang ringan menggunakan API PDO dan banyak tambahan fitur lainnya seperti pemeriksaan skema database dan pemanipulasian melalui API yang berorientasikan object.

Faktanya, DBAL mengabstraksi API PDO yang nyata melalui penggunaan antarmuka yang sangat mirip dengan API PDO yang tersedia, sehingga memungkinkan untuk mengimplementasikan driver kustom yang dapat menggunakan API asli atau buatan sendiri yang sudah ada. Misalnya, DBAL dikirimkan dengan driver untuk database Oracle yang menggunakan ekstensi oci8.

Itu artinya, jika Anda menggunakan database PostgreSQL dan/atau SQLite, makan driver PDO berikut wajib dibutuhkan:
pdo_pgsql PDO extension untuk PostgreSQL
pdo_sqlite PDO extension untuk SQLite

Untuk database lainnya (MySQL, Microsoft SQL Server, dan Oracle), akan menggunakan driver berikut:
mysqli (MySQL Improved Extension),
Microsoft PHP drivers for PHP for SQL Server,
oci8 extension seperti sebelumnya.

Sedangkan database Microsoft Access sudah tidak didukung lagi sejak PHPMaker 2021. Jadi, jika Anda sebelumnya mengugunakan database ini, segera migrasikan ke database SQL Server.

Apabila selama ini Anda menggunakan kode ADOdb di Server Events, maka Anda wajib untuk menyesuaikannya. Sebagai contoh, jika Anda memiliki kode untuk mengeksekusi sebuah pernyataan SELECT, Anda perlu memperbarui kode tersebut menggunakan executeQuery() milik object connection, dari kode berikut:

$rs = $conn->execute($sql);
while (!$rs->EOF) {
    $value = $rs["fieldname"];
    $rs->MoveNext();
}
$rs->Close();

menjadi seperti ini:

$stmt = $conn->executeQuery($sql);
while ($row = $stmt->fetch()) {
     $value = $row["fieldname"];
}

Terlihat bahwa kode yang baru menjadi lebih ringkas.

Demikian juga dengan fungsi global Execute(), sejak PHPMaker 2021 diganti menjadi ExecuteQuery(), contoh:

$stmt = ExecuteQuery("SELECT...");

Penting untuk diketahi, bahwa hasil dari kode tersebut adalah object Statement, dan bukan Recordset (seperti di versi-versi PHPMaker sebelumnya).

Jadi, fungsi global Execute() sudah tidak digunakan lagi, dan akan dihapus di versi-versi yang akan datang.

Sedangkan untuk mengeksekusi query SQL INSERT/UPDATE/DELETE dan mengembalikan jumlah baris yang terdampak, kita dapat menggunakan method executeUpdate() milik object connection. Jika kita menggunakan fungsi global, maka kodenya seperti ini:

$rowAffected = ExecuteUpdate("UPDATE MyTable SET... WHERE...");

Untuk info lebih lanjut mengenal DBAL ini, klik Data Retrieval And Manipulation.

Satu lagi fitur yang super canggih sekaligus fleksibel di PHPMaker 2021.

Khusus untuk database MySQL, tersedia 2 pilihan driver MySQL untuk PHP. Yang pertama adalah mysqli (pilihan Default atau Standar), dan yang kedua adalah pdo_mysql.

Jika Anda baru pertama kali menggunakan PHPMaker 2021 dan belum pernah mengganti pilihan driver untuk database MySQL, maka mysqli yang digunakan. Jika Anda ingin menggantinya ke pdo_mysql, maka tinggal ubah dari pengaturan MySQL driver dari menu Tools -> Advanced Settings.

Mengenal SEO-Friendly URL di Aplikasi Web yang Dihasilkan oleh PHPMaker 2021

$
0
0

Seperti yang kita ketahui, sejak versi 2021, PHPMaker mulai memperkenalkan URL yang ramah terhadap optimisasi mesin pencarian, atau lebih dikenal dengan singkatan SEO (Search Engine Optimization) Friendly. Ini salah satu fitur andalan PHPMaker 2021 yang powerful sekaligus fleksibel.

Powerful karena URL Aplikasi Web yang dihasilkan oleh PHPMaker 2021 sekarang bisa menyamai dengan URL Aplikasi Web yang dihasilkan jika dibuat dengan PHP Framework seperti Laravel, Symphony, Yii, CodeIgniter, dan sebagainya. Fleksibel, karena URL tersebut bisa diakses dengan alamat alternatif yang lebih SEO Friendly dan lebih mudah dibaca lagi.

Perhatikanlah URL dari beberapa halaman berikut milik table models pada demo project PHPMaker 2021 (URL default):
– Halaman List: modelslist
– Halaman Add: modelsadd
– Halaman Copy: modelsadd/1 (misalnya untuk menyalin data Model dengan ID = 1)
– Halaman Edit: modelsedit/1 (misalnya untuk mengubah data Model dengan ID = 1)
– Halaman View: modelsview/1 (misalnya untuk menampilkan data Model dengan ID = 1)
– Halaman Search: modelssearch

Semuanya tanpa akhiran ekstensi .php. Aplikasi Web yang dihasilkan oleh PHPMaker kelihatan menjadi semakin lebih profesional dibandingkan dengan yang dihasilkan oleh PHPMaker versi-versi sebelumnya. Ini jugalah salah satu alasan, mengapa sebaiknya kita disarankan untuk selalu menggunakan versi yang terakhir.

Tapi, tahukah Anda bahwa sebenarnya PHPMaker diam-diam sudah menyediakan URL alternatif seperti yang baru saja kita bahas tadi? Alternatif URL yang saya maksud adalah URL yang lebih mudah dibaca dan terlihat lebih terstruktur?

Artinya, keenam halaman di atas tadi, bisa juga diakses dengan URL alternatif sebagai berikut:
– Halaman List: models/list
– Halaman Add: models/add
– Halaman Copy: models/add/1 (misalnya untuk menyalin data Model dengan ID = 1)
– Halaman Edit: models/edit/1 (misalnya untuk mengubah data Model dengan ID = 1)
– Halaman View: models/view/1 (misalnya untuk menampilkan data Model dengan ID = 1)
– Halaman Search: models/search

See? Sudah tahu bedanya dimana? Yes! URL alternatif ini lebih mudah dibaca, karena memisahkan antara nama table dan jenis halamannya. Kalau disuruh memilih, tentu kita akan memilih URL alternatif tersebut.

Betapa canggih sekaligus fleksibel, bukan? PHPMaker 2021 ternyata sudah menangani hal ini. Satu lagi rahasia fitur URL yang SEO-Friendly mulai terkuak. Semakin membuktikan bahwa Aplikasi Web yang dihasilkan oleh PHPMaker 2021 menjadi lebih profesional lagi, karena lebih mudah dibaca dari URL-nya.

Tidak berhenti di situ saja. Masih ada kejutan lainnya yang akan kita lihat, hehehe… 😉

Sekalipun link yang digunakan oleh Aplikasi Web adalah URL default yang di atas atau yang kita bahas pertama tadi, kita masih bisa mengganti URL tersebut pada menu atau tombol yang akan membuka ke halaman yang bertalian.

Contoh, kita ingin mengganti URL default modelslist yang terdapat di item menu pada Sidebar, menjadi models/list, maka cukup tambahkan kode ini ke dalam server event MenuItem_Adding sebelum atau di atas baris return true:

    	if ($item->Url == "modelslist")
    	    	$item->Url = "models/list";

Sedangkan untuk mengganti link yang terdapat di setiap baris (row) pada table di halaman List, kita cukup menambahkan kode berikut ke dalam server event Row_Rendered:

if (CurrentPageID() == "list") {
	$urlCopy = $this->keyUrl("models/add", $this->getUrlParm());
	$this->CopyUrl = $urlCopy;
	$urlEdit = $this->keyUrl("models/edit", $this->getUrlParm());
	$this->EditUrl = $urlEdit;
	$urlDelete = $this->keyUrl("models/delete", $this->getUrlParm());
	$this->DeleteUrl = $urlDelete;
	$urlView = $this->keyUrl("models/view", $this->getUrlParm());
	$this->ViewUrl = $urlView;
}

Jika ingin mengganti link atau URL milik tombol Add dan Advanced Search di halaman List, maka cukup tambahkan kode berikut ke dalam server event Page_Render milik halaman List:

       	// ubah URL halaman Add
    	$urlAdd = "models/add";
       	$this->AddUrl = $urlAdd;

    	// ubah URL halaman Delete
    	$options = &$this->OtherOptions;
    	$option = $options["addedit"];
    	$item = &$option->add("multidelete");
    	$this->MultiDeleteUrl = "models/delete";
    	$item->Body = "<a class=\"ew-action ew-multi-delete\" title=\"" . HtmlTitle(Language()->phrase("DeleteSelectedLink")) . "\" data-caption=\"" . HtmlTitle(Language()->phrase("DeleteSelectedLink")) . "\" href=\"#\" onclick=\"return ew.submitAction(event, {f:document.fmodelslist, url:'" . GetUrl($this->MultiDeleteUrl) . "', data:{action:'show'}});return false;\">" . Language()->phrase("DeleteSelectedLink") . "</a>";
    	$this->setupOtherOptions(); // <--- jangan lupa kode yang ini wajib ada supaya URL nya menyesuaikan

    	// ubah URL halaman Advanced Search
    	$item = &$this->SearchOptions->add("advancedsearch");
    	$item->Body = "<a class=\"btn btn-default ew-advanced-search\" title=\"" . Language()->phrase("AdvancedSearch") . "\" data-caption=\"" . Language()->phrase("AdvancedSearch") . "\" href=\"search\">" . Language()->phrase("AdvancedSearchBtn") . "</a>";

Sedangkan jika ingin mengubah URL atau link milik beberapa tombol di halaman View, kita cukup menambahkan kode berikut ke dalam server event Page_Render milik halaman View:

    	$urlAdd = "models/add";
    	$this->AddUrl = $urlAdd;
    	$urlCopy = $this->keyUrl("models/add", $this->getUrlParm());
    	$this->CopyUrl = $urlCopy;
    	$urlEdit = $this->keyUrl("models/edit", $this->getUrlParm());
    	$this->EditUrl = $urlEdit;
    	$urlDelete = $this->keyUrl("models/delete", $this->getUrlParm());
    	$this->DeleteUrl = $urlDelete;
    	$urlView = $this->keyUrl("models/view", $this->getUrlParm());
    	$this->ViewUrl = $urlView;
    	$this->setupOtherOptions(); // <--- jangan lupa kode yang ini wajib ada supaya URL nya menyesuaikan
    	// khusus penanganan breadcrumb di halaman View
    	global $Breadcrumb, $Language;
    	$Breadcrumb = new Breadcrumb("home");
    	$url = CurrentUrl();
    	$Breadcrumb->add("list", $this->TableVar, $this->addMasterUrl("models/list"), "", $this->TableVar, true);
    	$pageId = "view";
    	$Breadcrumb->add("view", $pageId, $url);

Sedangkan untuk penanganan link breadcrumb di halaman Add, tambahkan kode ini ke server event Page_Render milik halaman Add:

    	// khusus penanganan breadcrumb di halaman Add
    	global $Breadcrumb, $Language;
    	$Breadcrumb = new Breadcrumb("home");
    	$url = CurrentUrl();
    	$Breadcrumb->add("list", $this->TableVar, $this->addMasterUrl("models/list"), "", $this->TableVar, true);
    	$pageId = "add";
    	$Breadcrumb->add("add", $pageId, $url);

Sedangkan untuk penanganan link breadcrumb di halaman Edit, tambahkan kode ini ke server event Page_Render milik halaman Edit:

    	// khusus penanganan breadcrumb di halaman Edit
    	global $Breadcrumb, $Language;
    	$Breadcrumb = new Breadcrumb("home");
    	$url = CurrentUrl();
    	$Breadcrumb->add("list", $this->TableVar, $this->addMasterUrl("models/list"), "", $this->TableVar, true);
    	$pageId = "edit";
    	$Breadcrumb->add("edit", $pageId, $url);

Sedangkan untuk penanganan link breadcrumb di halaman Delete, tambahkan kode ini ke server event Page_Render milik halaman Delete:

    	// khusus penanganan breadcrumb di halaman Delete
    	global $Breadcrumb, $Language;
    	$Breadcrumb = new Breadcrumb("home");
    	$url = CurrentUrl();
    	$Breadcrumb->add("list", $this->TableVar, $this->addMasterUrl("models/list"), "", $this->TableVar, true);
    	$pageId = "delete";
    	$Breadcrumb->add("delete", $pageId, $url);

Sedangkan untuk penanganan link breadcrumb di halaman Search, tambahkan kode ini ke server event Page_Render milik halaman Search:

    	// khusus penanganan breadcrumb di halaman Search
    	global $Breadcrumb, $Language;
    	$Breadcrumb = new Breadcrumb("home");
    	$url = CurrentUrl();
    	$Breadcrumb->add("list", $this->TableVar, $this->addMasterUrl("models/list"), "", $this->TableVar, true);
    	$pageId = "search";
    	$Breadcrumb->add("search", $pageId, $url);

Pastikan untuk men-generate ulang semua file script seperti biasa menggunakan PHPMaker 2021. Setelah itu, cobalah akses kembali Aplikasi Web via browser, lalu buka halaman List table models, maka URL akan berubah menjadi lebih SEO Friendly lagi, termasuk link milik beberapa tomobol yang ada di sana.

Demikian pula saat membuka halaman View, Anda akan melihat link milik beberapa tombol yang ada di sana menjadi semakin lebih SEO Friendly lagi. Wow, keren kan? 😀

Betapa mudah dan cepatnya. Sudah powerful, eh fleksibel juga. 😉

Menampilkan Data pada Halaman View Jika Sudah Pernah Dientri di PHPMaker 2021

$
0
0

Kadang-kadang, Pengguna Akhir penasaran ketika menyimpan data yang sudah dientri, ternyata sistem menampilkan pesan bahwa data tersebut sudah ada di database. Mereka penasaran ingin segera mengetahui selengkapnya data yang sudah pernah dientri itu.

Kondisi saat ini, sistem akan menampilkan pesan hasil validasi sistem yang menyatakan bahwa data sudah ada. Sistem tidak langsung otomatis menampilkan data tersebut dari database. Jadi, dalam hal ini, Pengguna Akhir harus kembali dulu ke halaman List, lalu mencari data tersebut, kemudian menampilkannya.

Tentu saja hal ini kurang begitu efektif, karena dibutuhkan beberapa langkah untuk mengetahui data tersebut. Pertanyaannya adalah: Bagaimana cara supaya sistem dapat menampilkan data tersebut tanpa harus mencari terlebih dulu datanya secara manual?

Bukan PHPMaker namanya jika hal ini tidak bisa diatasi dengan sangat mudah dan cepat.

Katakanlah kita ingin memeriksa data Order Details dengan menggunakan demo project. Jika data yang ditambahkan sudah ada, maka sistem akan menampilkan pesan dan langsung me-redirect ke halaman View untuk menampilkan data selengkapnya.

Untuk menerapkan business-logic seperti itu, maka kita cukup menambahkan sedikit kode PHP saja ke dalam server event Row_Inserting milik table orderdetails:

    $row = ExecuteRow("SELECT OrderID, ProductID FROM orderdetails WHERE OrderID = " . $rsnew["OrderID"] . " AND ProductID = " . $rsnew["ProductID"]);
    if ($row["OrderID"] == $rsnew["OrderID"] && $row["ProductID"] == $rsnew["ProductID"]) {
    	$this->setFailureMessage("OrderID <strong>" . $row["OrderID"] . "</strong> and ProductID <strong>" . $row["ProductID"] . "</strong> already exists. Here is the View page that displays the existing record.");
    	$this->terminate("orderdetails/view/" . $row["OrderID"] . "/" . $row["ProductID"]);
    	return false;
    }

Dari kode tersebut, sistem akan memeriksa terlebih dulu data di table orderdetails berdasarkan data OrderID dan ProductID dengan menggunakan fungsi global ExecuteRow(). Jika data sudah ada di database, maka tampilkan pesan, lalu segera redirect Pengguna Akhir ke halaman View yang menampilkan selengkapnya data tersebut.

Tentu saja dalam hal ini Pengguna Akhir tersebut sudah diberikan akses (permission) untuk menambah data melalui halaman Add, dan juga menampilkan data pada halaman View.

Perhatikanlah kembali kode tadi. Kita tidak perlu menulis kode PHP sampai berpuluh-puluh baris untuk menerapkan business-logic tersebut. Hanya dengan 6 baris kode PHP itu saja, maka kita bisa memudahkan Pengguna Akhir untuk menampilkan data yang sudah pernah dientri tadi.

Luar biasa memang PHPMaker! Hohoho… 😀

Menentukan Halaman Default yang Tampil di Aplikasi Web dari PHPMaker 2021

$
0
0

Jika di versi 2020 dan sebelumnya PHPMaker menyediakan server event untuk menentukan halaman default atau halaman pertama yang ditampilkan, dengan menulis kode melalui Server Events -> Other -> Index Page -> Page_Redirecting, maka sejak versi 2021 server event tersebut sudah dihapus dari dalam project PHPMaker.

Hal ini terjadi karena di versi 2020, kode untuk server event tersebut akan di-generate ke dalam halaman index.php, dan file ini bisa dipanggil secara langsung dari URL. Sedangkan di versi 2021, file index.php sudah tidak bisa lagi dipanggil secara langsung dari URL. Jika halaman index.php dipanggil secara langsung pada Aplikasi Web yang dihasilkan oleh PHPMaker 2021, maka akan menimbulkan error Route ‘index.php’ not found..

Sebagai gantinya, kita sebagai Web Developer dapat mengoptimalkan setting Start page yang terdapat di menu/tab Generate. Atau, jika setting ini dikosongkan, maka PHPMaker akan menampilkan halaman yang memiliki setting Default pada table yang dipilih dari tab/pengaturan level Tables.

Jika pengaturan pada level Tables ini dikosongkan juga, maka PHPMaker akan otomatis menampilkan halaman List milik table yang berada pada urutan paling atas di panel Database pada project PHPMaker. Jika permission List untuk table tersebut tidak diberikan kepada level pengguna Anonymous, maka sistem akan mengembalikan pesan error yang berisi Anda tidak memiliki ijin untuk mengakses {namatable}, lalu sistem akan me-redirect ke halaman Login.

Semua yang kita bahas barusan adalah untuk halaman Default yang ditampilkan pada saat kondisi Pengguna belum login ke dalam Aplikasi Web. Nah, pertanyaannya, bagaimana cara kita untuk menentukan halaman Default yang ditampilkan jika Pengguna sudah berhasil login secara dinamis?

Untuk me-redirect Pengguna ke halaman tertentu setelah berhasil login, maka di versi 2021 ini kita bisa menggunakan server event Page_Redirecting yang terdapat pada lokasi Server Events -> Other -> Login Page:

    //if (IsLoggedIn()) {
    	if (CurrentUserLevel() == "1") {
    		$url = "orders/list";
    	} elseif (CurrentUserLevel() == "2") {
    		$url = "products/list";
    	}
    //}

Dalam contoh kode di atas, kita menggunakan project demo yang sudah disediakan oleh PHPMaker. Pengguna dengan level 1 (Sales), akan otomatis diarahkan ke halaman List milik table orders setelah berhasil login. Sedangkan Pengguna dengan level 2 (Manager), akan diarahkan oleh sistem ke halaman List milik table products.

Perhatikanlah kode pada baris paling atas dan paling bawah. Kode tersebut kita tutup menjadi komentar. Artinya, pemeriksaan apakah si Pengguna sudah berhasil login tidak wajib dilakukan lagi, karena level Pengguna Sales (1) dan level Pengguna Manager (2) masing-masing tidak sama dengan level Pengguna Anonymous (-2).

Sampai di sini, kita sudah bisa menentukan halaman Default untuk level Pengguna Anonymous, dan level Pengguna lainnya jika sudah berhasil login. Pertanyaan selanjutnya, apakah kita bisa mengarahkan Pengguna ke halaman tertentu jika sudah berhasil logout?

Bukan PHPMaker namanya jika hal ini tidak bisa dilakukan dengan sangat mudah dan cepat, hehehe… 😉

Kita cukup menggunakan server event Page_Redirecting yang terdapat pada lokasi Server Events -> Other -> Logout Page:

    if (CurrentUserLevel() == "1") {
    	$url = "news";
    } elseif (CurrentUserLevel() == "2") {
    	$url = "home";
    }

Kode ini artinya, untuk level Pengguna Sales (1), maka setelah berhasil logout, sistem akan mengarahkan ke halaman News. Sedangkan jika level Pengguna Manager (2) berhasil logout, maka sistem akan mengarahkan ke halaman Home.

Betapa mudahnya, bukan? Hanya dengan sedikit kode PHP itu saja, kita sudah bisa menerapkan business logic sesuai kebutuhan kita.

PHPMaker memang keren! 😉

Viewing all 176 articles
Browse latest View live