Ini adalah website personal Selamat M. Harjono
Senin, 22 Desember 2025 | oleh Selamat Muliyadi Harjono | Modul
Karena kita menggunakan Laravel Herd, maka proses pembuatan project akan lebih mudah tanpa harus mengetikkan perintah-perintah php artisan. Silahkan buat project dengan nama `portofolio-ku` dengan pilihan No Starter Kit.
Jalankan perintah berikut di terminal:
php artisan storage:link
Setelah project berhasil dibuat, coba jalankan di browser untuk memastikan apakah project dapat di running tanpa ada masalah. Jika tidak ada masalah maka langkah selanjutnya adalah kita modifikasi file .env yang berisi data-data project laravel kita. Beberapa data yang akan kita modifikasi di file .env:
APP_NAME="Website Portofolio Selamat M. Harjono" APP_LOCALE=id APP_FALLBACK_LOCALE=id APP_FAKER_LOCALE=id_ID
Karena untuk praktek ini kita tidak menggunakan mysql, maka cukup itu saja yang diubah di file .env.
Kita akan menggunakan filament terbaru yaitu versi 4. Ketikkan perintah berikut diterminal:
composer require filament/filament:"^4.0" php artisan filament:install --panels
Jika ada permintaan untuk memasukkan nama panel, silahkan diisi sesuai dengan keininan kita. Untuk project ini kita beri nama panel `admin`.
Kita lanjut untuk membuat user agar dapat login ke panel admin yang kita buat dengan jalankan perintah berikut:
php artisan make:filament-user
Harap diingat email dan password yang kita berikan.
Kita sudah memiliki analisa database untuk project kita sebagai berikut:
Dari analisa diatas, maka model dan migration yang akan kita buat adalah sebanya 15. Jalankan perintah berikut satu per satu secara berurutan:
php artisan make:migration add_columns_to_users_table --table=users php artisan make:model KategoriPost -m php artisan make:model JenisSertifikat -m php artisan make:model JenisPortofolio -m php artisan make:model Tag -m php artisan make:model Post -m php artisan make:model PostTag -m php artisan make:model RiwayatPendidikan -m php artisan make:model PengalamanBerorganisasi -m php artisan make:model PengalamanKerja -m php artisan make:model Sertifikat -m php artisan make:model Portofolio -m php artisan make:model JenisSkill -m php artisan make:model Skill -m php artisan make:model Gallery -m
php artisan make:model adalah perintah untuk membuat Model di laravel, kemudian yang paling belakang ada perintah -m yang berarti untuk membuat file migration sekaligus.
Pada bagian pertama itu adalah perintah untuk menambahkan kolom di database, karena laravel secara default sudah membuat tabel user.
Standarisasi penamaan Model, Migration, Database/Table pada laravel untuk project kita ini :
File migration ada di direktori:
database/migration/
1. Modifikasi coding pada file ..._add_columns_to_users_table.php menjadi berikut:
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
//
$table->string('avatar_url')->nullable();
$table->string('profesi')->nullable();
$table->string('profil_singkat',500)->nullable();
$table->text('profil_lengkap')->nullable();
$table->string('alamat')->nullable();
$table->string('no_telp')->nullable();
$table->string('linkedin')->nullable();
$table->string('facebook')->nullable();
$table->string('twitter')->nullable();
$table->string('instagram')->nullable();
$table->string('tiktok')->nullable();
$table->string('youtube')->nullable();
});
}2. Modifikasi coding pada file ..._create_kategori_posts_table.php
public function up(): void
{
Schema::create('kategori_posts', function (Blueprint $table) {
$table->id();
$table->string('nama');
$table->string('slug')->unique();
$table->string('keterangan')->nullable();
$table->timestamps();
});
}3. Modifikasi coding pada file ..._create_jenis_sertifikats_table.php
public function up(): void
{
Schema::create('jenis_sertifikats', function (Blueprint $table) {
$table->id();
$table->string('nama');
$table->string('slug')->unique();
$table->string('keterangan')->nullable();
$table->timestamps();
});
}
4. Modifikasi coding pada file ..._create_jenis_portofolios_table.php
public function up(): void
{
Schema::create('jenis_portofolios', function (Blueprint $table) {
$table->id();
$table->string('nama');
$table->string('slug')->unique();
$table->string('keterangan')->nullable();
$table->timestamps();
});
}5. Modifikasi coding pada file ..._create_tags_table.php
public function up(): void
{
Schema::create('tags', function (Blueprint $table) {
$table->id();
$table->string('nama');
$table->string('slug')->unique();
$table->string('keterangan')->nullable();
$table->timestamps();
});
}6. Modifikasi coding pada file ..._create_posts_table.php
public function up(): void
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->foreignId('kategori_post_id')->constrained('kategori_posts')->cascadeOnDelete();
$table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
$table->string('judul');
$table->string('slug')->unique();
$table->string('thumbnail');
$table->text('isi_singkat');
$table->mediumText('isi_lengkap');
$table->integer('dilihat')->default(0);
$table->integer('disukai')->default(0);
$table->enum('featured',['Ya','Tidak'])->default('Tidak');
$table->enum('status',['Draft','Published'])->default('Draft');
$table->timestamps();
});
}
7. Modifikasi coding pada file ..._create_post_tags_table.php
public function up(): void
{
Schema::create('post_tags', function (Blueprint $table) {
$table->id();
$table->foreignId('post_id')->constrained('posts')->cascadeOnDelete();
$table->foreignId('tag_id')->constrained('tags')->cascadeOnDelete();
$table->timestamps();
});
}
8. Modifikasi coding pada file ..._create_riwayat_pendidikans_table.php
public function up(): void
{
Schema::create('riwayat_pendidikans', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
$table->string('nama');
$table->year('tahun_mulai');
$table->year('tahun_selesai');
$table->string('lembaga');
$table->mediumText('deskripsi')->nullable();
$table->timestamps();
});
}
9. Modifikasi coding pada file ..._create_pengalaman_berorganisasis_table.php
public function up(): void
{
Schema::create('pengalaman_berorganisasis', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
$table->string('nama');
$table->year('tahun_mulai');
$table->year('tahun_selesai');
$table->string('organisasi');
$table->mediumText('deskripsi')->nullable();
$table->timestamps();
});
}
10. Modifikasi coding pada file ..._create_pengalaman_kerjas_table.php
public function up(): void
{
Schema::create('pengalaman_kerjas', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
$table->string('nama');
$table->year('tahun_mulai');
$table->year('tahun_selesai');
$table->string('tempat_kerja');
$table->mediumText('deskripsi')->nullable();
$table->timestamps();
});
}
11. Modifikasi coding pada file ..._create_sertifikats_table.php
public function up(): void
{
Schema::create('sertifikats', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
$table->foreignId('jenis_sertifikat_id')->constrained('jenis_sertifikats')->cascadeOnDelete();
$table->string('nama');
$table->year('tahun');
$table->string('penyelenggara');
$table->mediumText('deskripsi')->nullable();
$table->string('file')->nullable();
$table->timestamps();
});
}
12. Modifikasi coding pada file ..._create_tags_table.php
public function up(): void
{
Schema::create('tags', function (Blueprint $table) {
$table->id();
$table->string('nama');
$table->string('slug')->unique();
$table->string('keterangan')->nullable();
$table->timestamps();
});
}
13. Modifikasi coding pada file ..._create_portofolios_table.php
public function up(): void
{
Schema::create('portofolios', function (Blueprint $table) {
$table->id();
$table->foreignId('jenis_portofolio_id')->constrained('jenis_portofolios')->cascadeOnDelete();
$table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
$table->string('judul');
$table->string('slug')->unique();
$table->string('thumbnail');
$table->text('isi_singkat');
$table->mediumText('isi_lengkap');
$table->integer('dilihat')->default(0);
$table->integer('disukai')->default(0);
$table->enum('featured',['Ya','Tidak'])->default('Tidak');
$table->enum('status',['Draft','Published'])->default('Draft');
$table->timestamps();
});
}
14. Modifikasi coding pada file ..._create_jenis_skills_table.php
public function up(): void
{
Schema::create('jenis_skills', function (Blueprint $table) {
$table->id();
$table->string('nama');
$table->string('slug')->unique();
$table->string('keterangan')->nullable();
$table->timestamps();
});
}
15. Modifikasi coding pada file ..._create_skills_table.php
public function up(): void
{
Schema::create('skills', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
$table->foreignId('jenis_skill_id')->constrained('jenis_skills')->cascadeOnDelete();
$table->string('nama');
$table->integer('persen')->default(0);
$table->mediumText('deskripsi')->nullable();
$table->timestamps();
});
}
16. Modifikasi coding pada file ..._create_galleries_table.php
public function up(): void
{
Schema::create('galleries', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
$table->string('photo');
$table->string('nama')->nullable();
$table->string('album');
$table->timestamps();
});
}
Setelah itu, kita akan eksekusi migration ini untuk membuat tabel-tabel yang ada di database dengan perintah:
php artisan migrate
Jika ingin menjalankan migrasi dengan reset database, jalankan perintah berikut:
php artisan migrate:fresh
Proses ini bertujuan agar filament dapat melakukan proses CRUD ke database untuk semua kolom yang ada. Jika kita merasa bahwa ini akan bermasalah pada keamanan data, maka kita harus menambahkan fillable di model laravelnya.
Buka file yang ada di: app/Providers/AppServiceProvider.php
Tambahkan coding berikut:
public function boot(): void
{
//
Model::unguard();
}Model di laravel adalah representasi dari tabel yang ada di database dalam konteks project kita ini. Jika di database memiliki fitur relasi, maka di Model ini juga harus didefinisikan relasi tersebut. Modifikasi file-file model sesuai ketentuan berikut (Model berada di direktori `app/Models/`):
1. Gallery.php
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}2. JenisPortofolio.php
public function portofolios(): HasMany
{
return $this->hasMany(Portofolio::class);
}3. JenisSertifikat.php
public function sertifikats(): HasMany
{
return $this->hasMany(Sertifikat::class);
}4. JenisSkill.php
public function skills(): HasMany
{
return $this->hasMany(Skill::class);
}5. KategoriPost.php
public function posts(): HasMany
{
return $this->hasMany(Post::class);
}6. PengalamanBerorganisasi.php
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}7. PengalamanKerja.php
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}8. Portofolio.php
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
public function jenis_portofolio(): BelongsTo
{
return $this->belongsTo(JenisPortofolio::class);
}9. Post.php
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
public function tags(): BelongsToMany
{
return $this->belongsToMany(Tag::class,'post_tags')->withTimestamps();
}
public function kategori_post(): BelongsTo
{
return $this->belongsTo(KategoriPost::class);
}10. PostTag.php
public function tag(): BelongsTo
{
return $this->belongsTo(Tag::class);
}
public function post(): BelongsTo
{
return $this->belongsTo(Post::class);
}11. RiwayatPendidikan.php
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}12. Sertifikat.php
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
public function jenis_sertifikat(): BelongsTo
{
return $this->belongsTo(JenisSertifikat::class);
}13. Skill.php
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
public function jenis_skill(): BelongsTo
{
return $this->belongsTo(JenisSkill::class);
}14. Tag.php
public function posts(): BelongsToMany
{
return $this->belongsToMany(Post::class,'post_tags')->withTimestamps();
}15. User.php
public function posts(): HasMany
{
return $this->hasMany(Post::class);
}
public function riwayat_pendidikans(): HasMany
{
return $this->hasMany(RiwayatPendidikan::class);
}
public function pengalaman_kerjas(): HasMany
{
return $this->hasMany(PengalamanKerja::class);
}
public function sertifikats(): HasMany
{
return $this->hasMany(Sertifikat::class);
}
public function pengalaman_berorganisasis(): HasMany
{
return $this->hasMany(PengalamanBerorganisasi::class);
}
public function portofolios(): HasMany
{
return $this->hasMany(Portofolio::class);
}
public function galleries(): HasMany
{
return $this->hasMany(Gallery::class);
}Jalankan perintah berikut satu per satu di terminal, jika ada muncul pertanyaan untuk mengisikan kolom, abaikan saja dengan menekan tombol enter:
php artisan make:filament-resource User --generate php artisan make:filament-resource KategoriPost --generate php artisan make:filament-resource JenisSertifikat --generate php artisan make:filament-resource JenisPortofolio --generate php artisan make:filament-resource Tag --generate php artisan make:filament-resource Post --generate php artisan make:filament-resource RiwayatPendidikan --generate php artisan make:filament-resource PengalamanBerorganisasi --generate php artisan make:filament-resource PengalamanKerja --generate php artisan make:filament-resource Sertifikat --generate php artisan make:filament-resource Portofolio --generate php artisan make:filament-resource JenisSkill --generate php artisan make:filament-resource Skill --generate php artisan make:filament-resource Gallery --generate
Buka file : app/Providers/Filament/AdminPanelProvider.php
Tambahkan coding berikut:
->navigationGroups([
'Data Master',
'Resume',
'Tulisan',
])Kita ambil contoh untuk file resource User. User berada di dalam kelompok menu `Data Master` dengan urutan pada kelompok tersebut adalah `1`.
Buka file : app/Filament/Resources/Users/UserResource.php
Tambahkan coding berikut:
protected static string | UnitEnum | null $navigationGroup = 'Data Master';
protected static ?int $navigationSort = 1;Lakukan penyesuaian untuk semua resource yang ada.
1. Resource Users
#Form
Buka file : app\Filament\Resources\Users\Schemas\UserForm.php
Modifikasi menjadi coding berikut:
public static function configure(Schema $schema): Schema
{
return $schema
->components([
FileUpload::make('avatar_url')
->avatar()->visibility('public')->disk('public')
->required(),
TextInput::make('name')
->required()
->columnSpanFull(),
TextInput::make('email')
->label('Email address')
->email()
->required(),
TextInput::make('password')
->password()
->dehydrated(fn ($state) => filled($state))
->required(fn (string $context): bool => $context === 'create'),
TextInput::make('profesi')
->required()->columnSpanFull(),
TextArea::make('profil_singkat')
->required()->columnSpanFull()
->rows(5),
RichEditor::make('profil_lengkap')
->required()->columnSpanFull()
->columnSpanFull(),
TextInput::make('alamat')
->required()->columnSpanFull(),
TextInput::make('no_telp')
->required(),
TextInput::make('linkedin')->columnSpanFull(),
TextInput::make('facebook')->columnSpanFull(),
TextInput::make('twitter')->columnSpanFull(),
TextInput::make('instagram')->columnSpanFull(),
TextInput::make('tiktok')->columnSpanFull(),
TextInput::make('youtube')->columnSpanFull(),
]);
}#Tabel
Buka file : app\Filament\Resources\Users\Tables\UsersTable.php
Modifikasi menjadi coding berikut:
->columns([
ImageColumn::make('avatar_url')
->visibility('public')->disk('public')
->circular(),
TextColumn::make('name')
->searchable(),
TextColumn::make('email')
->label('Email address')
->searchable(),
])2. Resource Galleries
#Form
Buka file : app\Filament\Resources\Galleries\Schemas\GalleryForm.php
Modifikasi menjadi coding berikut:
public static function configure(Schema $schema): Schema
{
return $schema
->components([
Select::make('user_id')
->relationship('user', 'name')
->required(),
FileUpload::make('photo')
->visibility('public')->disk('public')
->required()->image(),
TextInput::make('nama')
->columnSpanFull(),
TextInput::make('album')
->required()
->columnSpanFull(),
]);
}#Tabel
Buka file : app\Filament\Resources\Galleries\Tables\GalleriesTable.php
Modifikasi menjadi coding berikut:
->columns([
TextColumn::make('user.name')
->sortable(),
ImageColumn::make('photo')
->visibility('public')->disk('public'),
TextColumn::make('nama')
->searchable(),
TextColumn::make('album')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])3. Resource JenisPortofolios
#Form
Buka file : app\Filament\Resources\JenisPortofolios\Schemas\JenisPortofolioForm.php
Modifikasi menjadi coding berikut:
public static function configure(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('nama')
->columnSpanFull()
->live(onBlur: true)
->afterStateUpdated(fn (Set $set, ?string $state) => $set('slug', Str::slug($state)))
->required(),
TextInput::make('slug')
->readOnly()
->columnSpanFull()
->required(),
TextInput::make('keterangan')
->columnSpanFull(),
]);
}#Tabel
Buka file : app\Filament\Resources\JenisPortofolios\Tables\JenisPortofoliosTable.php
Modifikasi menjadi coding berikut:
->columns([
TextColumn::make('nama')
->searchable(),
TextColumn::make('slug')
->searchable(),
TextColumn::make('keterangan')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
4. Resource JenisSertifikats
#Form
Buka file : app\Filament\Resources\JenisSertifikats\Schemas\JenisSertifikatForm.php
Modifikasi menjadi coding berikut:
public static function configure(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('nama')
->columnSpanFull()
->live(onBlur: true)
->afterStateUpdated(fn (Set $set, ?string $state) => $set('slug', Str::slug($state)))
->required(),
TextInput::make('slug')
->readOnly()
->columnSpanFull()
->required(),
TextInput::make('keterangan')
->columnSpanFull(),
]);
}#Tabel
Buka file : app\Filament\Resources\JenisSertifikats\Tables\JenisSertifikatsTable.php
Modifikasi menjadi coding berikut:
->columns([
TextColumn::make('nama')
->searchable(),
TextColumn::make('slug')
->searchable(),
TextColumn::make('keterangan')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
5. Resource JenisSkills
#Form
Buka file : app\Filament\Resources\JenisSkills\Schemas\JenisSkillForm.php
Modifikasi menjadi coding berikut:
public static function configure(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('nama')
->columnSpanFull()
->live(onBlur: true)
->afterStateUpdated(fn (Set $set, ?string $state) => $set('slug', Str::slug($state)))
->required(),
TextInput::make('slug')
->readOnly()
->columnSpanFull()
->required(),
TextInput::make('keterangan')
->columnSpanFull(),
]);
}#Tabel
Buka file : app\Filament\Resources\JenisSkills\Tables\JenisSkillsTable.php
Modifikasi menjadi coding berikut:
->columns([
TextColumn::make('nama')
->searchable(),
TextColumn::make('slug')
->searchable(),
TextColumn::make('keterangan')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
6. Resource KategoriPosts
#Form
Buka file : app\Filament\Resources\KategoriPosts\Schemas\KategoriPostForm.php
Modifikasi menjadi coding berikut:
public static function configure(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('nama')
->columnSpanFull()
->live(onBlur: true)
->afterStateUpdated(fn (Set $set, ?string $state) => $set('slug', Str::slug($state)))
->required(),
TextInput::make('slug')
->readOnly()
->columnSpanFull()
->required(),
TextInput::make('keterangan')
->columnSpanFull(),
]);
}#Tabel
Buka file : app\Filament\Resources\KategoriPosts\Tables\KategoriPostsTable.php
Modifikasi menjadi coding berikut:
->columns([
TextColumn::make('nama')
->searchable(),
TextColumn::make('slug')
->searchable(),
TextColumn::make('keterangan')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
7. Resource PengalamanBerorganisasis
#Form
Buka file : app\Filament\Resources\PengalamanBerorganisasis\Schemas\PengalamanBerorganisasiForm.php
Modifikasi menjadi coding berikut:
public static function configure(Schema $schema): Schema
{
return $schema
->components([
Select::make('user_id')
->relationship('user', 'name')
->columnSpanFull()
->required(),
TextInput::make('nama')
->label('Nama Pengalaman')
->columnSpanFull()
->required(),
TextInput::make('tahun_mulai')
->required()
->numeric(),
TextInput::make('tahun_selesai')
->required()
->numeric(),
TextInput::make('organisasi')
->columnSpanFull()
->required(),
Textarea::make('deskripsi')
->rows(5)
->columnSpanFull(),
]);
}#Tabel
Buka file : app\Filament\Resources\PengalamanBerorganisasis\Tables\PengalamanBerorganisasisTable.php
Modifikasi menjadi coding berikut:
->columns([
TextColumn::make('nama')
->searchable(),
TextColumn::make('user.name')
->sortable(),
TextColumn::make('tahun_mulai')
->sortable(),
TextColumn::make('tahun_selesai')
->sortable(),
TextColumn::make('organisasi')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
8. Resource PengalamanKerjas
#Form
Buka file : app\Filament\Resources\PengalamanKerjas\Schemas\PengalamanKerjaForm.php
Modifikasi menjadi coding berikut:
public static function configure(Schema $schema): Schema
{
return $schema
->components([
Select::make('user_id')
->relationship('user', 'name')
->columnSpanFull()
->required(),
TextInput::make('nama')
->label('Nama Pengalaman')
->columnSpanFull()
->required(),
TextInput::make('tahun_mulai')
->required()
->numeric(),
TextInput::make('tahun_selesai')
->required()
->numeric(),
TextInput::make('tempat_kerja')
->columnSpanFull()
->required(),
RichEditor::make('deskripsi')
->columnSpanFull(),
]);
}#Tabel
Buka file : app\Filament\Resources\PengalamanKerjas\Tables\PengalamanKerjasTable.php
Modifikasi menjadi coding berikut:
->columns([
TextColumn::make('user.name')
->sortable(),
TextColumn::make('nama')
->searchable(),
TextColumn::make('tahun_mulai')
->sortable(),
TextColumn::make('tahun_selesai')
->sortable(),
TextColumn::make('tempat_kerja')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
9. Resource Portofolios
#Form
Buka file : app\Filament\Resources\Portofolios\Schemas\PortofolioForm.php
Modifikasi menjadi coding berikut:
public static function configure(Schema $schema): Schema
{
return $schema
->components([
Select::make('jenis_portofolio_id')
->columnSpanFull()
->relationship('jenis_portofolio', 'nama')
->required(),
Select::make('user_id')
->columnSpanFull()
->relationship('user', 'name')
->required(),
TextInput::make('judul')
->columnSpanFull()
->live(onBlur: true)
->afterStateUpdated(fn (Set $set, ?string $state) => $set('slug', Str::slug($state)))
->required(),
TextInput::make('slug')
->columnSpanFull()
->readOnly()
->required(),
FileUpload::make('thumbnail')
->visibility('public')->disk('public')
->required()->image(),
Textarea::make('isi_singkat')
->required()->rows(5)
->columnSpanFull(),
RichEditor::make('isi_lengkap')
->required()
->columnSpanFull(),
Radio::make('featured')
->options([
'Ya' => 'Ya',
'Tidak' => 'Tidak'
]),
Radio::make('status')
->options([
'Draft' => 'Draft',
'Published' => 'Published'
]),
]);
}#Tabel
Buka file : app\Filament\Resources\Portofolios\Tables\PortofoliosTable.php
Modifikasi menjadi coding berikut:
->columns([
ImageColumn::make('thumbnail')
->visibility('public')->disk('public'),
TextColumn::make('judul')
->searchable(),
TextColumn::make('jenis_portofolio.nama')
->sortable(),
TextColumn::make('user.name')
->sortable(),
TextColumn::make('dilihat')
->numeric()
->sortable(),
TextColumn::make('disukai')
->numeric()
->sortable(),
TextColumn::make('featured')
->searchable(),
TextColumn::make('status')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
10. Resource Posts
#Form
Buka file : app\Filament\Resources\Posts\Schemas\PostForm.php
Modifikasi menjadi coding berikut:
public static function configure(Schema $schema): Schema
{
return $schema
->components([
Select::make('kategori_post_id')
->relationship('kategori_post', 'nama')
->required(),
Select::make('user_id')
->relationship('user', 'name')
->required(),
TextInput::make('judul')
->columnSpanFull()
->live(onBlur: true)
->afterStateUpdated(fn (Set $set, ?string $state) => $set('slug', Str::slug($state)))
->required(),
TextInput::make('slug')
->columnSpanFull()
->readOnly()
->required(),
FileUpload::make('thumbnail')
->visibility('public')->disk('public')
->required()->image(),
Textarea::make('isi_singkat')
->required()->rows(5)
->columnSpanFull(),
RichEditor::make('isi_lengkap')
->required()
->columnSpanFull(),
Radio::make('featured')
->options([
'Ya' => 'Ya',
'Tidak' => 'Tidak'
]),
Radio::make('status')
->options([
'Draft' => 'Draft',
'Published' => 'Published'
]),
CheckboxList::make('tags')
->relationship(titleAttribute: 'nama')
]);
}#Tabel
Buka file : app\Filament\Resources\Posts\Tables\PostsTable.php
Modifikasi menjadi coding berikut:
->columns([
ImageColumn::make('thumbnail')
->visibility('public')->disk('public'),
TextColumn::make('judul')
->searchable(),
TextColumn::make('kategori_post.nama')
->sortable(),
TextColumn::make('user.name')
->numeric()
->sortable(),
TextColumn::make('dilihat')
->numeric()
->sortable(),
TextColumn::make('disukai')
->numeric()
->sortable(),
TextColumn::make('featured')
->badge()
->color(fn (string $state): string => match ($state) {
'Ya' => 'success',
'Tidak' => 'danger',
})
->searchable(),
TextColumn::make('status')
->badge()
->color(fn (string $state): string => match ($state) {
'Published' => 'success',
'Draft' => 'warning',
})
->searchable(),
])
11. Resource RiwayatPendidikans
#Form
Buka file : app\Filament\Resources\RiwayatPendidikans\Schemas\RiwayatPendidikanForm.php
Modifikasi menjadi coding berikut:
public static function configure(Schema $schema): Schema
{
return $schema
->components([
Select::make('user_id')
->relationship('user', 'name')
->columnSpanFull()
->required(),
TextInput::make('nama')
->label('Nama/Tingkat Pendidikan')
->columnSpanFull()
->required(),
TextInput::make('tahun_mulai')
->required()
->numeric(),
TextInput::make('tahun_selesai')
->required()
->numeric(),
TextInput::make('lembaga')
->label('Nama Lembaga Pendidikan')
->columnSpanFull()
->required(),
Textarea::make('deskripsi')
->rows(5)
->columnSpanFull(),
]);
}#Tabel
Buka file : app\Filament\Resources\RiwayatPendidikans\Tables\RiwayatPendidikansTable.php
Modifikasi menjadi coding berikut:
->columns([
TextColumn::make('user.name')
->sortable(),
TextColumn::make('nama')
->searchable(),
TextColumn::make('tahun_mulai')
->sortable(),
TextColumn::make('tahun_selesai')
->sortable(),
TextColumn::make('lembaga')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
12. Resource Sertifikats
#Form
Buka file : app\Filament\Resources\Sertifikats\Schemas\SertifikatForm.php
Modifikasi menjadi coding berikut:
public static function configure(Schema $schema): Schema
{
return $schema
->components([
Select::make('user_id')
->relationship('user', 'name')
->columnSpanFull()
->required(),
Select::make('jenis_sertifikat_id')
->relationship('jenis_sertifikat', 'nama')
->columnSpanFull()
->required(),
TextInput::make('nama')
->columnSpanFull()
->label('Nama Sertifikat')
->required(),
TextInput::make('tahun')
->required()
->numeric(),
TextInput::make('penyelenggara')
->columnSpanFull()
->required(),
RichEditor::make('deskripsi')
->columnSpanFull(),
FileUpload::make('file')
->downloadable()
->visibility('public')->disk('public'),
]);
}#Tabel
Buka file : app\Filament\Resources\Sertifikats\Tables\SertifikatsTable.php
Modifikasi menjadi coding berikut:
->columns([
TextColumn::make('user.name')
->sortable(),
TextColumn::make('jenis_sertifikat.nama')
->sortable(),
TextColumn::make('nama')
->label('Nama Sertifikat')
->searchable(),
TextColumn::make('tahun')
->sortable(),
TextColumn::make('penyelenggara')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
13. Resource Skills
#Form
Buka file : app\Filament\Resources\Skills\Schemas\SkillForm.php
Modifikasi menjadi coding berikut:
public static function configure(Schema $schema): Schema
{
return $schema
->components([
Select::make('user_id')
->relationship('user', 'name')
->columnSpanFull()
->required(),
Select::make('jenis_skill_id')
->relationship('jenis_skill', 'nama')
->columnSpanFull()
->required(),
TextInput::make('nama')
->columnSpanFull()
->required(),
TextInput::make('persen')
->required()
->numeric()
->default(0),
Textarea::make('deskripsi')
->rows(5)
->columnSpanFull(),
]);
}#Tabel
Buka file : app\Filament\Resources\Skills\Tables\SkillsTable.php
Modifikasi menjadi coding berikut:
->columns([
TextColumn::make('user.name')
->sortable(),
TextColumn::make('jenis_skill.nama')
->sortable(),
TextColumn::make('nama')
->label('Nama Skill')
->searchable(),
TextColumn::make('persen')
->sortable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
14. Resource Tags
#Form
Buka file : app\Filament\Resources\Tags\Schemas\TagForm.php
Modifikasi menjadi coding berikut:
public static function configure(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('nama')
->columnSpanFull()
->live(onBlur: true)
->afterStateUpdated(fn (Set $set, ?string $state) => $set('slug', Str::slug($state)))
->required(),
TextInput::make('slug')
->readOnly()
->columnSpanFull()
->required(),
TextInput::make('keterangan')
->columnSpanFull(),
]);
}#Tabel
Buka file : app\Filament\Resources\Tags\Tables\TagsTable.php
Modifikasi menjadi coding berikut:
->columns([
TextColumn::make('nama')
->searchable(),
TextColumn::make('slug')
->searchable(),
TextColumn::make('keterangan')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])Buka file app\Models\User.php
Modifikasi nama class menjadi:
class User extends Authenticatable implements FilamentUser, HasAvatar
{
...Tambahkan beberapa function di dalam class tersebut:
public function getFilamentAvatarUrl(): ?string
{
return asset($this->avatar_url);
}
public function canAccessPanel(Panel $panel): bool
{
return true;
}Ikuti langkah-langkah diatas, perhatikan typo saat mengetik untuk menghindari error. Lakukan langkah step by step, simpan file, buka di browser untuk melihat perubahan.
Mudah-mudahan modul ini dapat membantu kita semua untuk memahami hal yang paling umum yang terjadi di backend dan bagaimana cara membangunnya.
Semoga bermanfaat.
Terimakasih,
- Memet -