JSON

Данное поле подойдет для хранения любой произвольной структуры.

Для примера поместим в поле с описанием поста произвольные элементы. В БД у поля должен быть тип json. В модели нужно добавить свойство casts.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model implements HasMedia
{
    protected $casts = [
      'desc' => 'array'
    ];
}

В livewire компоненте нужно подключить трейт HasJson и определить метод, который будет добавлять новые блоки в поле.

<?php

namespace App\Http\Livewire\Admin\Posts;

use WebVovan\RockCms\Http\Livewire\ResourceComponent;
use WebVovan\RockCms\Traits\Livewire\HasJson;

class PostItem extends ResourceComponent
{
    use HasJson;

    ...

    /**
     * Добавление нового элемента в структуру
     */
    public function newItemInDesc(): array
    {
        // Для инициализации текстового редактора
        View::share('ajaxEditor', true);

        return [
            'item' => '',
            'text' => '',
        ];
    }
    
    public function rules()
    {
        return [
            ...,
            'resource.desc' => 'array',
            'resource.desc.*.item' => 'string|required',
            'resource.desc.*.text' => 'string',
        ];
    }
    
    public function init()
    {
        ...
        
        // Инициализация поля
        $this->resource->desc = $this->resource->desc ?? [];
    }
    
    public function save()
    {
        $this->resource->save();
    }
}

Вывод поля в шаблоне:

<x-rock-cms::fields.json
    :items="$resource->desc"
    field="resource.desc"
    addMethod="newItemInDesc"
    template="livewire.partials.desc-list"
    title="Описание"
/>

Опции:

  • items - поле с данными

  • field - название поля с данными

  • addMethod - метод, возвращающий структуру для нового элемента

  • template - blade шаблон для нового элемента

  • withoutSorting отключает сортировку (если в поле выводится текстовый редактор, то сортировку лучше отключить, иначе текст в поле редактора будет теряться)

Код шаблон нового элемента:

resources/views/livewire/partials/desc-list.blade.php
<x-rock-cms::fields.input
    field="resource.desc.{{$key}}.item"
    title="Элемент"
/>

<x-rock-cms::fields.editor
    :model="$items[$key]['text']"
    field="resource.desc.{{$key}}.text"
    enableMedia
    title="Описание"
/>

Внутри шаблона элемента у нас есть доступ к полю $items, в котором находится список всех элементов.

Получить доступ к вложенным свойствам можно через точку, например, resource.desc.

Last updated