Symfony 3: Передача переменных в формы

Я строю с использованием форм Symfony 3, и мне нужно получить коллекцию, которая зависит от текущего пользователя, в форме для отображения в раскрывающемся списке.

С использованием EntityType Я могу получить список всех сущностей, но я хочу иметь возможность запускать пользовательский запрос, который извлекает только те, которые связаны с текущим объектом пользователя.

Я прочитал документацию по формам и EntityType, и он объясняет пользовательские запросы и упоминает передачу в качестве аргумента коллекции. Но я не могу найти инструкции о том, как это достигается нигде.

В идеале я хотел бы либо передать коллекцию, которую я курировал в Controller, передать объект User, чтобы выполнить запрос внутри формы, либо иным образом получить доступ к идентификатору пользователя в форме, чтобы выполнить запрос.

Кто-нибудь нашел решение для чего-нибудь подобного?

3

Решение

Вы должны попробовать с

передать объект User для запуска запроса внутри формы

  1. Определите обязательный параметр user в распознаватель опций:

    public function configureOptions(OptionsResolver $resolver)
    {
    // ...
    $resolver->setRequired('user');
    // type validation - User instance or int, you can also pick just one.
    $resolver->setAllowedTypes('user', array(User::class, 'int'));
    }
    

Это заставит вас пройти user вариант, чтобы вы не забыли об этом.

  1. Передайте экземпляр формы или идентификатор пользователя в качестве опции в форму.

В контроллере это может выглядеть так:

$this->createForm(SomeFormType::class, $underlyingObjectOrNull, array(
'user' => $this->getUser(),
));
  1. Построить пользовательский запрос для EntityType поле:

    $user = $options['user'];
    $builder->add('someField', EntityType::class, array(
    'class' => 'AppBundle:SomeEntity',
    'query_builder' => function (EntityRepository $er) use($user) {
    return $er->createQueryBuilder('u')
    //.. -> some method building the query builder
    },
    ));
    

пожалуйста, обратите внимание use($user) часть, которая дает вам доступ к этой переменной внутри анонимной функции.

6

Другие решения

Вот как вы можете передать пользовательскую коллекцию в форму.

Например: сущность продукта;

внутри контроллера

$form = $this->createForm(ProductType::class, $product, array('recommended_product' => $recommendedProduct));

внутри FormType

 $builder
->add('recommended_product', EntityType::class, array(
'class' => 'AppBundle\Entity\Product',
'choices' => $options['recommended_product'],
'choice_label' => function (Product $user) {
return $user->getProduct();
}
));

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Product',
'recommended_product' => array()
));
}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector