У меня есть сущность (продукт), которую пользователь может выбрать благодаря типу поля сущности. Выбранные продукты становятся новым объектом, userIngredient, связанным с продуктами одним отношением OneToMany (один продукт для многих пользовательских имен).
Теперь, создавая рецепт, пользователь должен выбрать только те продукты, которые он добавил в свой список, поэтому я использую построитель запросов для фильтрации produts и проверяю, есть ли у них соответствующий пользовательский интерфейс для пользователя.
Это хорошо работает, но я также хочу, чтобы пользователь выбирал продукт в соответствии с его именем userIngredient, а не его именем продукта. Поэтому мне нужно будет запросить отношения oneToMany со стороны продукта = с большой стороны. Вот проблема: в объекте продукта я не могу вызвать диспетчера объектов.
Мне нужно что-то вроде предустановленного события данных не на родительском объекте, а на реальных продуктах. Как?
$builder
->add('product', 'genemu_jqueryselect2_entity', array(
'label'=>'Ingrédient',
'multiple' => false,
'required' => false,
'class' => 'AppBundle:MarketPlace\Product',
'property' => 'getUserIngredientName',
'query_builder'=>$this->queryBuilder,
'attr'=>array(
'data-toggle'=>"tooltip",
'data-placement'=>"top",
'title'=>"Choisissez votre ingrédient. Seuls les ingrédients faisant partie de votre sélection aparaissent ici.",
'class' => 'userIngredient select2'
)))
Вот что мне нужно сделать:
Либо в product.php
public function getUserIngredientName()
{
return $this->userIngredients->getName(); //Issue is there is one UserIngredient for every user, I need the one of the current user
}
Или в форме
$builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event){
$product = $event->getData();
$form = $event->getForm();
//set the property name here but according to a custom value passed to the type
});
Я только что узнал, что новая функция choice_value из этого запроса на растяжение позволит мне сделать трюк. Затем я мог передать свой продукт функции и получить соответствующее значение userIngredient для текущего пользователя.
Запрос на растяжение: https://github.com/symfony/symfony/pull/12148
Не знаю, если это фактически слито в 2.7. Кто-нибудь знает?
Перейдя по вашим комментариям, я отправлю это решение и посмотрю, будет ли оно работать для вас. Вы можете просто передать коллекцию, которую хотите создать в конструкторе. Вы также можете передать его в массив $options
если хотите.
контроллер:
// do whatever you need to grab the entities you want
$em = $this->getDoctrine()->getManager();
$productChoices = $em->getRepository('YourBundle:Product')
->getUserIngredients();
// if the form is tied to an entity, pass as the 2nd parameter
$form = $this->createForm(new YourFormType($productChoices));
FormType:
private $productChoices;
public function __construct(array $productChoices)
{
$this->productChoices = $productChoices;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('product', 'genemu_jqueryselect2_entity', array(
'choices' => $this->choices,
// ...
))
;
}