Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 限制用户在以Symfony2形式提交后检查的单选按钮数_Php_Database_Forms_Symfony_Doctrine Orm - Fatal编程技术网

Php 限制用户在以Symfony2形式提交后检查的单选按钮数

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

我是新来的Symfony2。我创建了一个表单,它有3组单选按钮和一个提交按钮。为了显示表单,我使用了FormType。现在,我必须应用一个条件,用户只能选择最多2组单选按钮(至少0组单选按钮),而不能选择3组单选按钮。如果用户选择3组单选按钮并单击submit,那么我想向用户抛出一条错误消息,说“您只能选择2”

这是FormType“subscriptionType.php”


要想做你想做的事,你需要设置

'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()));
    }