我正在使用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
我无法看到我的代码与食谱文章中展示的代码之间存在任何差异。
更新
正如卡米尔提议的那样,我已经检查了条件是否适用。提交表单后会发布复选框表单参数 检查复选框时,param会被张贴,但如果没有,则&#34;条件&#34;表格参数根本没有发布......这种行为让我想起了this case。
我仍然想知道为什么official Symfony documentation提出了一个isTrue验证器,它似乎不是检查未选中复选框的解决方案,是否有任何建议如何解决此问题?
提前感谢您的帮助 ninsky
答案 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)
答案 5 :(得分:0)
您必须设置验证组Overriding Default FOSUserBundle Forms
默认情况下,验证时使用注册验证组 新用户注册。除非你已经覆盖了这个值 配置,请确保添加名为的验证组 注册您的姓名财产。
如何做到这一点,你可以在这里找到:Overriding Default FOSUserBundle Validation