Membuat Plugin Manajemen Data Frontend-Backend Terintegrasi
Contoh-contoh sebelumnya entah pure client (Block, Field, Action) atau client + interface sederhana (halaman pengaturan). Contoh ini menunjukkan skenario yang lebih lengkap — server mendefinisikan tabel data, client mewarisi TableBlockModel untuk mendapatkan kapabilitas tabel lengkap, ditambah Component Field kustom dan tombol Action kustom, membentuk plugin manajemen data dengan operasi CRUD.
Contoh ini menggabungkan Block, Field, Action yang sudah dipelajari sebelumnya, menampilkan alur pengembangan plugin yang lengkap.
Disarankan memahami konten berikut terlebih dahulu agar pengembangan lebih lancar:
- Menulis Plugin Pertama Anda — Pembuatan plugin dan struktur direktori
- Plugin — Entry point Plugin dan lifecycle
load() - FlowEngine → Ekstensi Block — BlockModel, CollectionBlockModel, TableBlockModel
- FlowEngine → Ekstensi Field — ClickableFieldModel, bindModelToInterface
- FlowEngine → Ekstensi Action — ActionModel, ActionSceneEnum
- i18n Internasionalisasi — Cara menulis file terjemahan dan penggunaan
tExpr() - Ikhtisar Pengembangan Server — Dasar plugin server
Hasil Akhir
Yang akan kita buat adalah plugin manajemen data "Todo Items", mencakup kapabilitas berikut:
- Server mendefinisikan tabel data
todoItems, plugin akan secara otomatis menulis data contoh saat instalasi - Client mewarisi
TableBlockModel, Block tabel siap pakai (kolom Field, paginasi, action bar, dll.) - Component Field kustom — merender Field priority dengan Tag berwarna
- Tombol Action kustom — tombol "New Todo", klik untuk membuka dialog mengisi form dan membuat record
Source code lengkap lihat @nocobase-example/plugin-custom-table-block-resource. Jika Anda ingin langsung menjalankannya secara lokal untuk melihat hasilnya:
Berikutnya, mari kita bangun plugin ini dari nol, langkah demi langkah.
Langkah 1: Membuat Skeleton Plugin
Eksekusi di direktori root repository:
Untuk penjelasan detail lihat Menulis Plugin Pertama Anda.
Langkah 2: Mendefinisikan Tabel Data (Server)
Buat src/server/collections/todoItems.ts. NocoBase akan secara otomatis memuat definisi collection di direktori ini:
Berbeda dengan contoh halaman pengaturan, di sini tidak perlu mendaftarkan resource secara manual — NocoBase akan secara otomatis menghasilkan interface CRUD standar (list, get, create, update, destroy) untuk setiap collection.
Langkah 3: Mengonfigurasi Hak Akses dan Data Contoh (Server)
Edit src/server/plugin.ts, konfigurasikan hak akses ACL di load(), dan masukkan data contoh di install():
Beberapa poin penting:
acl.allow()—['list', 'get', 'create', 'update', 'destroy']membuka hak akses CRUD penuh,'loggedIn'artinya user yang sudah login dapat mengaksesnyainstall()— Hanya dieksekusi saat plugin pertama kali diinstal, cocok untuk menulis data awalthis.db.getRepository()— Mendapatkan object operasi data berdasarkan nama collection- Tidak perlu
resourceManager.define()— NocoBase akan secara otomatis menghasilkan interface CRUD untuk collection
Langkah 4: Membuat Model Block (Client)
Buat src/client-v2/models/TodoBlockModel.tsx. Mewarisi TableBlockModel dapat langsung mendapatkan kapabilitas Block tabel lengkap — kolom Field, action bar, paginasi, sorting, dll., tidak perlu menulis renderComponent sendiri.

Dalam pengembangan plugin yang sebenarnya, jika tidak perlu kustomisasi TableBlockModel, sebenarnya Anda dapat tidak mewarisi dan mendaftarkan Block ini, langsung biarkan user memilih "Tabel" saat menambahkan Block. Artikel ini membuat TodoBlockModel yang mewarisi TableBlockModel hanya untuk mendemonstrasikan alur definisi dan registrasi model Block. TableBlockModel akan menangani semua hal lainnya (kolom Field, action bar, paginasi, dll.).
Membatasi Block ini hanya berlaku untuk collection todoItems melalui filterCollection — saat user menambahkan "Todo block", hanya todoItems yang akan muncul di daftar pemilihan collection, tidak akan muncul collection lain yang tidak terkait.

Langkah 5: Membuat Component Field Kustom (Client)
Buat src/client-v2/models/PriorityFieldModel.tsx. Merender Field priority dengan Tag berwarna jauh lebih intuitif daripada teks biasa:

Setelah didaftarkan, di konfigurasi kolom priority pada tabel, di dropdown menu "Component Field" Anda dapat berpindah ke "Priority tag".
Langkah 6: Membuat Tombol Action Kustom (Client)
Buat src/client-v2/models/NewTodoActionModel.tsx. Setelah klik tombol "New Todo", buka dialog dengan ctx.viewer.dialog(), isi form lalu buat record:

