Rename DataTransformerFilterInterface to DataTransformerInterface

The DataTransformerFilterInterface has been renamed to DataTransformerInterface to reflect expanded functionality. Now, this interface can be implemented not only by @see{FilterInterface}, but also by @see{AggregatorInterface}. This change allows transforming existing data in saved exports and replacing it with some default values, or new default values.
This commit is contained in:
Julien Fastré 2024-06-17 15:20:54 +02:00
parent fc8bc33ba9
commit e7ca89e0c1
Signed by: julienfastre
GPG Key ID: BDE2190974723FCB
5 changed files with 25 additions and 17 deletions

View File

@ -16,10 +16,10 @@ namespace Chill\MainBundle\Export;
* *
* This interface defines a method for transforming filter's form data before it is processed. * This interface defines a method for transforming filter's form data before it is processed.
* *
* You can implement this interface on @see{FilterInterface}, to allow to transform existing data in saved exports * You can implement this interface on @see{FilterInterface} or @see{AggregatorInterface}, to allow to transform existing data in saved exports
* and replace it with some default values. * and replace it with some default values, or new default values.
*/ */
interface DataTransformerFilterInterface interface DataTransformerInterface
{ {
public function transformData(?array $before): array; public function transformData(?array $before): array;
} }

View File

@ -11,7 +11,9 @@ declare(strict_types=1);
namespace Chill\MainBundle\Form\Type\Export; namespace Chill\MainBundle\Form\Type\Export;
use Chill\MainBundle\Export\DataTransformerInterface;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\FormType; use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
@ -19,11 +21,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
class AggregatorType extends AbstractType class AggregatorType extends AbstractType
{ {
public function __construct() public function buildForm(FormBuilderInterface $builder, array $options): void
{
}
public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$exportManager = $options['export_manager']; $exportManager = $options['export_manager'];
$aggregator = $exportManager->getAggregator($options['aggregator_alias']); $aggregator = $exportManager->getAggregator($options['aggregator_alias']);
@ -34,17 +32,26 @@ class AggregatorType extends AbstractType
'required' => false, 'required' => false,
]); ]);
$filterFormBuilder = $builder->create('form', FormType::class, [ $aggregatorFormBuilder = $builder->create('form', FormType::class, [
'compound' => true, 'compound' => true,
'required' => false, 'required' => false,
'error_bubbling' => false, 'error_bubbling' => false,
]); ]);
$aggregator->buildForm($filterFormBuilder); $aggregator->buildForm($aggregatorFormBuilder);
$builder->add($filterFormBuilder); if ($aggregator instanceof DataTransformerInterface) {
$aggregatorFormBuilder->addViewTransformer(new CallbackTransformer(
fn (?array $data) => $data,
function (?array $data) use ($aggregator) {
return $aggregator->transformData($data);
},
));
} }
public function configureOptions(OptionsResolver $resolver) $builder->add($aggregatorFormBuilder);
}
public function configureOptions(OptionsResolver $resolver): void
{ {
$resolver->setRequired('aggregator_alias') $resolver->setRequired('aggregator_alias')
->setRequired('export_manager') ->setRequired('export_manager')

View File

@ -11,7 +11,7 @@ declare(strict_types=1);
namespace Chill\MainBundle\Form\Type\Export; namespace Chill\MainBundle\Form\Type\Export;
use Chill\MainBundle\Export\DataTransformerFilterInterface; use Chill\MainBundle\Export\DataTransformerInterface;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\CallbackTransformer; use Symfony\Component\Form\CallbackTransformer;
@ -45,7 +45,7 @@ class FilterType extends AbstractType
]); ]);
$filter->buildForm($filterFormBuilder); $filter->buildForm($filterFormBuilder);
if ($filter instanceof DataTransformerFilterInterface) { if ($filter instanceof DataTransformerInterface) {
$filterFormBuilder->addViewTransformer(new CallbackTransformer( $filterFormBuilder->addViewTransformer(new CallbackTransformer(
fn (?array $data) => $data, fn (?array $data) => $data,
function (?array $data) use ($filter) { function (?array $data) use ($filter) {

View File

@ -13,7 +13,7 @@ namespace Chill\PersonBundle\Export\Filter\AccompanyingCourseFilters;
use Chill\MainBundle\Entity\User\UserJobHistory; use Chill\MainBundle\Entity\User\UserJobHistory;
use Chill\MainBundle\Entity\UserJob; use Chill\MainBundle\Entity\UserJob;
use Chill\MainBundle\Export\DataTransformerFilterInterface; use Chill\MainBundle\Export\DataTransformerInterface;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickRollingDateType; use Chill\MainBundle\Form\Type\PickRollingDateType;
use Chill\MainBundle\Repository\UserJobRepositoryInterface; use Chill\MainBundle\Repository\UserJobRepositoryInterface;
@ -27,7 +27,7 @@ use Doctrine\ORM\QueryBuilder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
final readonly class UserJobFilter implements FilterInterface, DataTransformerFilterInterface final readonly class UserJobFilter implements FilterInterface, DataTransformerInterface
{ {
private const PREFIX = 'acp_filter_user_job'; private const PREFIX = 'acp_filter_user_job';

View File

@ -13,6 +13,7 @@ namespace Chill\PersonBundle\Export\Filter\AccompanyingCourseFilters;
use Chill\MainBundle\Entity\Scope; use Chill\MainBundle\Entity\Scope;
use Chill\MainBundle\Entity\User\UserScopeHistory; use Chill\MainBundle\Entity\User\UserScopeHistory;
use Chill\MainBundle\Export\DataTransformerInterface;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickRollingDateType; use Chill\MainBundle\Form\Type\PickRollingDateType;
use Chill\MainBundle\Repository\ScopeRepositoryInterface; use Chill\MainBundle\Repository\ScopeRepositoryInterface;
@ -26,7 +27,7 @@ use Doctrine\ORM\QueryBuilder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
final readonly class UserScopeFilter implements FilterInterface final readonly class UserScopeFilter implements FilterInterface, DataTransformerInterface
{ {
private const PREFIX = 'acp_filter_main_scope'; private const PREFIX = 'acp_filter_main_scope';