Override writing behavior
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 computed fields 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 use hooks instead.
Making a field read-only
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
In this simple example, we have two collections that are linked together:
The
Userscollection has ajoband aportfolioIdas foreignKeyThe
Portfolioscollection has atitle
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]];
}
);
}
);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.
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,
'format' => [
'name' => 'pdf'
]
]
];
}
);
}
);Last updated
Was this helpful?