Данное поле подойдет для хранения любой произвольной структуры.
Для примера поместим в поле с описанием поста произвольные элементы. В БД у поля должен быть тип 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();
}
}
addMethod - метод, возвращающий структуру для нового элемента
template - blade шаблон для нового элемента
withoutSorting отключает сортировку (если в поле выводится текстовый редактор, то сортировку лучше отключить, иначе текст в поле редактора будет теряться)