CRUD Manajemen Artikel - Menghapus Artikel

9 Maret 2025
  ยท  

5 menit  ยท  

Sebelumnya, kita sudah menyelesaikan fitur Create, Read, dan Update. Kali ini, mari kita lengkapi CRUD dengan menambahkan fitur Delete.

Menyesuaikan Controller untuk Menghapus Artikel

Kita akan mulai dengan menyesuaikan method destroy() pada ArticleController untuk menghapus artikel dari database beserta file gambarnya (jika ada).

Berikut kode yang perlu kita sesuaikan:

๐Ÿ“„ app/Http/Controllers/ArticleController.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/** ... **/
use Illuminate\Http\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
/** ... **/

class ArticleController extends Controller
{
    /** ... **/

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(Article $article): JsonResponse
    {
        try {
            if ($article->feature_image_url) {
                $filePath = "$this->storagePath/$article->feature_image_url";

                if (Storage::exists($filePath)) {
                    Storage::delete($filePath);
                }
            }

            $article->delete();

            return response()->json(['message' => 'Data berhasil dihapus!']);
        } catch (\Exception $e) {
            report($e);

            return response()->json(['message' => 'Data tidak berhasil dihapus!'], Response::HTTP_INTERNAL_SERVER_ERROR);
        }
    }
}
  • Baris 16-22
    Memeriksa apakah artikel memiliki gambar. Jika ya, kita hapus gambar tersebut dari penyimpanan menggunakan Storage.
  • Baris 24
    Menghapus data artikel dari database.
  • Baris 26, 30
    Mengembalikan response JSON menggunakan helper response(), baik saat berhasil maupun saat gagal (error 500 โ€” Internal Server Error).

Instalasi dan Konfigurasi HTMX

Untuk membuat tombol delete yang responsif tanpa reload halaman, kita akan menggunakan HTMX, sebuah library yang memudahkan pengiriman request AJAX tanpa perlu banyak menulis kode JavaScript.

Untuk meng-install HTMX, jalankan perintah berikut:

sail npm install [email protected]

Versi HTMX yang kita gunakan adalah versi 2.0.4.

Selanjutnya, daftarkan HTMX pada file app.js sebagai berikut:

๐Ÿ“„ resources/js/app.js

1
2
3
4
5
import 'laravel-datatables-vite';
import './bootstrap';
import htmx from 'htmx.org';

window.htmx = htmx;

Pastikan proses Vite sedang berjalan. Jika belum, jalankan perintah berikut:

sail npm run dev

Menambahkan Tombol Delete pada DataTable

Edit class DataTable pada file berikut:

๐Ÿ“„ app/DataTables/ArticleDataTable.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/** ... **/

    /**
     * Build the DataTable class.
     *
     * @param QueryBuilder<Article> $query Results from query() method.
     */
    public function dataTable(QueryBuilder $query): EloquentDataTable
    {
        return (new EloquentDataTable($query))
            ->addColumn('action', function (Article $article) {
                $action = [
                    "<a href='".route('articles.show', $article)."' class='btn btn-sm btn-primary'><i class='bi bi-eye-fill'></i></a>",
                    "<a href='".route('articles.edit', $article)."' class='btn btn-sm btn-success'><i class='bi bi-pencil-fill'></i></a>",
                    "<a
                        hx-vals='{\"_token\": \"".csrf_token()."\"}'
                        hx-delete='".route('articles.destroy', $article)."'
                        hx-confirm='Apakah kamu yakin akan menghapus data ini?'
                        hx-swap='none'
                        hx-on::after-request=\"onDeleteAfterRequest(event)\"
                        class='btn btn-sm btn-danger'
                    >
                        <i class='bi bi-trash3-fill'></i>
                    </a>",
                ];

                return implode(' ', $action);
            })
            ->rawColumns(['status', 'action'])
            ->setRowId('id');
    }

    /**
     * Optional method if you want to use the html builder.
     */
    public function html(): HtmlBuilder
    {
        return $this->builder()
                    ->drawCallback('function () {
                        htmx.process(this.api().table().node());
                    }')
                    ->setTableId('article-table')
                    ->columns($this->getColumns())
                    ->minifiedAjax()
                    ->orderBy(5)
                    ->buttons([
                        Button::make('excel'),
                        Button::make('csv'),
                        Button::make('pdf'),
                        Button::make('print'),
                    ]);
    }

    /**
     * Get the dataTable columns definition.
     */
    public function getColumns(): array
    {
        return [
            Column::computed('action')
                  ->exportable(false)
                  ->printable(false)
                  ->addClass('text-center')
                  ->width(125)
                  ->title(''),
            Column::make('title')->title('Judul'),
            Column::make('status')->title('Status'),
            Column::make('published_at')->title('Waktu Publikasi'),
            Column::make('created_at')->title('Waktu Pembuatan'),
            Column::make('updated_at')->title('Waktu Pembaruan'),
        ];
    }