Beberapa poin penting:
ActionSceneEnum.collection— Tombol muncul di action bar atas Blockon: 'click'— Mendengarkan eventclicktombol melaluiregisterFlowctx.viewer.dialog()— Kapabilitas dialog built-in NocoBase,contentmenerima sebuah function, parameterviewdapat memanggilview.close()untuk menutup dialogresource.create(values)— Memanggil interface create collection untuk membuat record, setelah dibuat tabel akan otomatis refreshobservable+observer— Menggunakan manajemen state reaktif dari flow-engine sebagai penggantiuseState, Component akan otomatis merespons perubahanformState.loading
Langkah 7: Menambahkan File Multibahasa
Edit file terjemahan di src/locale/ plugin:
Pertama kali menambahkan file bahasa perlu restart aplikasi agar berlaku.
Untuk cara penulisan file terjemahan dan penggunaan tExpr() lebih lanjut, lihat i18n Internasionalisasi.
Langkah 8: Mendaftarkan di Plugin (Client)
Edit src/client-v2/plugin.tsx. Perlu melakukan dua hal: mendaftarkan model, dan mendaftarkan todoItems ke data source client.
Mendaftarkan tabel data secara manual melalui addCollection di code plugin adalah praktik yang jarang dilakukan, di sini hanya untuk mendemonstrasikan alur frontend-backend lengkap. Dalam proyek nyata, tabel data biasanya dibuat dan dikonfigurasi oleh user di antarmuka NocoBase, atau dikelola melalui API / MCP, dll., dan tidak perlu didaftarkan secara eksplisit di code client plugin.
Tabel yang didefinisikan melalui defineCollection adalah tabel internal server, secara default tidak akan muncul di daftar pemilihan collection Block. Setelah didaftarkan secara manual melalui addCollection, user dapat memilih todoItems saat menambahkan Block.

Beberapa poin penting:
registerModelLoaders— Mendaftarkan tiga model dengan lazy loading: Block, Field, Actionthis.app.eventBus— Event bus level aplikasi, digunakan untuk mendengarkan event lifecycle- Event
dataSource:loaded— Dipicu setelah data source selesai dimuat. Harus memanggiladdCollectiondi callback event ini, karenaensureLoaded()berjalan setelahload(), dan akan menghapus semua collection terlebih dahulu sebelum mengatur ulang — memanggiladdCollectionlangsung diload()akan ditimpa addCollection()— Mendaftarkan collection ke data source client. Field perlu memiliki propertiinterfacedanuiSchema, sehingga NocoBase tahu cara merendernyafilterTargetKey: 'id'— Harus diatur, menentukan Field yang digunakan untuk identifier unik record (biasanya primary key). Jika tidak diatur, collection tidak akan muncul di daftar pemilihan collection BlockdefineCollectiondi server bertanggung jawab membuat tabel fisik dan ORM mapping,addCollectiondi client bertanggung jawab memberi tahu UI tentang keberadaan tabel ini — keduanya bekerja sama untuk menyelesaikan integrasi frontend-backend
Langkah 9: Mengaktifkan Plugin
Setelah diaktifkan:
- Buat halaman baru, klik "Tambah Block", pilih "Todo block", ikat ke collection
todoItems - Tabel akan secara otomatis memuat data, menampilkan kolom Field, paginasi, dll.
- Di "Konfigurasi Action" tambahkan tombol "New todo", klik untuk membuka dialog mengisi form dan membuat record
- Di "Component Field" pada kolom priority pindah ke "Priority tag", priority akan ditampilkan dengan Tag berwarna
Source Code Lengkap
- @nocobase-example/plugin-custom-table-block-resource — Contoh lengkap plugin manajemen data frontend-backend terintegrasi
Ringkasan
Kapabilitas yang digunakan dalam contoh ini:
Tautan Terkait
- Menulis Plugin Pertama Anda — Membuat skeleton plugin dari nol
- Ikhtisar FlowEngine — Penggunaan dasar FlowModel dan registerFlow
- FlowEngine → Ekstensi Block — BlockModel, TableBlockModel
- FlowEngine → Ekstensi Field — ClickableFieldModel, bindModelToInterface
- FlowEngine → Ekstensi Action — ActionModel, ActionSceneEnum
- Membuat Block Tampilan Kustom — Contoh dasar BlockModel
- Membuat Component Field Kustom — Contoh dasar FieldModel
- Membuat Tombol Action Kustom — Contoh dasar ActionModel
- Ikhtisar Pengembangan Server — Dasar plugin server
- Server → Collections — defineCollection dan addCollection
- Cheat Sheet Resource API — Signature method lengkap MultiRecordResource / SingleRecordResource
- Plugin — Entry point Plugin dan lifecycle load()
- i18n Internasionalisasi — Cara menulis file terjemahan dan penggunaan tExpr
- Server → ACL — Konfigurasi hak akses
- Server → Plugin — Lifecycle plugin server
- Context → Kapabilitas Umum — ctx.viewer, ctx.message, dll.
- Pengembangan Component — Penggunaan Antd Form dan Component lainnya
- Dokumentasi FlowEngine Lengkap — Referensi lengkap FlowModel, Flow, Context

