- Основы
- Поля
- Заполнение полей
- Приведение типов
- FillCast
- Кнопки
- Атрибуты
- Имя формы
- Асинхронный режим
- Отображение ошибок валидации
- Прекогнитивная валидация
- Применение
- Вызов методов
- Отправка событий
- Событие "Submit"
Основы
Поля и декорации в FormBuilder используются внутри форм, которые обрабатываются FormBuilder. Благодаря FormBuilder поля отображаются и заполняются данными. Вы также можете использовать FormBuilder на своих собственных страницах или даже за пределами MoonShine.
make(string $action = '',string $method = 'POST',Fields|array $fields = [],array $values = [])
make(string $action = '',string $method = 'POST',Fields|array $fields = [],array $values = [])
action
- обработчикmethod
- тип запроса,fields
- поля и декорации.values
- значения полей.
FormBuilder::make(action:'/crud/update',method: 'PUT',fields: [Text::make('Text')],values: ['text' => 'Value'])
FormBuilder::make(action:'/crud/update',method: 'PUT',fields: [Text::make('Text')],values: ['text' => 'Value'])
То же самое через методы:
FormBuilder::make()->action('/crud/update')->method('PUT')->fields([Text::make('Text')])->fill(['text' => 'Value'])
FormBuilder::make()->action('/crud/update')->method('PUT')->fields([Text::make('Text')])->fill(['text' => 'Value'])
Также доступен хелпер:
{!! form(request()->url(), 'GET')->fields([Text::make('Text')])->fill(['text' => 'Value'])!!}
{!! form(request()->url(), 'GET')->fields([Text::make('Text')])->fill(['text' => 'Value'])!!}
Поля
Метод fields()
для объявления полей формы и декораций:
fields(Fields|Closure|array $fields)
fields(Fields|Closure|array $fields)
FormBuilder::make('/crud/update', 'PUT')->fields([Heading::make('Title'),Text::make('Text'),])
FormBuilder::make('/crud/update', 'PUT')->fields([Heading::make('Title'),Text::make('Text'),])
Заполнение полей
Метод fill()
для заполнения полей значениями:
fill(mixed $values = [])
fill(mixed $values = [])
FormBuilder::make('/crud/update', 'PUT')->fields([Heading::make('Title'),Text::make('Text'),])->fill(['text' => 'value'])
FormBuilder::make('/crud/update', 'PUT')->fields([Heading::make('Title'),Text::make('Text'),])->fill(['text' => 'value'])
Приведение типов
Метод cast()
для приведения значений формы к определенному типу. Поскольку по умолчанию поля работают с примитивными типами:
cast(MoonShineDataCast $cast)
cast(MoonShineDataCast $cast)
use MoonShine\TypeCasts\ModelCast;FormBuilder::make('/crud/update', 'PUT')->fields([Heading::make('Title'),Text::make('Text'),])->fillCast(['text' => 'value'],ModelCast::make(User::class))
use MoonShine\TypeCasts\ModelCast;FormBuilder::make('/crud/update', 'PUT')->fields([Heading::make('Title'),Text::make('Text'),])->fillCast(['text' => 'value'],ModelCast::make(User::class))
В этом примере мы приводим данные к формату модели User
, используя ModelCast
.
Для более подробной информации обратитесь к разделу TypeCasts
FillCast
Метод fillCast()
позволяет привести данные к определенному типу и сразу заполнить их значениями:
fillCast(mixed $values, MoonShineDataCast $cast)
fillCast(mixed $values, MoonShineDataCast $cast)
use MoonShine\TypeCasts\ModelCast;FormBuilder::make('/crud/update', 'PUT')->fields([Heading::make('Title'),Text::make('Text'),])->fillCast(['text' => 'value'],ModelCast::make(User::class))
use MoonShine\TypeCasts\ModelCast;FormBuilder::make('/crud/update', 'PUT')->fields([Heading::make('Title'),Text::make('Text'),])->fillCast(['text' => 'value'],ModelCast::make(User::class))
или
use MoonShine\TypeCasts\ModelCast;FormBuilder::make('/crud/update', 'PUT')->fields([Heading::make('Title'),Text::make('Text'),])->fillCast(User::query()->first(),ModelCast::make(User::class))
use MoonShine\TypeCasts\ModelCast;FormBuilder::make('/crud/update', 'PUT')->fields([Heading::make('Title'),Text::make('Text'),])->fillCast(User::query()->first(),ModelCast::make(User::class))
Кнопки
Кнопки формы можно модифицировать и добавлять.
Для настройки кнопки "submit" используйте метод submit()
.
submit(string $label, array $attributes = [])
submit(string $label, array $attributes = [])
label
- название кнопки,attributes
- дополнительные атрибуты
FormBuilder::make('/crud/update', 'PUT')->submit(label: 'Нажми меня', attributes: ['class' => 'btn-primary'])
FormBuilder::make('/crud/update', 'PUT')->submit(label: 'Нажми меня', attributes: ['class' => 'btn-primary'])
Метод hideSubmit()
позволяет скрыть кнопку "submit".
FormBuilder::make('/crud/update', 'PUT')->hideSubmit()
FormBuilder::make('/crud/update', 'PUT')->hideSubmit()
Для добавления новых кнопок на основе ActionButton
используйте метод buttons()
buttons(array $buttons = [])
buttons(array $buttons = [])
FormBuilder::make('/crud/update', 'PUT')->buttons([ActionButton::make('Удалить', route('name.delete'))])
FormBuilder::make('/crud/update', 'PUT')->buttons([ActionButton::make('Удалить', route('name.delete'))])
Атрибуты
Вы можете установить любые html атрибуты для формы с помощью метода customAttributes()
.
FormBuilder::make()->customAttributes(['class' => 'custom-form'])
FormBuilder::make()->customAttributes(['class' => 'custom-form'])
Имя формы
Метод name()
позволяет установить уникальное имя для формы, через которое можно вызывать события.
FormBuilder::make('/crud/update', 'PUT')->name('main-form')
FormBuilder::make('/crud/update', 'PUT')->name('main-form')
Асинхронный режим
Если необходимо отправить форму асинхронно, используйте метод async()
.
async(?string $asyncUrl = null,string|array|null $asyncEvents = null,?string $asyncCallback = null)
async(?string $asyncUrl = null,string|array|null $asyncEvents = null,?string $asyncCallback = null)
asyncUrl
- url запроса (по умолчанию запрос отправляется по url action),asyncEvents
- события, поднимаемые после успешного запроса,asyncCallback
- js callback функция после получения ответа.
FormBuilder::make('/crud/update', 'PUT')->async()
FormBuilder::make('/crud/update', 'PUT')->async()
После успешного запроса можно вызывать события, добавив параметр asyncEvents
.
FormBuilder::make('/crud/update', 'PUT')->name('main-form')->async(asyncEvents: ['table-updated-crud', 'form-reset-main-form'])
FormBuilder::make('/crud/update', 'PUT')->name('main-form')->async(asyncEvents: ['table-updated-crud', 'form-reset-main-form'])
В MoonShine уже есть набор готовых событий:
table-updated-{name}
- обновление асинхронной таблицы по ее имени,form-reset-{name}
- сброс значений формы по ее имени,fragment-updated-{name}
- обновляет blade фрагмент по его имени.
Метод async()
должен идти после метода name()
!
Отображение ошибок валидации
По умолчанию ошибки валидации отображаются в верхней части формы.
Метод errorsAbove(bool $enable = true)
используется для управления отображением ошибок валидации в верхней части формы. Он позволяет включить или отключить эту функцию.
FormBuilder::make('/crud/update', 'PUT')->errorsAbove(false)
FormBuilder::make('/crud/update', 'PUT')->errorsAbove(false)
Прекогнитивная валидация
Если необходимо сначала выполнить прекогнитивную валидацию, вам нужен метод precognitive()
.
FormBuilder::make('/crud/update', 'PUT')->precognitive()
FormBuilder::make('/crud/update', 'PUT')->precognitive()
Применение
Метод apply()
в FormBuilder итерирует все поля формы и вызывает их методы apply.
apply(Closure $apply,?Closure $default = null,?Closure $before = null,?Closure $after = null,bool $throw = false,)
apply(Closure $apply,?Closure $default = null,?Closure $before = null,?Closure $after = null,bool $throw = false,)
$apply
- функция обратного вызова;$default
- применение для поля по умолчанию;$before
- функция обратного вызова перед применением;$after
- функция обратного вызова после применения;$throw
- выбрасывать исключения.
Примеры
Необходимо сохранить данные всех полей FormBuilder в контроллере:
$form->apply(fn(Model $item) => $item->save());
$form->apply(fn(Model $item) => $item->save());
Более сложный вариант, с указанием событий до и после сохранения:
$form->apply(static fn(Model $item) => $item->save(),before: function (Model $item) {if (! $item->exists) {$item = $this->beforeCreating($item);}if ($item->exists) {$item = $this->beforeUpdating($item);}return $item;},after: function (Model $item) {$wasRecentlyCreated = $item->wasRecentlyCreated;$item->save();if ($wasRecentlyCreated) {$item = $this->afterCreated($item);}if (! $wasRecentlyCreated) {$item = $this->afterUpdated($item);}return $item;},throw: true);
$form->apply(static fn(Model $item) => $item->save(),before: function (Model $item) {if (! $item->exists) {$item = $this->beforeCreating($item);}if ($item->exists) {$item = $this->beforeUpdating($item);}return $item;},after: function (Model $item) {$wasRecentlyCreated = $item->wasRecentlyCreated;$item->save();if ($wasRecentlyCreated) {$item = $this->afterCreated($item);}if (! $wasRecentlyCreated) {$item = $this->afterUpdated($item);}return $item;},throw: true);
Вызов методов
asyncMethod()
позволяет указать имя метода в ресурсе и вызвать его асинхронно при отправке FormBuilder без необходимости создания дополнительных контроллеров.
public function components(): array{return [FormBuilder::make()->asyncMethod('updateSomething'),];}
public function components(): array{return [FormBuilder::make()->asyncMethod('updateSomething'),];}
// С уведомлениемpublic function updateSomething(MoonShineRequest $request){// $request->getResource();// $request->getResource()->getItem();// $request->getPage();MoonShineUI::toast('Мое сообщение', 'success');return back();}// Исключениеpublic function updateSomething(MoonShineRequest $request){throw new \Exception('Мое сообщение');}// Пользовательский json ответpublic function updateSomething(MoonShineRequest $request){return MoonShineJsonResponse::make()->toast('Мое сообщение', ToastType::SUCCESS);}
// С уведомлениемpublic function updateSomething(MoonShineRequest $request){// $request->getResource();// $request->getResource()->getItem();// $request->getPage();MoonShineUI::toast('Мое сообщение', 'success');return back();}// Исключениеpublic function updateSomething(MoonShineRequest $request){throw new \Exception('Мое сообщение');}// Пользовательский json ответpublic function updateSomething(MoonShineRequest $request){return MoonShineJsonResponse::make()->toast('Мое сообщение', ToastType::SUCCESS);}
Отправка событий
Для отправки javascript событий можно использовать метод dispatchEvent()
.
dispatchEvent(array|string $events)
dispatchEvent(array|string $events)
FormBuilder::make()->dispatchEvent(JsEvent::OFF_CANVAS_TOGGLED, 'default'),
FormBuilder::make()->dispatchEvent(JsEvent::OFF_CANVAS_TOGGLED, 'default'),
По умолчанию при вызове события с запросом будут отправлены все данные формы.
Если форма большая, то может потребоваться исключить набор полей.
Исключить можно через параметр exclude
:
->dispatchEvent(AlpineJs::event(JsEvent::OFF_CANVAS_TOGGLED, 'default'),exclude: ['text', 'description'])
->dispatchEvent(AlpineJs::event(JsEvent::OFF_CANVAS_TOGGLED, 'default'),exclude: ['text', 'description'])
Также можно полностью исключить отправку данных через параметр withoutPayload
:
->dispatchEvent(AlpineJs::event(JsEvent::OFF_CANVAS_TOGGLED, 'default'),withoutPayload: true)
->dispatchEvent(AlpineJs::event(JsEvent::OFF_CANVAS_TOGGLED, 'default'),withoutPayload: true)
Событие "Submit"
Для отправки формы можно вызвать событие Submit.
AlpineJs::event(JsEvent::FORM_SUBMIT, 'componentName')
AlpineJs::event(JsEvent::FORM_SUBMIT, 'componentName')
Пример вызова события на странице формы
public function formButtons(): array{return [ActionButton::make('Сохранить')->dispatchEvent(AlpineJs::event(JsEvent::FORM_SUBMIT, $this->uriKey()))];}
public function formButtons(): array{return [ActionButton::make('Сохранить')->dispatchEvent(AlpineJs::event(JsEvent::FORM_SUBMIT, $this->uriKey()))];}
Для получения дополнительной информации о помощниках AlpineJs обратитесь к разделу Js events.