/** ... **/
  • Baris 15-24
    Menambahkan tombol delete menggunakan HTMX:
    • hx-vals menambahkan nilai yang dikirimkan bersamaan dengan request (dalam format JSON). Dalam hal ini, kita menyisipkan token CSRF.
    • hx-delete mengirimkan request HTTP dengan method DELETE ke URL yang dituju.
    • hx-confirm menampilkan kotak dialog konfirmasi sebelum mengirimkan request.
    • hx-swap menentukan bagaimana konten akan digantikan. Nilai none menandakan HTMX tidak mengubah tampilan berdasarkan response yang diperoleh dari server.
    • hx-on::after-request menetapkan fungsi JavaScript yang akan dijalankan setelah HTMX menerima response dari server.
    • onDeleteAfterRequest(event) adalah event listener buatan yang akan kita tambahkan nanti untuk dijalankan setelah request selesai dijalankan.
  • Baris 39-41
    Menginisialisasi ulang seluruh atribut HTMX yang digunakan pada DOM (Document Object Model) tabel setiap kali DataTable selesai di-render, agar elemen tombol delete tetap aktif dan berfungsi dengan baik.
  • Baris 45
    Mengurutkan data tabel berdasarkan nilai pada kolom ke-5 (Waktu Pembaruan) dari terbaru hingga terlama.
  • Baris 64
    Mengatur lebar kolom action menjadi 125px.

Hasil dari pengubahan di atas adalah sebagai berikut:

Menangani Event Setelah Request Selesai Dijalankan

Masih ingat dengan atribut HTMX berikut, kan?
hx-on::after-request="onDeleteAfterRequest(event)"

Kita akan menambahkan event listener onDeleteAfterRequest() untuk merespons hasil penghapusan setelah tombol delete diklik.

Tambahkan kode berikut ke dalam view index.blade.php:

๐Ÿ“„ resources/views/pages/articles/index.blade.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
/** ... **/

@push('scripts')
    {{ $dataTable->scripts(attributes: ['type' => 'module']) }}

    <script type="module">
        window.onDeleteAfterRequest = (ev) => {
            const { status, responseText } = ev.detail.xhr;
            const response = JSON.parse(responseText);

            if (status === 200) {
                const instance = $('#{{ $dataTable->getTableAttributes()['id'] }}').DataTable();
                instance.ajax.reload(null, false);
            }

            alert(response.message);
        }
    </script>
@endpush
  • Baris 8
    Mengekstrak nilai status dan responseText dari ev.detail.xhr dengan teknik object destructuring.
  • Baris 9
    Melakukan parsing response JSON menjadi objek JavaScript yang bisa digunakan.
  • Baris 11-14
    Jika status bernilai 200 (artinya data berhasil dihapus), kode pada baris 12 akan mendapatkan instance DataTable menggunakan ID dan kode pada baris 13 akan meng-load ulang data pada tabel dari server, tanpa mengubah halaman atau pagination.
  • Baris 16
    Menampilkan pesan dari response server dalam bentuk alert pada browser.

Hasil Akhir

Dengan menambahkan fitur Delete, kini fitur CRUD kita sudah lengkap! ๐ŸŽ‰

Berikut adalah proses saat kita menekan tombol delete pada salah satu data artikel…



Tombol Delete akan langsung menghapus data tanpa reload halaman, memberikan pengalaman pengguna yang lebih cepat dan mulus โ€” semua ini berkat HTMX yang ringan dan elegan.

Beberapa keuntungan menggunakan HTMX:

  • Tidak perlu reload halaman penuh.
  • Interaksi pengguna terasa lebih responsif.
  • Tidak perlu menulis kode JavaScript yang kompleks.


Pada artikel berikutnya, kita akan mempercantik tampilan halaman depan blog agar lebih menarik!

Kita sudah hampir tiba di penghujung seri ini. Tinggal sedikit lagi untuk menyempurnakan aplikasi blog yang sudah kita bangun bersama!

Sudah siap buat aplikasi blog kita jadi makin sempurna?! โœจ๐Ÿ”ฅ

CRUD Manajemen Artikel - Menghapus Artikel
Top