Symfony Forms - встроенная коллекция пользовательского типа - PullRequest
0 голосов
/ 02 мая 2020

Я работаю над созданием формы через фреймворк Symfony. Сущность за формой (например, 'Case. php' имеет поле 'casePeople' типа Collection (Doctrine framework), вот соответствующие классы:

class Case
{

    private $id;

    private $caseNumber;

    private $casePeople; //Collection of Person.php
}
class Person
{

    private $id;

    private $name;

}

Мой тип формы:

class CaseType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder
            ->add('caseNumber')

            ->add('casePeople', CollectionType::class, [
                'entry_type' => CustomPersonType::class,
                'allow_delete' => true,
                'allow_add' => true,
                'by_reference' => false,

            ]);
class CustomPersonType extends AbstractType
{


    private $personRepository;

    public function __construct(PersonRepository $personRepository)
    {
        $this->personRepository= $personRepository;
    }


    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder->addModelTransformer(new HiddenFieldToPersonTransformer($this->personRepository));
    }
    public function getParent()
    {
        return HiddenType::class;
    }

class HiddenFieldToPersonTransformer implements DataTransformerInterface
{

    private PersonRepository $personRepository;
    public function __construct(PersonRepository$personRepository)
    {
        $this->personRepository= $personRepository;
    }
    public function transform($value)
    {
        if (null === $value) {
            return '';
        }
        if (!$value instanceof Person) {
            throw new \LogicException('The  ');
        }


        return $value->getId();
    }

    public function reverseTransform($value)
    {

        return $this->personRepository->find($value);
    }
}

На самой странице у меня есть текстовый ввод, который будет использовать ввод пользователя для поиска и создания списка параметров автозаполнения «Персона». Если один из этих параметров выбрав, я использую прототип коллекций, чтобы добавить новый скрытый ввод, для которого я установил идентификатор человека и добавил метку имени человека.

Ранее я использовал EntityType внутри коллекции вместо CustomPersonType Мне не понравился этот подход, потому что он производил бы элементы Select со всеми людьми в базе данных в качестве опций.

Моя проблема с HiddenType заключается в том, что если у Case уже есть casePeople, я не могу отобразить имена людей (я не могу понять, как получить это, когда я oop над типом формы сбора)

Может кто-нибудь дать мне несколько советов по этому подходу? Может быть, есть лучший способ сделать это?

...