Php 限制用户在以Symfony2形式提交后检查的单选按钮数
我是新来的Symfony2。我创建了一个表单,它有3组单选按钮和一个提交按钮。为了显示表单,我使用了FormType。现在,我必须应用一个条件,用户只能选择最多2组单选按钮(至少0组单选按钮),而不能选择3组单选按钮。如果用户选择3组单选按钮并单击submit,那么我想向用户抛出一条错误消息,说“您只能选择2” 这是FormType“subscriptionType.php”Php 限制用户在以Symfony2形式提交后检查的单选按钮数,php,database,forms,symfony,doctrine-orm,Php,Database,Forms,Symfony,Doctrine Orm,我是新来的Symfony2。我创建了一个表单,它有3组单选按钮和一个提交按钮。为了显示表单,我使用了FormType。现在,我必须应用一个条件,用户只能选择最多2组单选按钮(至少0组单选按钮),而不能选择3组单选按钮。如果用户选择3组单选按钮并单击submit,那么我想向用户抛出一条错误消息,说“您只能选择2” 这是FormType“subscriptionType.php” 要想做你想做的事,你需要设置 'required' => false 对于event1、event2和event
要想做你想做的事,你需要设置
'required' => false
对于event1、event2和event3,因为required默认设置为true。然后,您需要为表单submit添加一个javascript(或jquery)监听器,并让它在所有三个字段都被选中时插入错误消息。但是,您将遇到无法取消选择单选按钮的问题,因为一旦您选择了单选按钮,您就无法取消选择它,因此,一旦您为这三个按钮都选择了一些内容,您将无法在不刷新页面的情况下提交表单。因此,如果您选择此路线,可能需要对工作流进行一些更改
或者,您也可以在控制器中执行手动检查,然后通过手动添加错误
$form->get('event3')->addError('you can only select 2');
但是您需要“清除”您的订阅,否则它将使用前面的选择重新呈现表单,并且您将进入一个无限循环。对整个表单字段应用Callback
约束怎么样
...
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver
->setDefaults(array(
...
'constraints' => array(
new Callback(
array('callback' => array($this, 'validateForm'))
)
)
));
}
public function validateForm($data, ExecutionContextInterface $context)
{
if (CONDITION) {
// build and add violation
}
}
或者,您可以检查Request
object..通过替换上面“DefaultController.php”中的以下代码,我得到了答案:-
if($form->isValid()){
//获取提交表单的数据
$subscriptions2=$form->getData();
//检查用户是否选择了2个以上的事件
如果($subscriptions2->getEvent1()!=5)&($subscriptions2->getEvent2()!=5)&($subscriptions2->getEvent3()!=5)){
echo“您最多只能选择2个事件”;
回声“
”;
返回$this->render('InstituteProjectEventsStudentBundle:Default:eventsday1.html.twig',数组('form'=>$form->createView());
}
在这里,需要注意的是,我在“subscriptionType.php”中将所有“None of the Upper”单选按钮指定为值5,并将5作为事件id指定给数据库中“Events”表中的所有“None of the Upper”。应该在if($form->isValid()){?如果是,那么我们如何访问单选按钮选项数组?您能为我编写特定于我的代码的代码以及代码的哪一部分吗?@sachindulkar如果您将子表单嵌入主表单,$request->request->get('form\u NAME')['subform\u FIELD\u NAME']
将返回所选选项的数组,通过这种方式您可以检查它们。@xurshid29哦,很好,我完全忘记了回调。很好的解决方案。谢谢xurshid29和Derick FCan,您可以为我的代码编写特定的代码吗?代码的哪一部分?
$form->get('event3')->addError('you can only select 2');
...
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver
->setDefaults(array(
...
'constraints' => array(
new Callback(
array('callback' => array($this, 'validateForm'))
)
)
));
}
public function validateForm($data, ExecutionContextInterface $context)
{
if (CONDITION) {
// build and add violation
}
}
if ($form->isValid()) {
//Get the submitted form's data
$subscriptions2 = $form->getData();
//To check if the user has selected more than 2 events or not
if(($subscriptions2->getEvent1() != 5) && ($subscriptions2->getEvent2() != 5) && ($subscriptions2->getEvent3() != 5)) {
echo 'You can select only a maximum of 2 events';
echo '<br>';
return $this->render('InstituteProjectEventsStudentBundle:Default:eventsday1.html.twig', array('form' => $form ->createView()));
}