Fake Delete sering diartikan dengan Penghapusan Palsu. Dengan kata lain, ketika Pengguna Akhir dari Aplikasi Web menghapus data, maka data tersebut sebenarnya tidak dihapus dari database, tetapi hanya ditandai statusnya sebagai sudah dihapus.
Fitur Fake Delete adalah salah satu fitur yang sering dibutuhkan di dalam suatu Aplikasi Web. Khususnya jika ada ketentuan yang mengharuskan data tidak boleh dihapus secara fisik. Pengguna Akhir hanya tidak dapat melihat data yang sudah ditandai statusnya sebagai sudah dihapus.
Beruntunglah Anda jika membangun Aplikasi Web dengan PHPMaker 2021. Anda dapat menerapkan Fake Delete dengan sangat mudah dan cepat. Anda hanya perlu menambahkan sedikit kode saja ke server event Row_Deleting.
Langsung saja kita membuktikannya bersama-sama dari demo project untuk PHPMaker 2021 yang bisa Anda download file-nya dan coba di localhost.
Langkah Pertama, jalankan perintah SQL di bawah ini, untuk menambahkan sebuah field yang bernama IsDelete pada table models di dalam database yang digunakan project demo tadi:
ALTER TABLE `models` ADD COLUMN `IsDelete` enum('0','1') NOT NULL DEFAULT '0' AFTER `Model`
Langkah Kedua, pastikan Anda sudah melakukan sinkronisasi struktur table terbaru tadi dengan project demo, dengan mengklik menu Tools -> Synchronize, lalu tekan Yes atau OK untuk menerima perubahan.
Langkah Ketiga, salin kode berikut ke dalam server event Row_Deleting dari table models tepat sebelum baris return true;, sehingga kode selengkapnya menjadi seperti ini:
// Row Deleting event function Row_Deleting(&$rs) { // Enter your code here // To cancel, set return value to False $conn = $this->getConnection(); $conn->executeUpdate("UPDATE models SET IsDelete = '1' WHERE ID = " . $rs["ID"]); $conn->commit(); $conn->beginTransaction(); $this->setSuccessMessage(Language()->phrase("DeleteSuccess")); $this->terminate("modelslist"); return false; return true; }
Kode di atas mengupdate nilai field IsDelete menjadi 1, yang artinya status datanya menjadi sudah dihapus. Di bawahnya kita menambahkan method commit milik object connection, diikuti dengan memulai transaction dengan method beginTransaction, tampilkan pesan berhasil, lalu redirect Pengguna Akhir ke halaman List dari menu Models, dan yang terakhir jangan lupa untuk mengembalikan nilai false.
Jika return false tidak kita gunakan, maka perintah selanjutnya akan lanjut ke kode return true untuk menghapus data tersebut dari database. Tentu saja kita tidak ingin menghapus data tersebut dari database. Untuk itulah kenapa kita harus menggunakan return false.
Langkah Keempat, tambahkan kode berikut ke dalam server event Page_Load di bawah Delete Page milik table models:
Language()->setPhrase("DeleteCancelled", "");
Jika kode barusan ini tidak kita tambahkan, maka pesan error yang berisi Delete cancelled akan muncul. Supaya pesan ini tidak muncul, maka kita harus mengeset phrase DeleteCancelled dengan string kosong.
Tentu saja Anda bisa mengembangkan fitur ini dengan tidak menampilkan record yang memiliki nilai 1 pada field IsDelete tadi, dengan menambahkan satu baris kode ini saja ke dalam server event Recordset_Selecting:
AddFilter($filter, "IsDelete = '0'"); // hanya tampilkan yang IsDelete = '0'
Langkah Kelima, pastikan Anda sudah men-generate semua file script dari PHPMaker 2021. Setelah itu, cobalah untuk menghapus sebuah record di menu List Models, maka Anda akan melihat record yang dihapus tetap ada. Hanya nilai pada field IsDelete saja yang berubah.
Perhatikanlah kembali kode di server event Recordset_Selecting, Row_Deleting, dan Page_Load di atas tadi. Hanya dengan sedikit kode itu saja, kita sudah dapat mengimplementasikan Fake Delete di PHPMaker 2021.
Tidak perlu menulis kode berpuluh-puluh atau beratus-ratus baris hanya untuk menerapkan penghapusan palsu tadi. Selebihnya sudah ditangani oleh PHPMaker, sehingga waktu pengembangan Aplikasi Web menjadi lebih cepat.
Sebagai catatan terakhir, trik ini memiliki keterbatasan, yaitu hanya bisa menghapus per satu record saja. Jika opsi Multiple delete diaktifkan, maka hanya record yang paling pertama terpilih saja yang akan ditandai sebagai sudah dihapus.
Jadi, pastikan sekali lagi Anda tidak mengaktifkan Multiple Delete jika ingin menerapkan Fake Delete ini.
what is the utilities to do that after the query ???
$conn->commit();
$conn->beginTransaction();
and why not
$conn = $this->getConnection();
$conn->beginTransaction();
$conn->executeUpdate(“UPDATE models SET IsDelete = ‘1’ WHERE ID = ” . $rs[“ID”]);
$conn->commit();
?????
Thanks
Because by default, PHPMaker has already performed beginTransaction. Therefore, after query UPDATE, we need to perform commit to execute the UPDATE since we will return false immediately afterwards.
Since commit will close the transaction, then we need to perform beginTransaction again, in order to avoid error There is no active transaction.