сущность symfony: используйте другой атрибут сущности в методе property / to_string

0

У меня есть сущность (продукт), которую пользователь может выбрать благодаря типу поля сущности. Выбранные продукты становятся новым объектом, 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
});
  • 0
    Как насчет создания экземпляра QueryBuilder, который ищет Продукты на основе пользовательских ингредиентов, а затем передает пользователя в форму и построителю запросов?
  • 0
    да, я могу получить правильное значение для отображения в форме, но не вижу, к какому варианту оно должно применяться? опция поля 'свойство' отражает метод в объекте, метка для поля, а не его выбор, ...?
Показать ещё 4 комментария
Теги:
entity-framework
addeventlistener
forms

2 ответа

1
Лучший ответ

Я только что узнал, что новая функция choice_value из этого запроса на растяжение позволит мне сделать трюк. Затем я мог передать свой продукт функции и получить соответствующее значение userIngredient для текущего пользователя.

Запрос на растяжение: https://github.com/symfony/symfony/pull/12148

Не знаю, если это фактически слито в 2.7. Кто-нибудь знает?

0

Перейдя по вашим комментариям, я отправлю это решение и посмотрю, будет ли оно работать для вас. Вы можете просто передать коллекцию, которую хотите создать в конструкторе. Вы также можете передать его в массив $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,
            // ...
        ))
    ;
}
  • 0
    Ну, может быть решение. Для типичного поля выбора массив похож на массив ('choice.id' => 'choice.displayedText'). Здесь мне нужно что-то вроде ('product.id' => 'product.userIngredients (User) -> getName ()'). Проблема в том, что для сущности массив выбора должен быть массивом сущностей, не так ли? Итак, как я могу передать и идентификатор продукта, и имя пользователя useringredient?
  • 0
    Если вам нужно его вычислить, вы можете создать переменную, окисляющую класс, в котором хранится нужное вам значение, а затем установить его перед передачей в форму. Затем просто используйте метод получения этого свойства для вашей формы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню