Я создал пользовательский тип, подобный этому:
private $selectedCountryId = 0;
public function configureOptions(OptionsResolver $resolver)
{
$queryBuilder = function (CountryRepository $er) {
return $er->createQueryBuilder('c')
->where('c.active = 1')
->orWhere('c.id = :sid')
->orderBy('c.ord', 'ASC')
->addOrderBy('c.name', 'ASC')
->setParameter('sid', $this->selectedCountryId)
;
};
$resolver->setDefaults(array(
'query_builder' => $queryBuilder,
'class' => Country::class,
));
}
public function getParent()
{
return EntityType::class;
}
public function getBlockPrefix()
{
return 'CountryType';
}
Я пытаюсь изменить параметр selectedCountryId в зависимости от экземпляра объекта:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(
FormEvents::PRE_SET_DATA, array($this, 'onPreSetData')
);
}
public function onPreSetData(FormEvent $event)
{
if ($event->getData() instanceof Country) {
$this->selectedCountryId = $event->getData()->getId();
}
}
Но setOptions уже вызывается на этом этапе, и я не знаю, как изменить конструктор запросов здесь.Как правило, я пытаюсь добиться того, чтобы разрешить данную страну в раскрывающемся списке, если она уже была сохранена для данного объекта (и деактивирована позднее).