Dynamic Forms Symfony2 PRE_SUBMIT Работает для обновления, но не отправляется

Я работаю над получением динамической формы для присоединения продукта к таблице категорий.

Сущность «Игры» имеет связанные с ней «Категории игр».

 /**
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\GameCategories", inversedBy="products")
 * @ORM\JoinColumn(name="category_id", referencedColumnName="category_id")
 */
public $category_id;    



/**
 * Set categoryId
 *
 * @param \AppBundle\Entity\GameCategories $categoryId
 *
 * @return Products
 */
public function setCategoryId(\AppBundle\Entity\GameCategories $categoryId = null)
{
    $this->category_id = $categoryId;

    return $this;
}

/**
 * Get categoryId
 *
 * @return \AppBundle\Entity\GameCategories
 */
public function getCategoryId()
{
    return $this->category_id;
}

Затем прослушиватель событий

  $builder->addEventListener(
        FormEvents::PRE_SUBMIT,
        function (FormEvent $event) {
             $product = $event->getData();
             $form = $event->getForm();

            // $game_id = $product->getGameId(); 
            $game_id = $product['game_id'];

            $formOptions = array(
                'class' => 'AppBundle\Entity\Products',
                'property' => 'category_id',
                'query_builder' => function (EntityRepository $er) use ($game_id) {

                     $query = $er->createQueryBuilder('i')
                                ->select(array('i'))
                                ->where('i.game_id = :game_id')
                                ->setParameter('game_id', $game_id)
                                ->orderBy('i.name', 'ASC');
                        return $query;
                },
            );

           $form->add('category_id', EntityType::class, $formOptions);
        }
    );       

Когда я делаю клики, он работает, как и ожидалось, и правильное поле выбора обновляется.

Но когда я действительно отправляю форму, я получаю следующую ошибку.

"Предполагаемый аргумент типа "AppBundle\Entity\GameCategories", "AppBundle\Entity\Products" указан"

PRE_SUBMIT выглядит так, как будто он использует продукты, что я и пытаюсь заставить его делать. но когда он на самом деле отправляет, он ищет другую сущность.

Есть ли у кого-нибудь идеи, как обойти это или лучше понять, как реализовать цепочку раскрывающихся списков в наши дни.

Заранее спасибо.

ИЗМЕНИТЬ ОДИН

Я использовал не ту сущность в построителе запросов.

Мне удалось изменить динамическую форму, но она показывает только целое число...

выберите категорию... 1 2 3

вместо выбора категории... Категория 1 Категория 2 Категория 3

 // Category ID

            $formOptions = array(
                'class' => 'AppBundle\Entity\GameCategories',
                'label' => 'Game Category',
                'property' => 'category_id',
                'placeholder' => 'Choose a Category...',
                'query_builder' => function (EntityRepository $er) use ($game_id) {

                    $query = $er->createQueryBuilder('i')
                                ->select(array('i'))
                                ->where('i.gameId = :game_id')
                                ->setParameter('game_id', $game_id)
                                ->orderBy('i.name', 'ASC');

                    return $query;

                },
            );
            // create the field, this is similar the $builder->add()
            // field name, field type, data, options
           $form->add('category_id', EntityType::class, $formOptions);

Как мне получить имена вместо целых чисел?

РЕДАКТИРОВАТЬ ДВА

Вот что в итоге сработало.

 $formOptions = array(
                'class' => 'AppBundle\Entity\GameCategories',
                'label' => 'Game Category',
                'property' => 'category_id',
                'choice_label' => function ($category) {
                    return $category->getName();
                },
                'placeholder' => 'Choose a Category...',
                'query_builder' => function (EntityRepository $er) use ($game_id) {
                    $query = $er->createQueryBuilder('i')
                                ->select(array('i'))
                                ->where('i.gameId = :game_id')
                                ->setParameter('game_id', $game_id)
                                ->orderBy('i.name', 'ASC');
                    return $query;
                },
            );

person smugford    schedule 20.05.2016    source источник


Ответы (1)


Вы добавляете в форму поле category_id, содержащее GameCategories, но вы настраиваете его со списком Products, потому что вы установили 'class' => 'AppBundle\Entity\Products'. Вы должны установить класс AppBundle\Entity\GameCategories, чтобы получить список категорий.

РЕДАКТИРОВАТЬ

Чтобы выбрать, какое свойство используется для отображения ваших сущностей в списке, используйте параметр choise_label:

choice_label
тип: string, callable или PropertyPath

Это свойство следует использовать для отображения сущностей в виде текста в элементе HTML.

person Olivier 'Ölbaum' Scherler    schedule 20.05.2016
comment
Спасибо, это действительно правильно. Я отредактировал вопрос с целочисленной/строковой проблемой. Я почти уверен, что это в моем построителе запросов, но не совсем уверен, как это исправить. - person smugford; 23.05.2016