Smart Actions
Last updated
Last updated
This is the official documentation of the forestadmin/laravel-forestadmin
v2+ and forestadmin/symfony-forestadmin
PHP agents.
In legacy agents declaring a Smart Action was a two-step process:
First, you had to declare by changing the parameters of the collection
function in the appropriate models/*.php
file.
Then, you had to implement the action by creating a route handler in the appropriate routes/web.php
file.
In the new agent, the process is simplified to a single step.
You can find the full documentation of action customization .
addAction
for the appropriate collectionStart by calling the addAction
function on the appropriate collection and passing the appropriate parameters.
Most notably, you will need to pass:
type
should become scope
Note that the values are now capitalized (e.g. single
becomes Single
)
Legacy agents defaulted to 'bulk'
if no type was specified. The new agent requires you to specify the scope.
download
should become generateFile
. This is still a boolean and the same value can be passed.
endpoint
and httpMethod
should be removed. The agent will now automatically handle the routing.
Forms are now defined in the form
property of the action.
You can simply copy the field's definition from the legacy agent to the new agent with the following differences:
fields
should become form
.
widget
choice is no longer supported. A default widget will be used depending on the field type.
hook
can be removed, those will be handled by the new agent automatically.
reference
no longer exists. Use { type: 'Collection', collectionName: '...' }
instead.
enums
no longer exist. Use { type: 'Enum', enumValues: ['...'] }
instead.
execute
functionIn the legacy agent, users had to implement the action by creating a route handler in the appropriate routes/web.php
file.
This is no longer needed as the new agent provides a context
object that contains all the information that is needed to implement the action.
When porting the route handler to the new agent, you will need to:
Move the body of the route handler to the execute
function of the action.
Replace RecordsGetter.getIdsFromRequest()
call with context.getRecordIds()
.
Load hooks and change hooks have been replaced on the new agent by the possibility to use callbacks in the form definition.
Here is an example of a load hook where the default value of a field is set to 50 euros converted into dollars:
And another for a change hook which makes a field required if the value of another field is greater than 100:
Replace return response();
calls with return resultBuilder->success()
or return resultBuilder->error()
, or the .
type: 'single' type: 'bulk' type: 'global'
scope: 'Single' scope: 'Bulk' scope: 'Global'
download: true
generateFile: true
reference: 'otherCollection.id'
{ type: 'Collection', collectionName: 'otherCollection' }
enums: ['foo', 'bar']
{ type: 'Enum', enumValues: ['foo', 'bar'] }
Request object
context.getRecordIds()
Response object
return resultBuilder.success(...) return resultBuilder.error(...) ...