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中更新我的答案