Ini adalah website personal Selamat M. Harjono

Kata-Kata Hari Ini

"ALAH BISA KARENA BIASA"

450
Des 22
Bootcamp HMMI dengan Tema "Personal Blog & Portfolio Management System" - Modul Backend Development

Bootcamp HMMI dengan Tema "Personal Blog & Portfolio Management System" - Modul Backend Development

Senin, 22 Desember 2025 | oleh Selamat Muliyadi Harjono | Modul


Buat Project Laravel

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

Modifikasi File .env

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.

Install Filament & Panel Admin

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. 

Model & Migration di Laravel

Kita sudah memiliki analisa database untuk project kita sebagai berikut:

ERD Web Portofolio

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 :

Laravel Naming Standard

Modifikasi File Migration

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


Unguard Model 

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();
    }


Modifikasi File Model 

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);
    }


Membuat Resource (CRUD) Filament per Model 

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


Membuat Navigation Group Order

Buka file : app/Providers/Filament/AdminPanelProvider.php

Tambahkan coding berikut:

            ->navigationGroups([
                'Data Master',
                'Resume',
                'Tulisan',
            ])


Membuat Navigation Group & Sorting di Resource

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.

Memodifikasi Resource Form & Tabel

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),
            ])


Modifikasi Avatar Panel

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 -




Dilihat

450 kali

Trending

14