Symfony 2.8 - 如何创建"术语&条件"没有映射到基础模型的复选框

时间:2016-02-14 17:19:58

标签: symfony

我正在使用Symfony 2.8,而我正试图创建一个包含"条款和条件的注册表单。条件"复选框未映射到基础数据模型。

我已经按照这本食谱文章: How to Implement a Simple Registration Form

表单验证中的所有内容都有效,除了"术语和&条件"复选框。提交表单后,复选框验证不会被触发。

这是我的代码:

namespace Likestripe\AdminBundle\Form\Type;


use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType;
use Symfony\Component\Validator\Constraints\IsFalse;
use Symfony\Component\Validator\Constraints\IsTrue;


class RegistrationFormType extends AbstractType { //BaseType

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options) {
    // call parent constructor
    //parent::buildForm($builder, $options);

    // add your custom fields
    $builder->add('salutation', ChoiceType::class,   array('choices'  =>   array('Herr' => 0, 'Frau' => 1), 'choices_as_values' => true));
    $builder->add('firstname',  TextType::class,     array());
    $builder->add('lastname',   TextType::class,     array());
    $builder->remove('username');
    $builder->add('company',    new CompanyFormType());
    $builder->add('conditions', CheckboxType::class, array('mapped' => false, 'constraints' => new IsTrue(array("message" => "Bitte akzeptieren Sie noch die AGB und Nutzungsbedingungen."))));
    $builder->add('submit',     SubmitType::class,   array('label' => 'Registrieren'));
} // end function


public function getParent() {
    return 'FOS\UserBundle\Form\Type\RegistrationFormType';

    // Or for Symfony < 2.8
    // return 'fos_user_registration';
}

/**
 * function deprecated since 2.8 https://github.com/symfony/symfony/blob/2.8/UPGRADE-2.8.md#form
 *
 * @return string
 */
public function getName() {
    //return 'likestripe_user_registration';
    return $this->getBlockPrefix();
} // end function

public function getBlockPrefix() {
    return 'likestripe_user_registration';
}

} // end class

我无法看到我的代码与食谱文章中展示的代码之间存在任何差异。

我的Symfony调试控制台的屏幕截图: enter image description here

更新

正如卡米尔提议的那样,我已经检查了条件是否适用。提交表单后会发布复选框表单参数 检查复选框时,param会被张贴,但如果没有,则&#34;条件&#34;表格参数根本没有发布......这种行为让我想起了this case

我仍然想知道为什么official Symfony documentation提出了一个isTrue验证器,它似乎不是检查未选中复选框的解决方案,是否有任何建议如何解决此问题?

选中复选框: enter image description here

未选中复选框 enter image description here

提前感谢您的帮助 ninsky

6 个答案:

答案 0 :(得分:2)

如果你要求&#39;要求&#39;你的CheckboxType为true,约束isTrue没用,因为复选框永远是真的! 如果更改改为:

$builder->add('conditions', CheckboxType::class, array('mapped' => false, 'required' => false, 'constraints' => new IsTrue(array("message" => "Bitte akzeptieren Sie noch die AGB und Nutzungsbedingungen."))));

使用此配置,您可以提交表单,如果未选中该框,则约束将发送您的消息。

希望这有帮助...

答案 1 :(得分:1)

作为一种变通方法,您可以添加表单侦听器以确保提交值。在buildForm()函数的底部添加以下内容:

     $builder->addEventListener(FormEvents::PRE_BIND, function (FormEvent $event) {
        $data = $event->getData();
        if (!isset($data['conditions'])) {
            $data['conditions'] = false;
        }
        $event->setData($data)
    });

作为另一种解决方法,如果请求标头不包含“条件”,您可以执行检入控制器并显示Flash消息。

答案 2 :(得分:1)

Symfony docs提到它:

$builder
            ->add('email', EmailType::class);
            // ...
            ->add('termsAccepted', CheckboxType::class, array(
                'mapped' => false,
                'constraints' => new IsTrue(),
            ))
        );

答案 3 :(得分:0)

好吧,我不知道为什么不为你工作,所以在此期间我给你另一种方式:)

DOMContentLoaded

希望这对你有用。

答案 4 :(得分:0)

我使用CompanyFormType行以外的所有内容运行代码,并且按预期工作。

enter image description here

enter image description here

您可以删除此CompanyFormType行并尝试一下吗?

答案 5 :(得分:0)

您必须设置验证组Overriding Default FOSUserBundle Forms

  

默认情况下,验证时使用注册验证组   新用户注册。除非你已经覆盖了这个值   配置,请确保添加名为的验证组   注册您的姓名财产。

如何做到这一点,你可以在这里找到:Overriding Default FOSUserBundle Validation