- Основы
- Ключ/Значение
- С набором полей
- Только значение
- Значение по умолчанию
- Добавление/Удаление
- Вложенные значения
- Вертикальное отображение
- Отношения через Json
- Фильтр
- Кнопки
- Модификация
Основы
Поле Json включает все базовые методы.
Json имеет несколько методов для установки структуры поля:
keyValue()
, onlyValue()
и fields()
.
В базе данных поле должно быть текстового или json типа. Также требуется cast eloquent модели в массив, json или коллекцию.
Ключ/Значение
Самый простой способ работы с полем Json - использовать метод keyValue()
.
Результатом будет простой json {key: value}
.
keyValue( string $key = 'Key', string $value = 'Value')
use MoonShine\Fields\Json; //... public function fields(): array{ return [ Json::make('Data') ->keyValue() ];} //...
По умолчанию ключи и значения являются полями Text, но вы можете использовать другие поля для примитивных данных.
use MoonShine\Fields\Json;use MoonShine\Fields\Select; //... public function fields(): array{ return [ Json::make('Label', 'data')->keyValue( keyField: Select::make('Key')->options(['vk' => 'VK', 'email' => 'E-mail']), valueField: Select::make('Value')->options(['1' => '1', '2' => '2']), ), ];} //...
С набором полей
Для более продвинутого использования используйте метод fields()
и передайте необходимый набор полей.
В результате будет сгенерирован следующий json:
[{title: 'title', value: 'value', active: 'active'}]
fields(Fields|Closure|array $fields)
use MoonShine\Fields\Json;use MoonShine\Fields\Position;use MoonShine\Fields\Switcher;use MoonShine\Fields\Text; //... public function fields(): array{ return [ Json::make('Product Options', 'options') ->fields([ Position::make(), Text::make('Title'), Text::make('Value'), Switcher::make('Active') ]) ];} //...
Только значение
Иногда вам нужно хранить в базе данных только значения. Для этого можно использовать метод onlyValue()
. Результатом будет json ['value']
.
onlyValue(string $value = 'Value')
use MoonShine\Fields\Json; //... public function fields(): array{ return [ Json::make('Data') ->onlyValue() ];} //...
Значение по умолчанию
Вы можете использовать метод default()
, если вам нужно указать значение по умолчанию для поля.
default(mixed $default)
use MoonShine\Fields\Json;use MoonShine\Fields\Switcher;use MoonShine\Fields\Text; //... public function fields(): array{ return [ Json::make('Data') ->keyValue('Key', 'Value') ->default([ [ 'key' => 'Default key', 'value' => 'Default value' ] ]), Json::make('Product Options', 'options') ->fields([ Text::make('Title'), Text::make('Value'), Switcher::make('Active') ]) ->default([ [ 'title' => 'Default title', 'value' => 'Default value', 'active' => true ] ]), Json::make('Values') ->onlyValue() ->default([ ['value' => 'Default value'] ]) ];} //...
Добавление/Удаление
По умолчанию поле Json содержит только одну запись. Метод creatable()
позволяет добавлять записи, а метод removable()
позволяет удалять существующие.
creatable( Closure|bool|null $condition = null, ?int $limit = null, ?ActionButton $button = null)
-$condition
- условие выполнения метода,
-$limit
- количество записей, которые можно добавить,
-$button
- пользовательская кнопка добавления.
removable( Closure|bool|null $condition = null, array $attributes = [])
-$condition
- условие выполнения метода,
-$attributes
- дополнительные атрибуты кнопки.
use MoonShine\Fields\Json; //... public function fields(): array{ return [ Json::make('Data') ->keyValue() ->creatable(limit: 6) ->removable() ];} //...
Пользовательская кнопка добавления
use MoonShine\Fields\Json; //... public function fields(): array{ return [ Json::make('Data') ->keyValue() ->creatable( button: ActionButton::make('New', '#')->primary() ) ];} //...
Атрибуты для кнопки удаления
use MoonShine\Fields\Json; //... public function fields(): array{ return [ Json::make('Data', 'data.content')->fields([ Text::make('Title'), Image::make('Image'), Text::make('Value'), ]) ->removable(attributes: ['@click.prevent' => 'customAsyncRemove']) ->creatable() ];} //...
Вложенные значения
Вы можете получить вложенные значения полей JSON, используя .
.
Значения можно редактировать, но изменения не затронут другие ключи.
{"info": [{"title": "Info title", "value": "Info value"}], "content": [{"title": "Content title", "value": "Content value"}]}
use MoonShine\Fields\Json; //... public function fields(): array{ return [ Json::make('Data', 'data.content') ->fields([ Text::make('Title'), Text::make('Value'), ])->removable() ];} //...
Вертикальное отображение
Метод vertical()
позволяет изменить горизонтальное расположение полей на вертикальное.
vertical()
use MoonShine\Fields\Json; //... public function fields(): array{ return [ Json::make('Data') ->keyValue() ->vertical() ];} //...
Отношения через Json
Поле Json может работать с отношениями; для этого используется метод asRelation()
, которому нужно присвоить ModelResource отношений и указать массив редактируемых полей.
asRelation(ModelResource $resource)
use MoonShine\Fields\ID;use MoonShine\Fields\Json;use MoonShine\Fields\Relationships\BelongsTo;use MoonShine\Fields\Text; //... public function fields(): array{ return [ Json::make('Comments', 'comments') ->asRelation(new CommentResource()) ->fields([ ID::make(), BelongsTo::make('Article') ->setColumn('article_id') ->searchable(), BelongsTo::make('User') ->setColumn('user_id'), Text::make('Text')->required(), ]) ->creatable() ->removable() ];}//...
Для отношений наличие поля ID в методе fields обязательно!
При использовании BelongsTo необходимо использовать метод setColumn()
, чтобы установить поле в таблице базы данных!
Фильтр
Если поле используется для построения фильтра, то необходимо использовать метод filterMode()
. Этот метод адаптирует поведение поля и устанавливает creatable = false
.
use MoonShine\Fields\Json;use MoonShine\Fields\Text; //... public function filters(): array{ return [ Json::make('Data') ->fields([ Text::make('Title', 'title'), Text::make('Value', 'value') ]) ->filterMode() ];} //...
Кнопки
Метод buttons()
позволяет добавить дополнительные кнопки к полю Json.
buttons(array $buttons)
use MoonShine\ActionButtons\ActionButton;use MoonShine\Fields\Json; //... public function fields(): array{ return [ Json::make('Data', 'data.content')->fields([ Text::make('Title'), Image::make('Image'), Text::make('Value'), ])->buttons([ ActionButton::make('', '#') ->icon('heroicons.outline.trash') ->onClick(fn() => 'remove()', 'prevent') ->customAttributes(['class' => 'btn-secondary']) ->showInLine() ]) ];} //...
Модификация
Поле Json имеет методы, с помощью которых можно модифицировать кнопку удаления или изменить TableBuilder для предпросмотра и формы.
modifyRemoveButton()
Метод modifyRemoveButton()
позволяет изменить кнопку удаления.
/** * @param Closure(ActionButton $button, self $field): ActionButton $callback */modifyRemoveButton(Closure $callback)
use MoonShine\ActionButtons\ActionButton;use MoonShine\Fields\Json; //... public function fields(): array{ return [ Json::make('Data') ->modifyRemoveButton( fn(ActionButton $button) => $button->customAttributes([ 'class' => 'btn-secondary' ]) ) ];} //...
modifyTable()
Метод modifyTable()
позволяет изменить TableBuilder для предпросмотра и формы.
/** * @param Closure(TableBuilder $table, bool $preview): TableBuilder $callback */modifyTable(Closure $callback)
use MoonShine\Components\TableBuilder;use MoonShine\Fields\Json; //... public function fields(): array{ return [ Json::make('Data') ->modifyTable( fn(TableBuilder $table, bool $preview) => $table->customAttributes([ 'style' => 'width: 50%;' ]) ) ];} //...