<?php
declare(strict_types=1);
namespace App\Form\Type;
use App\Form\Model\ExportApplicationModel;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class ExportApplicationType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('name', TextType::class, [
'label' => 'Export Name',
'required' => true,
'attr' => [
'class' => 'form-control form-control-sm',
'placeholder' => 'Enter export name...',
],
])
->add('filters', HiddenType::class, [
'required' => false,
])
->add('columns', HiddenType::class, [
'required' => false,
])
->add('type', HiddenType::class, [
'required' => false,
])
->add('format', HiddenType::class, [
'required' => false,
]);
// Add data transformer for columns to serialize/deserialize array to JSON
$builder->get('columns')
->addModelTransformer(new CallbackTransformer(
fn(?array $value): ?string => $value ? json_encode($value, JSON_UNESCAPED_SLASHES) : null,
function (?string $value): ?array {
if (empty($value) || !is_string($value)) {
return null;
}
$decoded = json_decode($value, true);
return json_last_error() === JSON_ERROR_NONE ? $decoded : null;
}
));
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => ExportApplicationModel::class,
'method' => 'POST',
]);
}
}