Multiple Images

Для прикрСплСния ΠΊ рСсурсу ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° spatie/laravel-medialibrary.

РСгистрация ΠΌΠ΅Π΄ΠΈΠ°-ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ.

app/Models/Post.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;

class Post extends Model implements HasMedia
{
    use HasFactory;
    use InteractsWithMedia;

    public function registerMediaCollections(): void
    {
        // ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡ для ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ
        $this->addMediaCollection('images');
    }
}

Π’ livewire ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ‚Ρ€Π΅ΠΉΡ‚ HasMedia ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ΅ свойство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ совпадаСт с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠ΅Π΄ΠΈΠ°-ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ.

Для Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ поля ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ кастомноС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ CollectionMedia ΠΈΠ· Rock.Cms.

app/Http/Livewire/Admin/Posts/PostItem.php
<?php

namespace App\Http\Livewire\Admin\Posts;

use App\Models\Post;
use WebVovan\RockCms\Rules\CollectionMedia;
use WebVovan\RockCms\Http\Livewire\ResourceComponent;
use WebVovan\RockCms\Traits\Livewire\HasMedia;

class PostItem extends ResourceComponent
{
    use HasMedia;

    public Post $resource;

    public string $resourceClass = Post::class;

    public string $nameRouteResourceList = 'posts.list';
    public string $nameRouteResourceEdit = 'posts.edit';
    
     // ПолС для ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ
    public $images;

    // ΠŸΡ€Π°Π²ΠΈΠ»Π° Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»Π΅ΠΉ
    public function rules()
    {
        return [
            'resource.title' => 'string|required',
            'resource.desc' => 'string',
            'images' => new CollectionMedia(),
        ];
    }

    /**
     * ВызываСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°
     */
    public function init()
    {
        $this->resource->title = $this->resource->title ?? '';
        $this->resource->desc = $this->resource->desc ?? '';

        // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ свойства с ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ
        $this->images = $this->resource->getMedia('images')->toArray();
    }

    /**
     * ВызываСтся ΠΏΡ€ΠΈ сохранСнии рСсурса
     */
    public function save()
    {
        $this->resource->save();

        // Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ
        $this->saveCollectionMedia($this->resource, $this->images, 'images');
    }

    public function render()
    {
        return view('livewire.admin.posts.post-item');
    }
}

Π’Ρ‹Π²ΠΎΠ΄ поля Π² шаблонС:

<x-rock-cms::fields.collection-image :model="$images" field="images" title="ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ"/>

Last updated