Я пытаюсь использовать тип формы для редактирования одного из моих объектов. Formtype работает безупречно при создании новых объектов, но когда я пытаюсь загрузить существующий объект в форму, я получаю следующее исключение:
Сущность типа «Proxies__CG __ \ App \ Entity \ Language», переданная в поле выбора, должна управляться. Может, вы забыли сохранить это в диспетчере сущностей?
Объект, который помещается в форму, загружается из базы данных, поэтому он уже на 100% сохраняется.
Вот типы:
UnitType
class UnitType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('unitTranslations', CollectionType::class, [
'entry_type' => UnitTranslationType::class,
'entry_options' => array('label' => false),
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'by_reference' => false,
'delete_empty' => true,
'attr' => [
'class' => 'UnitTranslationSelector',
],
])
->add('save', SubmitType::class);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Unit::class
));
}
}
UnitTranslationType
class UnitTranslationType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class, [
'label' => 'Unit',
'by_reference' => false
])
->add('language', EntityType::class, [
'class' => Language::class,
'choice_label' => 'name',
'placeholder' => 'Choose an option',
'by_reference' => false
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => UnitTranslation::class,
));
}
}
и контроллер:
public function createUnit(Request $request, EntityManagerInterface $entityManager)
{
$unit = new Unit();
$unit = $entityManager->getRepository(Unit::class)->find(2);
dump($unit);
$form = $this->createForm(UnitType::class, $unit);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
foreach ($unit->getUnitTranslations() as $translation) {
$translation->setUnit($unit);
}
$entityManager->persist($unit);
$entityManager->flush();
return $this->redirectToRoute("recipe_list");
}
return $this->render('createUnit.html.twig', array('form' => $form->createView()));
}
@Cerad нет, собственность частная
Печалька. Итак, почему в вашем языке EntityType есть атрибут by_reference?
честно говоря, я не знаю, почему этот атрибут был там, но проблема в by_reference, когда я удаляю его, поэтому по умолчанию установлено значение true, загрузка работает без каких-либо проблем. Большое спасибо!
Рад, что он работает. Всегда наслаждайтесь решениями, когда ни помощник, ни помощник не понимают, почему это работает.
да, это действительно странно, но пока он работает, я счастлив :) Вы хотите дать ответ, чтобы я мог его принять?
Неа. Может быть, кто-нибудь еще подойдет и предоставит реальное объяснение.
Я думаю, проблема была в методе Unit :: addUnitTranslation (). Поскольку 'by_reference' => false, вызовет эту функцию




Я знаю, что этот вопрос старый, но я просто решил ту же проблему, используя CollectionType вместо EntityType (для языковой сущности в вашем случае). Я не уверен, как настроены ваши сущности, но для CollectionType потребуется связь OneToMany или ManyToMany между сущностью UnitTranslation и сущностью Language. Описание для CollectionType можно найти здесь, а как встроить коллекцию форм можно найти там.
Это всего лишь предположение, но является ли свойство Unit :: unitTranslations общедоступным?