statikbe / laravel-filament-flexible-content-blocks

The Laravel Filament Flexible Content Blocks package helps you to easily create content in Filament for any model, with predefined or custom blocks, and foreach block an extendable Blade view component.
MIT License
109 stars 18 forks source link

Trying to create a translatable page I got error when adding image blocks #43

Open faridsa opened 1 month ago

faridsa commented 1 month ago

I'm using Filament for a website backend and I'm wishing to give a try to Filament Flexible Content Blocks, which seems very useful to me. I'm running into troubles when creating a translatable page resource, just as the documentation state.

Error occurs when adding blocks that involves images in create or edit page:

Method Statikbe\FilamentFlexibleContentBlocks\Filament\Form\Fields\Blocks\BlockSpatieMediaLibraryFileUpload::filterMediaUsing does not exist.

My composer json:

        "bezhansalleh/filament-shield": "^3.2",
        "filament/filament": "^3.2",
        "filament/spatie-laravel-media-library-plugin": "^3.2",
        "filament/spatie-laravel-translatable-plugin": "^3.2",
        "joshembling/image-optimizer": "^1.4",
        "inertiajs/inertia-laravel": "^1.0",
        "laravel/framework": "^11.9",
        "laravel/sanctum": "^4.0",
        "laravel/tinker": "^2.9",
        "mcamara/laravel-localization": "^2.0",
        "spatie/laravel-sitemap": "^7.0",
        "spatie/laravel-translatable": "^6.5",
        "statikbe/laravel-filament-chained-translation-manager": "^3.2",
        "statikbe/laravel-filament-flexible-content-blocks": "*",
        "tightenco/ziggy": "^2.0"

My Page model:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
use Spatie\MediaLibrary\HasMedia;
use Statikbe\FilamentFlexibleContentBlocks\Models\Concerns\HasAuthorAttributeTrait;
use Statikbe\FilamentFlexibleContentBlocks\Models\Concerns\HasCodeTrait;
use Statikbe\FilamentFlexibleContentBlocks\Models\Concerns\HasDefaultContentBlocksTrait;
use Statikbe\FilamentFlexibleContentBlocks\Models\Concerns\HasHeroImageAttributesTrait;
use Statikbe\FilamentFlexibleContentBlocks\Models\Concerns\HasTranslatedContentBlocksTrait;
use Statikbe\FilamentFlexibleContentBlocks\Models\Concerns\HasTranslatedHeroImageAttributesTrait;
use Statikbe\FilamentFlexibleContentBlocks\Models\Concerns\HasTranslatedIntroAttributeTrait;
use Statikbe\FilamentFlexibleContentBlocks\Models\Concerns\HasTranslatedOverviewAttributesTrait;
use Statikbe\FilamentFlexibleContentBlocks\Models\Concerns\HasTranslatedPageAttributesTrait;
use Statikbe\FilamentFlexibleContentBlocks\Models\Concerns\HasTranslatedSEOAttributesTrait;
use Statikbe\FilamentFlexibleContentBlocks\Models\Concerns\HasTranslatedSlugAttributeTrait;
use Statikbe\FilamentFlexibleContentBlocks\Models\Contracts\HasCode;
use Statikbe\FilamentFlexibleContentBlocks\Models\Contracts\HasContentBlocks;
use Statikbe\FilamentFlexibleContentBlocks\Models\Contracts\HasHeroImageAttributes;
use Statikbe\FilamentFlexibleContentBlocks\Models\Contracts\HasIntroAttribute;
use Statikbe\FilamentFlexibleContentBlocks\Models\Contracts\HasMediaAttributes;
use Statikbe\FilamentFlexibleContentBlocks\Models\Contracts\HasOverviewAttributes;
use Statikbe\FilamentFlexibleContentBlocks\Models\Contracts\HasPageAttributes;
use Statikbe\FilamentFlexibleContentBlocks\Models\Contracts\HasSEOAttributes;
use Statikbe\FilamentFlexibleContentBlocks\Models\Contracts\Linkable;

class Page extends Model implements
    HasContentBlocks,
    HasHeroImageAttributes,
    HasIntroAttribute,
    HasMedia,
    HasMediaAttributes,
    HasOverviewAttributes,
    HasPageAttributes,
    HasSEOAttributes,
    Linkable,
    HasCode

