Динамические формы 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;
},
);

1

Решение

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

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

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

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

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

1

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

Других решений пока нет …

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