- Основы
- Набор полей
- Режим "Ключ/Значение"
- Режим "Только значения"
- Режим "Объект"
- Значение по умолчанию
- Добавление/Удаление
- Вертикальный режим
- Применение в фильтрах
- Кнопки
- Модификаторы
Основы
Содержит все Базовые методы.
Поле Json
предназначено для удобной работы с типом данных json.
В большинстве случаев оно используется с массивами объектов через TableBuilder
, но также поддерживает режим работы с одним объектом.
В базе данных поле должно быть типа "text" или "json". Также необходимо указать cast — "array", "json" или "collection".
Набор полей
Предположим, что структура вашего json имеет следующий вид:
[{"title": "title", "value": "value", "active": true}]
Это набор объектов с полями "title", "value" и "active".
Чтобы указать такой набор полей, используется метод fields()
.
fields(FieldsContract|Closure|iterable $fields)
Пример:
use MoonShine\UI\Fields\Json;use MoonShine\UI\Fields\Position;use MoonShine\UI\Fields\Switcher;use MoonShine\UI\Fields\Text; Json::make('Product Options', 'options') ->fields([ Position::make(), Text::make('Title'), Text::make('Value'), Switcher::make('Active'), ])
Поля также можно передавать через замыкание, что позволяет получить доступ к контексту поля и его данным.
use MoonShine\UI\Fields\Json;use MoonShine\UI\Fields\Position;use MoonShine\UI\Fields\Switcher;use MoonShine\UI\Fields\Text; Json::make('Product Options', 'options') ->fields( static fn(Json $ctx) => $ctx->getData()->getOriginal()->is_active ? [ Position::make(), Text::make('Title'), Text::make('Value'), Switcher::make('Active') ] : [ Text::make('Title') ] )
Режим "Ключ/Значение"
Когда ваши данные имеют структуру ключ/значение, как в следующем примере {"key": "value"}
, используется метод keyValue()
.
keyValue( string $key = 'Key', string $value = 'Value', ?FieldContract $keyField = null, ?FieldContract $valueField = null,)
$key
— заголовок поля "ключ",$value
— заголовок поля "значение",$keyField
— возможность заменить поле "ключ" на своё (по умолчанию —Text
),$valueField
— возможность заменить поле "значение" на своё (по умолчанию —Text
).
Пример:
Json::make('Data') ->keyValue()
Пример с изменением типов полей:
use MoonShine\UI\Fields\Json;use MoonShine\UI\Fields\Select;use MoonShine\UI\Fields\Text; Json::make('Label', 'data') ->keyValue( keyField: Select::make('Key') ->options(['vk' => 'VK', 'email' => 'E-mail']), valueField: Text::make('Value'), )
Режим "Только значения"
Если необходимо хранить только значения, как в примере ["value_1", "value_2"]
, используется метод onlyValue()
.
onlyValue( string $value = 'Value', ?FieldContract $valueField = null,)
$value
- заголовок поля "значение",$valueField
- возможность заменить поле "значение" на своё (по умолчанию —Text
).
Пример:
Json::make('Data') ->onlyValue()
Режим "Объект"
В большинстве случаев поле Json
работает с массивом объектов через TableBuilder
.
Однако возможен и режим работы с объектом, например, {"title": "Title", "active": false}
.
Для этого используется метод object()
.
Пример:
Json::make('Product Options', 'options') ->fields([ Text::make('Title'), Switcher::make('Active'), ]) ->object()
Значение по умолчанию
Как и в других полях, здесь есть возможность указать значение по умолчанию с помощью метода default()
.
В данном случае необходимо передать массив.
default(mixed $default)
Пример:
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, ?ActionButtonContract $button = null,)
$condition
- условие, при котором метод должен быть применён,$limit
- ограничение на количество возможных элементов,$button
- возможность заменить кнопку добавления на свою.
removable( Closure|bool|null $condition = null, array $attributes = [],)
$condition
- условие, при котором метод должен быть применён,$attributes
- HTML атрибуты для кнопки удаления.
Пример:
Json::make('Data') ->keyValue() ->creatable(limit: 6) ->removable()
Кастомизация кнопки добавления
use MoonShine\UI\Components\ActionButton;use MoonShine\UI\Fields\Json; Json::make('Data') ->keyValue() ->creatable( button: ActionButton::make('New')->primary() )
HTML атрибуты для кнопки удаления
Json::make('Data', 'data.content') ->fields([ Text::make('Title'), Image::make('Image'), Text::make('Value'), ]) ->removable(attributes: ['@click.prevent' => 'customAsyncRemove']) ->creatable()
Вертикальный режим
Метод vertical()
позволяет изменить отображение таблицы из горизонтального режима на вертикальный.
Пример:
Json::make('Data') ->vertical()
Применение в фильтрах
Если поле используется в фильтрах, необходимо включить режим фильтрации с помощью метода filterMode()
.
Этот метод адаптирует поведение поля для фильтрации и отключает возможность добавления новых элементов.
Json::make('Data') ->fields([ Text::make('Title', 'title'), Text::make('Value', 'value') ]) ->filterMode()
Кнопки
Метод buttons()
позволяет переопределить кнопки, используемые в поле.
По умолчанию доступна только кнопка удаления.
buttons(array $buttons)
Пример:
Json::make('Data', 'data.content') ->fields([ Text::make('Title'), Image::make('Image'), Text::make('Value'), ]) ->buttons([ ActionButton::make('') ->icon('trash') ->onClick(fn() => 'remove()', 'prevent') ->secondary() ->showInLine() ])
Модификаторы
Поле Json
предоставляет возможность модифицировать кнопки или таблицу в режимах "preview" или "default", вместо их полного замещения.
Модификатор кнопки удаления
Метод modifyRemoveButton()
позволяет изменить кнопку удаления.
/** * @param Closure(ActionButton $button, self $field): ActionButton $callback */modifyRemoveButton(Closure $callback)
Пример:
use MoonShine\UI\Components\ActionButton;use MoonShine\UI\Fields\Json; Json::make('Data') ->modifyRemoveButton( fn(ActionButton $button) => $button->customAttributes([ 'class' => 'btn-secondary' ]) )
Модификатор таблицы
Метод modifyTable()
позволяет модифицировать таблицу (TableBuilder
) для всех визуальных режимов поля.
/** * @param Closure(TableBuilder $table, bool $preview): TableBuilder $callback */modifyTable(Closure $callback)
Пример:
use MoonShine\UI\Components\Table\TableBuilder;use MoonShine\UI\Fields\Json; Json::make('Data') ->modifyTable( fn(TableBuilder $table, bool $preview) => $table->customAttributes([ 'style' => 'width: 50%;' ]) )