Symfony2 Ajax形式&编辑动作

时间:2014-05-24 03:38:24

标签: symfony symfony-2.3

我正在使用symfony 2.3,我正在使用Ajax表单。这是我的架构,我正在使用FOSUserBundle,我为用户配置文件添加了一个额外的表。在showProfile操作中,如果创建了它,则从数据库中获取相应的UserProfile,并将表单发送到视图,现在一切正常。

为了处理表单请求,我创建了另一个返回JsonResponse的操作,这个操作处理UserProfile表单请求,我的代码如下所示:

public function processProfileAction(Request $request)
    {
        $userManager = $this->container->get('fos_user.user_manager');
        $user = $userManager->findUserByUsername($this->container->get('security.context')->getToken()->getUser());

        $userProfile = new UserProfile();
        $formFactory = $this->container->get('fos_user.profile.form.factory');
        $postform = $formFactory->createForm();
        $postform->setData($userProfile);
        if ($request->isMethod('POST') ) 
        { 
            $postform->bind($request);
            $response = new JsonResponse();
            if ($postform->isValid()) 
            {                
                $userProfile->setUser($user);

                $em = $this->container->get('doctrine')->getManager();
                $em->persist($userProfile);
                $em->flush();

                $response->setData(array("Success" => true, "Message" => "Your data was saved successfully"));
            }
            else {
                $response->setData(array("Success" => false, "Cause" => "Invalid form data"));
            }
            return $response;
        }
        $response = new JsonResponse();
        $response->setData(array("Success" => false, "Cause" => "Method is not POST"));
        return responde;
    }

如果我想编辑用户个人资料,则错误显示:

Integrity constraint violation: 1062 Duplicate entry

这是视图中的表单:

<form id="user_profile_form" action="{{ path('_process_user_profile') }}" {{ form_enctype(userProfileForm) }} method="POST">
                    {{ form_errors(userProfileForm) }}
                    {{ form_widget(userProfileForm._token) }}
                    <div class="row">
                        <div class="col-xs-5">
                            <div class="widget_error">{{ form_errors(userProfileForm.first_name) }}</div>
                            <div class="form-row" style="width:250px;">
                                {{ form_widget(userProfileForm.first_name, {'label': null, 'attr': {'class': 'form-control', 'placeholder': 'placeholder.first_name'|trans}} ) }}
                            </div>
                        </div>
                        <div class="col-xs-5">
                            <div class="widget_error">{{ form_errors(userProfileForm.last_name) }}</div>
                            <div class="form-row" style="width:250px;">
                                {{ form_widget(userProfileForm.last_name, {'label': null, 'attr': {'class': 'form-control', 'placeholder': 'placeholder.last_name'|trans}} ) }}
                            </div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-xs-3"><button type="submit" class="btn btn-info">{{ 'buttons.save_changes'|trans }}</button></div>
                    </div>
                    </form>

我知道用户个人资料已经存在,我正在尝试创建一个具有相同user_id的新用户,我该如何解决这个问题?我错过了什么吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我修复了自己的代码。在绑定表单之前,我没有创建新的UserProfile实例。

这就是我的所作所为:

$em = $this->container->get('doctrine')->getManager();            
$userProfile = $em->getRepository('AloBundle:UserProfile')->findOneBy(array("user" => $user->getId()));
if ((!isset($userProfile))) $userProfile = new UserProfile();

我尝试从数据库中检索实际的UserProfile,如果它不存在,我会创建一个新的{{1}}。代码完美无缺。