Form interceptions
Sometimes you need to do something before a resource gets created or updated, and inform the user about it.
For example, when updating an organization, you might show a message that asks the user if sibling organizations should be updated too.
Usage
To start using interceptions, we need to add 2 methods to our resource:
// Whether the request should be intercepted
public function shouldIntercept(array $state, ?Model $model = null): bool
{
// Usually you would check if something is missing inside `state` here
return true;
}
use Qore\System\Http\Resource\SubmitInterceptor;
// What we want to do in our interception
public function onFormSubmit(SubmitInterceptor $interceptor): SubmitInterceptor
{
return $interceptor;
}
Now when you submit your form, a modal will open (every time, since it always returns true
).
API
Should intercept
If you want to intercept only once you can check the following:
public function shouldIntercept(array $state, ?Model $model = null): bool
{
return !isset($state['was_intercepted']);
}
This value will be inside the state when the user presses Ok
or Reject
On Form Submit
The following can be chained on the SubmitInterceptor
. Everything is optional.
public function onFormSubmit(SubmitInterceptor $interceptor): SubmitInterceptor
{
// Optionally check if we're creating or updating a model:
if ($interceptor->isCreating()) { ... }
if ($interceptor->isUpdating()) { ... }
return $interceptor
// The message
->message(__('My custom message'))
// Icon
->icon('business')
->iconColor('negative')
// Confirm button
->confirmButtonText(__('Confirm button'))
->confirmButtonColor('primary')
// Add a reject button
->rejectable()
->rejectButtonText(__('Reject button'))
->rejectButtonColor('negative')
// Dialog size
->setWidth(600) // width in pixels (width: 600px)
->setMaxWidth(90) // maximum view width (max-width: 90vw)
// Fields
->fields(function(array $state, ?Model $model = null) {
// In $state you can find the full form state of the related resource
return new FieldCollection(
Text::make('Project naam', 'project_name')
->rules('required')
->default('Some value')
);
})
// Callback that is called after the resource has fully updated/created
->then(function(Model $model, array $state, bool $wasRejected) {
if (!$rejected) {
$model->projects()->create(['name' => $state['project_name']]);
}
});
}