{
    use HasAuthorAttributeTrait;
    use HasDefaultContentBlocksTrait;
    use HasFactory;
    use HasTranslatedHeroImageAttributesTrait;
    use HasTranslatedContentBlocksTrait;
    use HasTranslatedIntroAttributeTrait;
    use HasTranslatedOverviewAttributesTrait;
    use HasTranslatedPageAttributesTrait;
    use HasTranslatedSEOAttributesTrait;
    use HasTranslatedSlugAttributeTrait;
    use HasCodeTrait;

    public function getViewUrl(?string $locale = null): string
     {
        //toggle the locale to make sure the slug gets translated:
        $currentLocale = app()->getLocale();
        $locale = $locale ?? $currentLocale;

        $url = LaravelLocalization::getLocalizedUrl($locale, route('home')) . '/' . $this->translate('slug', $locale);

        return $url;
    }

     public function getPreviewUrl(?string $locale = null): string
    {
        return $this->getViewUrl($locale);
    }
}

And my PageResource

<?php

namespace App\Filament\Resources;

use App\Filament\Resources\PageResource\Pages\CreatePage;
use App\Filament\Resources\PageResource\Pages\EditPage;
use App\Filament\Resources\PageResource\Pages\ListPages;
use App\Models\Page;
use Filament\Forms\Components\Tabs;
use Filament\Forms\Components\Tabs\Tab;
use Filament\Forms\Form;
use Filament\Resources\Concerns\Translatable;
use Filament\Resources\Resource;
use Filament\Tables\Table;
use Filament\Tables;
use Statikbe\FilamentFlexibleContentBlocks\Filament\Form\Fields\AuthorField;
use Statikbe\FilamentFlexibleContentBlocks\Filament\Form\Fields\CodeField;
use Statikbe\FilamentFlexibleContentBlocks\Filament\Form\Fields\ContentBlocksField;
use Statikbe\FilamentFlexibleContentBlocks\Filament\Form\Fields\Groups\HeroImageSection;
use Statikbe\FilamentFlexibleContentBlocks\Filament\Form\Fields\Groups\OverviewFields;
use Statikbe\FilamentFlexibleContentBlocks\Filament\Form\Fields\Groups\PublicationSection;
use Statikbe\FilamentFlexibleContentBlocks\Filament\Form\Fields\Groups\SEOFields;
use Statikbe\FilamentFlexibleContentBlocks\Filament\Form\Fields\IntroField;
use Statikbe\FilamentFlexibleContentBlocks\Filament\Form\Fields\SlugField;
use Statikbe\FilamentFlexibleContentBlocks\Filament\Form\Fields\TitleField;
use Statikbe\FilamentFlexibleContentBlocks\Filament\Table\Actions\PublishAction;
use Statikbe\FilamentFlexibleContentBlocks\Filament\Table\Actions\ViewAction;
use Statikbe\FilamentFlexibleContentBlocks\Filament\Table\Columns\PublishedColumn;
use Statikbe\FilamentFlexibleContentBlocks\Filament\Table\Columns\TitleColumn;
use Statikbe\FilamentFlexibleContentBlocks\Filament\Table\Filters\PublishedFilter;

class PageResource extends Resource
{
    use Translatable;

    protected static ?string $model = Page::class;

    protected static ?string $recordRouteKeyName = 'id';

    protected static ?string $navigationIcon = 'heroicon-o-document';
    protected static ?int $navigationSort = 1;
    protected static ?string $navigationLabel = 'Paginas';
    protected static ?string $modelLabel = 'Pagina';
    protected static ?string $pluralModelLabel = 'Paginas';

    public static function form(Form $form): Form
    {
        return $form
            ->schema([
                Tabs::make('Heading')
                    ->columnSpan(2)
                    ->tabs([
                        Tab::make('General')
                            ->schema([
                                TitleField::create()->label('Título'),
                                SlugField::create(false),
                                HeroImageSection::create(),
                                IntroField::create()->label('Texto inicial'),
                                \Filament\Forms\Components\Toggle::make('published')
                                    ->label('Estado (Borrador / Publicado)')
                                    ->required(),
                            ]),
                        Tab::make('Contenido')
                            ->schema([
                                ContentBlocksField::create(),
                            ]),

                    ]),

            ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                TitleColumn::create(),
                Tables\Columns\ToggleColumn::make('published')
                    ->sortable(),
            ])
            ->filters([
                PublishedFilter::create(),
            ])
            ->actions([
                Tables\Actions\EditAction::make(),
                Tables\Actions\ViewAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\DeleteBulkAction::make(),
            ]);
    }

    public static function getRelations(): array
    {
        return [
            //
        ];
    }

    public static function getPages(): array
    {
        return [
            'index' => ListPages::route('/'),
            'create' => CreatePage::route('/create'),
            'edit' => EditPage::route('/{record:id}/edit'),
        ];
    }
}
sten commented 1 month ago

Hi,

I am currently on holidays without my laptop. Right before I left, we noticed that some breaking changes were made to the filament media library package. I need to investigate this further but did not have time. I think filament v3.3.23 or lower should still work.

For now you can try to set filament to these versions. Sorry for the inconvenience.