在Symfony2表单中有一个未映射的条款和条件复选框


Having a unmapped Terms and Condition checkbox in a Symfony2 Form

我有一个注册表格,需要一个复选框来同意网站的条款和条件。由于我不想将复选框的值保存在用户对象中,所以我手动添加了一个复选框字段,该字段没有映射到数据对象。

当我在没有勾选"条款"复选框的情况下提交注册表格时,会显示一个错误(这没关系,因为复选框是必需的)。但是,复选框现在已选中,这是不需要的。它应该总是不被检查(这样在表格中的每一个错误之后,你都必须再次检查),或者保持你提交的方式。

以下是代码(从FOSUserBundle覆盖RegistrationController):

public function registerAction(Request $request)
{
    /** @var $formFactory 'FOS'UserBundle'Form'Factory'FactoryInterface */
    $formFactory = $this->container->get('fos_user.registration.form.factory');
    /** @var $userManager 'FOS'UserBundle'Model'UserManagerInterface */
    $userManager = $this->container->get('fos_user.user_manager');
    /** @var $dispatcher 'Symfony'Component'EventDispatcher'EventDispatcherInterface */
    $dispatcher = $this->container->get('event_dispatcher');
    $user = $userManager->createUser();
    $user->setEnabled(true);
    $event = new GetResponseUserEvent($user, $request);
    $dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event);
    if (null !== $event->getResponse()) {
        return $event->getResponse();
    }
    $form = $formFactory->createForm();
    $form->setData($user);
    $form->add('xterms', 'checkbox', array(
        'mapped' => false,
        'empty_data' => false,
        'required' => 'required',
        'label' => 'label.terms',
        'constraints' => array(new NotNull())));
    if ('POST' === $request->getMethod()) {
        $form->bind($request);
        if ($form->isValid()) {
            $event = new FormEvent($form, $request);
            $dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);
            $userManager->updateUser($user);
            if (null === $response = $event->getResponse()) {
                $url = $this->container->get('router')->generate('fos_user_registration_confirmed');
                $response = new RedirectResponse($url);
            }
            $dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));
            return $response;
        }
    }
    return $this->container->get('templating')->renderResponse('FOSUserBundle:Registration:register.html.'.$this->getEngine(), array(
        'form' => $form->createView(),
    ));
}

您可以使用表单元素选项数组中的数据属性为复选框或任何表单字段添加默认值

http://symfony.com/doc/current/reference/forms/types/checkbox.html#data

$form->add('xterms', 'checkbox', array(
        'mapped' => false,
        'empty_data' => false,
        'required' => 'required',
        'label' => 'label.terms',
        'data'=>false,
        'constraints' => array(new NotNull())));

希望它能帮助你

我通过以下操作解决了这个问题:

  1. 将我的代码从注册控制器移动到RegistrationFormType.php
  2. 删除了属性empty_data(必需)和NotNull约束
  3. 使用回调约束检查字段的值

*编辑:我已经把它标记为一个解决方案,因为这是我解决问题的方法。然而,它并没有直接解决这个问题。