【问题标题】:Cannot edit a form where "setData" has been set - Symfony3无法编辑已设置“setData”的表单 - Symfony3
【发布时间】:2017-03-02 09:28:41
【问题描述】:

我的controller 中有一个function,可以让我编辑餐厅页面。

我需要setData 一些值,以便将它们从显示视图保留到编辑视图,并且我需要在cityzipCode 字段上使用它。

$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'
            ))
}

如果您有任何可以帮助我并解决该问题的方法,我们将不胜感激。

【问题讨论】:

    标签: forms controller symfony


    【解决方案1】:

    一旦您创建了表单并调用了handleRequest,Symfony 就会使用该版本的表单进行处理(例如验证等)。 如果您在此之后更改表单,Symfony 将不高兴。

    根据您要执行的操作以及定义实体/表单的方式,使用validation groupsdynamic form events 来处理任何更改。

    根据您显示的内容,为什么不修改表单以显示餐厅的城市名称,而不是尝试在控制器中设置它。
    例如;

    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'
            ));
        }
    }
    

    【讨论】:

    • 嗨@Rooneyl 感谢您的评论。我看过FormEvents,但我很新,我真的不知道如何用formevents解决这个问题。 ammend the forw to show... 是什么意思,如果你想看的话,我可以将表单部分添加到我的问题中?
    • @crisscross 你能在表单代码中添加创建城市名称/代码的部分吗?我会尽力帮助你
    • 另外我想告诉你,我使用了一个名为 service$cityManager
    • ' data' => $options['data']->getCity()->getName(),
    • @crisscross 这是因为在编辑表单时有一个完整的餐厅对象,而在创建时它有一个空对象。您可以检查表单是否存在以测试城市是否存在,然后添加它或使用验证组来控制表单呈现。我会更新我的答案
    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 2014-05-22
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多