Я работаю над созданием формы через фреймворк 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 над типом формы сбора)
Может кто-нибудь дать мне несколько советов по этому подходу? Может быть, есть лучший способ сделать это?