Piotr Synowiec
Piotr Synowiec
1 min read

Categories

Tags

Intro

  • Use case
    • EasyAdmin crud controller
    • Entity virtual field
    • This field has data populated by JS and it is select (Symfony ChoiceType)

Problem

  • Symfony ChoiceType is Transformable and this prevents form to be submitted with error No proper value

Solution

Code

<?php
declare(strict_types=1);

namespace App\Form;

use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;

class NonTransformedChoiceType extends ChoiceType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        parent::buildForm($builder, $options);
        $builder->resetModelTransformers();
        $builder->resetViewTransformers();
    }
}
<?php
declare(strict_types=1);


namespace App\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;

class DynamicSelectType extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'choices' => [],
            'choice_value' => 'id',
        ]);
    }

    public function getParent(): string
    {
        return NonTransformedChoiceType::class;
    }
}
# Easy Admin Crud Controller
public function configureFields(string $pageName): iterable
{
    yield Field::new('virtualField')->setLabel("Virtual Field Name")
            ->setFormType(DynamicSelectType::class)
            ->setFormTypeOptions([
                'row_attr' => ['class' => 'col-md-6'],
                'attr' => [
                    'class' => 'form-control virtual-field-selector', # virtual-field-selector - for JS to find this select and populate with required data
                ]
            ])->onlyOnForms();    
}

public function updateEntity(EntityManagerInterface $entityManager, $entityInstance): void
{
        if (!($entityInstance instanceof YourDesiredClass)) {
            return;
        }

        # perform $entityInstance update with data from virtualField

        parent::updateEntity($entityManager, $entityInstance);
}

public function persistEntity(EntityManagerInterface $entityManager, $entityInstance): void
{
        if (!($entityInstance instanceof YourDesiredClass)) {
            return;
        }

        # perform $entityInstance update with data from virtualField

        parent::persistEntity($entityManager, $entityInstance);
}