Изменить конструктор запросов в прослушивателе форм - PullRequest
0 голосов
/ 04 декабря 2018

Я создал пользовательский тип, подобный этому:

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 уже вызывается на этом этапе, и я не знаю, как изменить конструктор запросов здесь.Как правило, я пытаюсь добиться того, чтобы разрешить данную страну в раскрывающемся списке, если она уже была сохранена для данного объекта (и деактивирована позднее).

1 Ответ

0 голосов
/ 04 декабря 2018

В этом случае у вас все еще есть одна возможность изменить конструктор запросов для события PRE_SET_DATA, поскольку список выбора не создается до тех пор, пока не будет создано представление формы.

Это должно помочь:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
        if (null !== $country = $event->getData()) {
            // at this point the option is already resolved 
            // so it'll return the QueryBuilder instance
            $qb = $event->getForm()->getConfig()->getOption('query_builder');
            $qb->orWhere('c = :country')->setParameter('country', $country);
        }
    });
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'class' => Country::class,
        'query_builder' => function (CountryRepository $r) {
            return $r->createQueryBuilder('c')
                ->where('c.active = 1')
                ->orderBy('c.ord', 'ASC')
                ->addOrderBy('c.name', 'ASC')
            ;
        },
    ]);
}

Это будет работать только для экземпляров объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...