Image

Для прикрСплСния изобраТСния ΠΊ рСсурсу ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° spatie/laravel-medialibrary.

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

app/Models/Post.php
<?php

namespace App\Models;

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

class Post extends Model implements HasMedia
{
    use InteractsWithMedia

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

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

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

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

namespace App\Http\Livewire\Admin\Posts;

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

class PostItem extends ResourceComponent
{
    use HasMedia;
    
    // Бвойство для изобраТСния
    public $preview;

    public Post $resource;

    public string $resourceClass = Post::class;
    
    public string $nameRouteResourceList = 'posts.list';
    public string $nameRouteResourceEdit = 'posts.edit';

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

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

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

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

        // Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ изобраТСния
        $this->saveSingleMedia($this->resource, $this->preview, 'preview');
    }

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

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

<x-rock-cms::fields.single-image :model="$preview" field="preview" title="ΠŸΡ€Π΅Π²ΡŒΡŽ"/>

Last updated