Создание и редактирование ресурса

Для создания и редактирования ресурса используется один livewire компонент.

В blade шаблоне в компонент нужно передать модель для редактирования.

// resources/views/admin/posts/edit.blade.php

...

@section('content')
    <livewire:admin.posts.post-item :resource="$model"/>
@stop

Переменная $model передается из роута. Подробнее про настройку роутов здесь.

Создание livewire компонента:

php artisan make:livewire Admin/Posts/PostItem

Для правильной работы нужно отнаследоваться от ResourceComponent.

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

<?php

namespace App\Http\Livewire\Admin\Posts;

use App\Models\Post;
use WebVovan\RockCms\Http\Livewire\ResourceComponent;

class PostItem extends ResourceComponent
{
    // Eloquent модель
    public Post $resource;

    // Класс ресурса
    public string $resourceClass = Post::class;

    // Именованный маршрут списка ресурсов
    public string $nameRouteResourceList = 'posts.list';

    // Именованный маршрут редактирования ресурса
    public string $nameRouteResourceEdit = 'posts.edit';

    // Правила валидации полей
    protected $rules = [
        'resource.title' => 'string|required',
        'resource.desc' => 'string',
    ];

    /**
     * Вызывается один раз при инициализации компонента
     */
    public function init()
    {
        $this->resource->title = $this->resource->title ?? '';
        $this->resource->desc = $this->resource->desc ?? '';
    }

    /**
     * Вызывается при сохранении ресурса
     */
    public function save()
    {
        $this->resource->save();
    }

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

В шаблоне компонента просто перечисляем список полей.

Rock.Cms поставляется с большим количеством уже готовых полей.

// resources/views/livewire/admin/posts/post-item.blade.php

<div>
    <x-rock-cms::input field="resource.title" title="Заголовок"/>
    <x-rock-cms::editor :model="$resource->desc" field="resource.desc" title="Описание"/>
</div>

В итоге получаем такую страницу.

Last updated