Forms 无法编辑包含“";“设置数据”;已设置为-Symfony3
我的Forms 无法编辑包含“";“设置数据”;已设置为-Symfony3,forms,controller,symfony,Forms,Controller,Symfony,我的控制器中有一个功能,可以编辑餐厅页面 我需要setData一些值,以便将它们从显示视图保留到编辑视图,我需要在city和zipCode字段中使用它 $editForm->get('cityName')->setData($restaurant->getCity()->getName()); $editForm->get('cityZipCode')->setData($restaurant->getCity()->getZipCode());
控制器中有一个功能
,可以编辑餐厅页面
我需要setData
一些值,以便将它们从显示视图保留到编辑视图,我需要在city
和zipCode
字段中使用它
$editForm->get('cityName')->setData($restaurant->getCity()->getName());
$editForm->get('cityZipCode')->setData($restaurant->getCity()->getZipCode());
但当出现此错误消息时,一旦我使用了setData
,我就无法再编辑我的表单了
You cannot change the data of a submitted form.
这是控制器部分
public function editAction(Request $request, Restaurant $restaurant)
{
$deleteForm = $this->createDeleteForm($restaurant);
$editForm = $this->createForm(RestaurantType::class, $restaurant);
$editForm->handleRequest($request);
$editForm->get('cityName')->setData($restaurant->getCity()->getName());
$editForm->get('cityZipCode')->setData($restaurant->getCity()->getZipCode());
if ($editForm->isSubmitted() && $editForm->isValid()) {
$em = $this->getDoctrine()->getManager();
$cityManager = $this->container->get('admin.city_manager');
$cityManager->newCity($editForm, $restaurant);
$em->flush();
return $this->redirectToRoute('admin_restaurant_show_fr', array('id' => $restaurant->getId()));
}
return $this->render('admin/restaurant/edit.html.twig', array(
'restaurant' => $restaurant,
'edit_form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
));
}
这是FormType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class, array(
'label' => 'Nom',
))
->add('latitude', NumberType::class, array(
'label' => 'Latitude',
))
->add('longitude', NumberType::class, array(
'label' => 'Longitude',
))
->add('address', TextType::class, array(
'label' => 'Adresse',
))
->add('cityName', TextType::class, array(
'mapped' => false,
'label' => 'Ville'
))
->add('cityZipCode', TextType::class, array(
'mapped' => false,
'label' => 'Code Postal'
))
}
如果您有任何可以帮助我解决该问题的方法,我们将不胜感激。一旦您创建表单并调用HandlerRequest
,Symfony将使用该版本的表单进行处理(例如验证等)。
如果在此之后更改表单,Symfony将不会高兴
根据您尝试执行的操作以及您定义实体/表单的方式,使用或处理任何更改
根据您所显示的内容,为什么不在表单中显示餐厅的城市名称,而不是尝试在控制器中设置它。
比如,
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class, array(
'label' => 'Nom',
))
->add('latitude', NumberType::class, array(
'label' => 'Latitude',
))
->add('longitude', NumberType::class, array(
'label' => 'Longitude',
))
->add('address', TextType::class, array(
'label' => 'Adresse',
));
// if you want the fields not shown on the form
if (! empty($options['data']->getCity()) {
$builder->add('cityName', TextType::class, array(
'data' => $options['data']->getCity()->getName()
'mapped' => false,
'label' => 'Ville'
))
->add('cityZipCode', TextType::class, array(
'data' => $options['data']->getCity()->getZipCode()
'mapped' => false,
'label' => 'Code Postal'
));
}
// or if you want them there
$cityName = '';
$cityZipCode = '';
if (! empty($options['data']->getCity()) {
$cityName = $options['data']->getCity()->getName();
$cityZipCode = $options['data']->getCity()->getZipCode();
}
$builder->add('cityName', TextType::class, array(
'data' => $cityName
'mapped' => false,
'label' => 'Ville'
))
->add('cityZipCode', TextType::class, array(
'data' => $cityZipCode
'mapped' => false,
'label' => 'Code Postal'
));
}
}
创建表单并调用HandlerRequest
后,Symfony将使用该版本的表单进行处理(例如验证等)。
如果在此之后更改表单,Symfony将不会高兴
根据您尝试执行的操作以及您定义实体/表单的方式,使用或处理任何更改
根据您所显示的内容,为什么不在表单中显示餐厅的城市名称,而不是尝试在控制器中设置它。
比如,
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class, array(
'label' => 'Nom',
))
->add('latitude', NumberType::class, array(
'label' => 'Latitude',
))
->add('longitude', NumberType::class, array(
'label' => 'Longitude',
))
->add('address', TextType::class, array(
'label' => 'Adresse',
));
// if you want the fields not shown on the form
if (! empty($options['data']->getCity()) {
$builder->add('cityName', TextType::class, array(
'data' => $options['data']->getCity()->getName()
'mapped' => false,
'label' => 'Ville'
))
->add('cityZipCode', TextType::class, array(
'data' => $options['data']->getCity()->getZipCode()
'mapped' => false,
'label' => 'Code Postal'
));
}
// or if you want them there
$cityName = '';
$cityZipCode = '';
if (! empty($options['data']->getCity()) {
$cityName = $options['data']->getCity()->getName();
$cityZipCode = $options['data']->getCity()->getZipCode();
}
$builder->add('cityName', TextType::class, array(
'data' => $cityName
'mapped' => false,
'label' => 'Ville'
))
->add('cityZipCode', TextType::class, array(
'data' => $cityZipCode
'mapped' => false,
'label' => 'Code Postal'
));
}
}
你好,鲁尼谢谢你的评论。我看过FormEvents
,但我是个新手,不知道如何用FormEvents解决这个问题。如果你想,我可以在我的问题中添加表单部分,如果你想看的话?@crosscross你可以在表单代码中添加创建城市名称/代码的部分吗?我会尽力帮助你的。我还想告诉你,我使用了一个名为$cityManager
的服务当我想创建一家餐厅时,调用null上的成员函数getName():(它说你给我看的那行是它的主要错误。'data'=>$options['data']->getCity()->getName()),@crosscross这是因为编辑表单时有一个完整的餐厅对象,而在创建表单时有一个空对象。您可以检查表单以测试city是否存在,然后添加它,或者使用验证组控制表单呈现。谢谢您的评论,我将在abitHi@Rooneyl中更新我的答案。我查看了FormEvents
但是我是个新手,我真的不知道如何用formevents来解决这个问题。你说的amend the forw to show是什么意思…
如果你想看,我可以在我的问题中添加表单部分,如果你想看的话?@crosscross你能添加表单代码中创建城市名称/代码的部分吗?我会尽力帮助你的,我也想告诉你你知道我使用了一个名为$cityManager
的服务哦,等等……现在当我想创建一个餐厅时,我得到了一个错误调用了一个成员函数getName(),该函数为null
:(它说你给我看的那一行是它的主要错误。'data'=>$options['data']->getCity()->getName(),@crosscross这是因为编辑表单时有一个完整的餐厅对象,而在创建表单时有一个空对象。您可以检查表单是否存在,然后添加它,或者使用验证组控制表单的呈现。我将在abit中更新我的答案