whitecube / nova-flexible-content

Flexible Content & Repeater Fields for Laravel Nova
MIT License
787 stars 232 forks source link

Working with spatie/laravel-medialibrary and ebess/advanced-nova-media-library #25

Closed davimug closed 5 years ago

davimug commented 5 years ago

Hi there,

This looks like a great package - just wondering if anyone has had any luck getting Spatie's Media Library working with the Nova Media Library package? If not, can anyone suggest a place to start in getting these two packages working with flexible content nicely?

Thanks!

voidgraphics commented 5 years ago

Hi! Is there an error when you try to put the media library field inside a flexible field? If so, can you post it here? I have not used these packages myself but after a quick glance they seem to work like other fields.

davimug commented 5 years ago

@voidgraphics the error is as follows:

[2019-05-14 11:49:16] local.ERROR: Call to a member function getMedia() on array {"userId":1,"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): Call to a member function getMedia() on array at /home/vagrant/code/laravel-page-builder-test/vendor/ebess/advanced-nova-media-library/src/Fields/Media.php:208)
[stacktrace]
#0 /home/vagrant/code/laravel-page-builder-test/vendor/whitecube/nova-flexible-content/src/Layouts/Layout.php(179): Ebess\\AdvancedNovaMediaLibrary\\Fields\\Media->resolve(Array)
#1 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Support/Collection.php(475): Whitecube\\NovaFlexibleContent\\Layouts\\Layout->Whitecube\\NovaFlexibleContent\\Layouts\\{closure}(Object(Ebess\\AdvancedNovaMediaLibrary\\Fields\\Images), 0)
#2 /home/vagrant/code/laravel-page-builder-test/vendor/whitecube/nova-flexible-content/src/Layouts/Layout.php(180): Illuminate\\Support\\Collection->each(Object(Closure))
#3 /home/vagrant/code/laravel-page-builder-test/vendor/whitecube/nova-flexible-content/src/Layouts/Layout.php(274): Whitecube\\NovaFlexibleContent\\Layouts\\Layout->resolve()
#4 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Support/Collection.php(1926): Whitecube\\NovaFlexibleContent\\Layouts\\Layout->jsonSerialize()
#5 [internal function]: Illuminate\\Support\\Collection->Illuminate\\Support\\{closure}(Object(Whitecube\\NovaFlexibleContent\\Layouts\\Layout))
#6 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Support/Collection.php(1934): array_map(Object(Closure), Array)
#7 [internal function]: Illuminate\\Support\\Collection->jsonSerialize()
#8 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Http/JsonResponse.php(71): json_encode(Array, 0)
#9 /home/vagrant/code/laravel-page-builder-test/vendor/symfony/http-foundation/JsonResponse.php(50): Illuminate\\Http\\JsonResponse->setData(Array)
#10 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Http/JsonResponse.php(31): Symfony\\Component\\HttpFoundation\\JsonResponse->__construct(Array, 200, Array)
#11 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/ResponseFactory.php(95): Illuminate\\Http\\JsonResponse->__construct(Array, 200, Array, 0)
#12 /home/vagrant/code/laravel-page-builder-test/nova/src/Http/Controllers/CreationFieldController.php(23): Illuminate\\Routing\\ResponseFactory->json(Array)
#13 [internal function]: Laravel\\Nova\\Http\\Controllers\\CreationFieldController->index(Object(Laravel\\Nova\\Http\\Requests\\NovaRequest), 'articles')
#14 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): call_user_func_array(Array, Array)
#15 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction('index', Array)
#16 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Route.php(219): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(Laravel\\Nova\\Http\\Controllers\\CreationFieldController), 'index')
#17 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Route.php(176): Illuminate\\Routing\\Route->runController()
#18 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Router.php(680): Illuminate\\Routing\\Route->run()
#19 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#20 /home/vagrant/code/laravel-page-builder-test/nova/src/Http/Middleware/Authorize.php(18): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#21 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Laravel\\Nova\\Http\\Middleware\\Authorize->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#22 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#23 /home/vagrant/code/laravel-page-builder-test/nova/src/Http/Middleware/BootTools.php(20): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#24 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Laravel\\Nova\\Http\\Middleware\\BootTools->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#25 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#26 /home/vagrant/code/laravel-page-builder-test/nova/src/Http/Middleware/DispatchServingNovaEvent.php(20): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#27 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Laravel\\Nova\\Http\\Middleware\\DispatchServingNovaEvent->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#28 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#29 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(43): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#30 /home/vagrant/code/laravel-page-builder-test/nova/src/Http/Middleware/Authenticate.php(31): Illuminate\\Auth\\Middleware\\Authenticate->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#31 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Laravel\\Nova\\Http\\Middleware\\Authenticate->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#32 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#33 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#34 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#35 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#36 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(75): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#37 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#38 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#39 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#40 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#41 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#42 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(56): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#43 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#44 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#45 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#46 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#47 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#48 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(66): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#49 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#50 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#51 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(104): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#52 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Router.php(682): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#53 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Router.php(657): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request))
#54 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Router.php(623): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route))
#55 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Router.php(612): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request))
#56 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(176): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request))
#57 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request))
#58 /home/vagrant/code/laravel-page-builder-test/nova/src/Http/Middleware/ServeNova.php(26): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#59 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Laravel\\Nova\\Http\\Middleware\\ServeNova->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#60 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#61 /home/vagrant/code/laravel-page-builder-test/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#62 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Fideloper\\Proxy\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#63 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#64 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#65 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#66 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#67 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#68 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#69 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#70 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#71 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#72 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#73 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(62): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#74 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#75 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#76 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(104): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#77 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(151): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#78 /home/vagrant/code/laravel-page-builder-test/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))
#79 /home/vagrant/code/laravel-page-builder-test/public/index.php(55): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))
#80 {main}
"} 

The Article resource looks like this:

<?php
namespace App\Nova;
use Laravel\Nova\Fields\ID;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\Text;
use Whitecube\NovaFlexibleContent\Flexible;
use Ebess\AdvancedNovaMediaLibrary\Fields\Images;
class Article extends Resource
{
    ...
    public function fields(Request $request)
    {
        return [
            ID::make()->sortable(),
            Text::make('title'),
            Flexible::make('Content')
                ->addLayout('Carousel', 'carousel', [
                    Images::make('Main image', 'main') // second parameter is the media collection name
                    ->thumbnail('thumb') // conversion used to display the image
                    ->rules('required'), // validation rules
                ])
        ];
    }
    ...
}

and the Article model looks like this:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Spatie\MediaLibrary\HasMedia\HasMediaTrait;
use Spatie\MediaLibrary\HasMedia\HasMedia;
use Spatie\MediaLibrary\Models\Media;

class Article extends Model implements HasMedia
{
    use HasMediaTrait;
    protected $guarded = ['id'];

    public function registerMediaConversions(Media $media = null)
    {
        $this->addMediaConversion('thumb')
            ->width(130)
            ->height(130);
    }

    public function registerMediaCollections()
    {
        $this->addMediaCollection('main')->singleFile();
        $this->addMediaCollection('my_multi_collection');
    }
}

Thanks!

voidgraphics commented 5 years ago

I think you probably should use the multiple method on the Images field rather than have a flexible field. The field already allows you to upload multiple files which is what you're trying to do here to make your carousel it seems.

That aside, while I haven't tested your code, I can see a problem : you're calling addMediaCollection('main') which suggests your media is stored in an attribute called main.

However, you don't have a main attribute on your Article model, as it is within the flexible field. Maybe you could try a getMainAttribute accessor that goes fetch that data within the flexible field. But I do recommend you use the multiple method on your Images field instead if possible.

voidgraphics commented 5 years ago

I will close this as I don't think it's an issue with our package.

davimug commented 5 years ago

Hi @voidgraphics,

Thanks for your response. I agree that for the use case of a carousel it probably would make more sense to use the advance media library's multiple functionality. However, I chose this case just as an example. You can see a new use case here:

Nova/Article.php

 Flexible::make('Article Body')
                ->addLayout('Image Block', 'image_block', [
                    Images::make('Example image', 'images') // second parameter is the media collection name
                    ->thumbnail('thumb') // conversion used to display the image
                    ->rules('required')
                ])

I don't believe the parameter when calling the Images make method refers to an attribute on the Article model. I think it references a "virtual collection" for each model which essentially groups a model's media in the database.

As you suggested I modified the Article's model to look as follows:

    public function registerMediaCollections()
    {
        $this->addMediaCollection('images');
        $this->addMediaCollection('my_multi_collection');
    }

    public function getImagesAttribute()
    {
        dd('Images is called');
    }

When I ran this, I was receiving the same ->getMedia() on array error rather than seeing that method called.

voidgraphics commented 5 years ago

I see. As I said, I'm not familiar with these packages so I was speculating. Also, while it may not be what's causing that particular error, I'm pretty sure it will still be problematic, since I doubt these packages will know to go look within the flexible field.

Sadly I can't be more helpful right now. I'll let you know if I can figure it out when I have some time for it.

davimug commented 5 years ago

No worries - was only asking in case you had previous experience in getting something like this to work. Anyhow, thanks for taking a look - much appreciated!

yaroslawww commented 4 years ago

Faced the same problem. Then I created an adapter and it works in my case

use Spatie\MediaLibrary\Conversion\Conversion;
use Spatie\MediaLibrary\HasMedia\HasMedia;
use Spatie\MediaLibrary\Models\Media;

trait LayoutHasMedia
{

    protected HasMedia $_layoutResourceWithMedia;

    public function setMediaResource($resourceWithMedia)
    {
        if (!($resourceWithMedia instanceof HasMedia)) {
            throw new \Exception('resourceWithMedia should implement HasMedia interface');
        }
        $this->_layoutResourceWithMedia = $resourceWithMedia;

        return $this;
    }

    public function getMediaResource(): HasMedia
    {
        return $this->_layoutResourceWithMedia;
    }

    public function media()
    {
        return $this->getMediaResource()->media();
    }

    public function addMedia($file)
    {
        return $this->getMediaResource()->addMedia($file);
    }

    public function copyMedia($file)
    {
        return $this->getMediaResource()->copyMedia($file);
    }

    public function hasMedia(string $collectionMedia = ''): bool
    {
        return $this->getMediaResource()->hasMedia($collectionMedia);
    }

    public function getMedia(string $collectionName = 'default', $filters = [])
    {
        return $this->getMediaResource()->getMedia($collectionName, $filters);
    }

    public function clearMediaCollection(string $collectionName = 'default')
    {
        return $this->getMediaResource()->clearMediaCollection($collectionName);
    }

    public function clearMediaCollectionExcept(string $collectionName = 'default', $excludedMedia = [])
    {
        return $this->getMediaResource()->clearMediaCollectionExcept($collectionName, $excludedMedia);
    }

    public function shouldDeletePreservingMedia()
    {
        return $this->getMediaResource()->shouldDeletePreservingMedia();
    }

    public function loadMedia(string $collectionName)
    {
        return $this->getMediaResource()->loadMedia($collectionName);
    }

    public function addMediaConversion(string $name): Conversion
    {
        return $this->getMediaResource()->addMediaConversion($name);
    }

    public function registerMediaConversions(Media $media = null)
    {
        return $this->getMediaResource()->registerMediaConversions($media);
    }

    public function registerMediaCollections()
    {
        return $this->getMediaResource()->registerMediaCollections();
    }

    public function registerAllMediaConversions()
    {
        return $this->getMediaResource()->registerAllMediaConversions();
    }
}
use YourAppNamespace\LayoutHasMedia;
use Spatie\MediaLibrary\HasMedia\HasMedia;
use Whitecube\NovaFlexibleContent\Layouts\Layout;

abstract class LayoutWithMedia extends Layout implements HasMedia
{

    use LayoutHasMedia;

    public function duplicateAndHydrate($key, array $attributes = [])
    {
        /** @var static $instance */
        $instance = parent::duplicateAndHydrate($key, $attributes);
        return $instance->setMediaResource($this->_layoutResourceWithMedia);
    }

}

Now you can create layout and extend LayoutWithMedia like:

class SeoFields extends LayoutWithMedia
{

    /**
     * The layout's unique identifier
     *
     * @var string
     */
    protected $name = 'seo_fields';

    /**
     * The displayed title
     *
     * @var string
     */
    protected $title = 'Seo Fields';

    /**
     * Get the fields displayed by the layout.
     *
     * @return array
     */
    public function fields()
    {
        return [
            Text::make('Seo title', 'seo_title'),
            Textarea::make('Seo description', 'seo_description'),
            Text::make('Seo keywords', 'seo_keywords'),
            Images::make('Seo image', 'seo_image')
                ->conversionOnIndexView('thumb')
                ->withResponsiveImages()
                ->enableExistingMedia(),
        ];
    }
}

and add your layout:

->addLayout((new SeoFields)->setMediaResource($this->resource))