This is the official documentation of the forestadmin/laravel-forestadmin v2+ and forestadmin/symfony-forestadmin PHP agents.
Forest Admin allows replacing the default field writing behavior with your own custom logic.
This is useful when you want to change how a given field behaves, but also to make writable.
How does it work
The replaceFieldWriting function allows to change the behavior of any change by creating a new patch that will be applied to the record.
You should refrain from using handlers that have side effects (to perform error handling, validation, ...) and .
Making a field read-only
Can be achieved without any code .
Examples
Changing other fields in the same record
In the following example, editing or creating a fullName will update both firstName and lastName fields of the record.
use ForestAdmin\AgentPHP\DatasourceCustomizer\CollectionCustomizer;
use ForestAdmin\AgentPHP\DatasourceToolkit\Components\Query\ConditionTree\Operators;
$forestAgent->customizeCollection(
'Customer',
function (CollectionCustomizer $builder) {
$builder->replaceFieldWriting(
'fullName',
function($value) {
[$firstName, $lastName] = explode(' ', $value);
return compact('firstName', 'lastName');
}
);
}
);
Having specific behavior only for updates
You can have different behavior for creations and updates.
In this example, each time the firstName field is edited, we also want to update a timestamp field.
use ForestAdmin\AgentPHP\DatasourceCustomizer\CollectionCustomizer;
use ForestAdmin\AgentPHP\DatasourceToolkit\Components\Query\ConditionTree\Operators;
use ForestAdmin\AgentPHP\DatasourceCustomizer\Decorators\Write\WriteReplace\WriteCustomizationContext;
$forestAgent->customizeCollection(
'Customer',
function (CollectionCustomizer $builder) {
$builder->replaceFieldWriting(
'firstName',
function($value, WriteCustomizationContext $context) {
return match ($context->getAction()) {
'create' => ['firstName' => $value, 'firstNameLastEdited' => null],
'update' => ['firstName' => $value, 'firstNameLastEdited' => 'updated' => date('c')],
default => throw new ForestException('invalid action'),
};
}
);
}
);
Changing fields in related records
Handling relationships inside a replaceFieldWriting will only work for ManyToOne and OneToOne relationships.
In this simple example, we have two collections that are linked together:
The Users collection has a job and a portfolioId as foreignKey
The Portfolios collection has a title
When the user updates his job field we want also to update the title of the portfolio by the job name.
use ForestAdmin\AgentPHP\DatasourceCustomizer\CollectionCustomizer;
use ForestAdmin\AgentPHP\DatasourceToolkit\Components\Query\ConditionTree\Operators;
$forestAgent->customizeCollection(
'Customer',
function (CollectionCustomizer $builder) {
$builder->replaceFieldWriting(
'job',
function($value) {
return ['job' => $value, 'portfolio' => ['title' => $value]];
}
);
}
);
If the relationships do not exist it will create them with the given field values.
You can also provide another portfolioId to update the relationships and their fields:
use ForestAdmin\AgentPHP\DatasourceCustomizer\CollectionCustomizer;
use ForestAdmin\AgentPHP\DatasourceToolkit\Components\Query\ConditionTree\Operators;
$forestAgent->customizeCollection(
'Customer',
function (CollectionCustomizer $builder) {
$builder->replaceFieldWriting(
'job',
function($value) {
return ['job' => $value, 'portfolioId' => 8, 'portfolio' => ['title' => $value]];
}
);
}
);
Of course, you can chain the relationships. For example, if a portfolio has a one-to-one relationship with the formats collection, you can update it by writing the right path.