Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.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
Forms Symfony2表单未选中复选框未被考虑,为什么?_Forms_Symfony_Checkbox - Fatal编程技术网

Forms Symfony2表单未选中复选框未被考虑,为什么?

Forms Symfony2表单未选中复选框未被考虑,为什么?,forms,symfony,checkbox,Forms,Symfony,Checkbox,当我发送带有未选中复选框的表单时,如果相关实体属性等于true,则它不会变为false 另一种方法(在发送带有复选框的表单时,将属性设置为true)可以正常工作,所有表单和其他字段也可以保存 以下是我如何构建表单并声明相关属性: // --- Form creation function EntityType::buildForm() --- $builder->add('secret', 'checkbox', array( 'required' => false )); //

当我发送带有未选中复选框的表单时,如果相关实体属性等于
true
,则它不会变为
false

另一种方法(在发送带有复选框的表单时,将属性设置为true)可以正常工作,所有表单和其他字段也可以保存

以下是我如何构建表单并声明相关属性:

// --- Form creation function EntityType::buildForm() ---
$builder->add('secret', 'checkbox', array( 'required' => false ));

// --- Entity related property, Entity.php file ---
/** @ORM\Column(name="secret", type="boolean") */
protected $secret;

编辑:出现此问题是因为表单是使用补丁请求提交的

在Symfony中,请求处理程序通过以下行调用
Form::submit
方法:

$form->submit($data, 'PATCH' !== $method);
因此,在补丁请求的情况下,
Form::submit
$clearMissing
参数设置为
false
,从而将未发送字段保留为其旧值

但我不知道如何解决这个问题。如果我在没有选中复选框时将一个JSON<代码> {秘密:false }//>传递给SyfFrand框架,它将把它解释为<代码>“false”/COD>字符串,并考虑一个真值,因此考虑复选框检查……/P>

注意。我的问题与完全相同,使用
选项
字段类型的复选框数组
(带有
多个
扩展
)链接到一个简单数组属性:一旦选中一个给定的复选框就发送一次,不可能将相关属性设置回
false
,随后提交
未选中

这可能是因为架构上不需要该字段。您可以使用以下内容为复选框提供默认值:

$builder->add('secret', 'checkbox', array(
  'required' => false,
  'empty_data' => false
));

请参阅或

您使用的是什么版本的Symfony

vendor/symfony/symfony/src/symfony/Component/Form/Form.php
,在
Form::submit()
中,应该有一些专门针对您所写情况的代码:

我的电话号码是525-534。你能检查一下这个能正常工作吗


另一个潜在客户可能是自定义表单订阅者,该订阅者无法完全按照预期的方式工作-覆盖提供的值。

发生此问题的原因是表单是使用补丁请求提交的

这导致了开放

如前所述,一种解决方法是在复选框未选中时明确发送一个特定的保留值(例如字符串“\uu false”)(而不是不发送任何内容),并使用表单类型中的自定义数据转换器将该值替换为“null”:

// MyEntityFormType.php -- buildForm method
$builder->add('mycheckbox', ...);
$builder->get('mycheckbox')
    ->addViewTransformer(new CallbackTransformer(
        function ($normalizedFormat) {
            return $normalizedFormat;
        },
        function ($submittedFormat) {
            return ( $submittedFormat === '__false' ) ? null : $submittedFormat;
        }
    ));

“选择”字段的情况不能用同样的方法解决。这实际上是Symfony的一个bug,在中处理。

以上提到的问题对我没有帮助。 所以,我用这个

解释

当使用“PATCH”方法时,这个问题的解决方案是在表单类型中添加额外的隐藏“timestamp”字段,并将其放在twig文件中问题的复选框旁边。这是需要传递的东西随着复选框,这肯定会改变-时间戳将改变

下一步是使用PRE_SUBMIT事件并等待表单字段到达,如果未设置,我将手动设置它。。。工作正常,我不介意额外的代码

FormType

$builder
...
->add('some_checkbox')
->add('time_stamp', 'hidden', ['mapped' => false, 'data' => time()])
...
小树枝

{{ form_widget(form.time_stamp) }}
{{ form_widget(form.some_checkbox) }}
在生成器中预先提交事件

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use($options) {

    $data = $event->getData();
    $form = $event->getForm();

    if (!$data) {
        return;
    }
    /* Note that PATCH method is added as an option for "createForm" 
     * method, inside of your controller 
    */       
    if ($options["method"]=="PATCH" && !isset($data['some_checkbox'])) {
        $form->getData()->setSomeCheckbox(false);//adding missing checkbox, since it didn't arrive through submit.. grrr
    }            
});

这个解决方案对我有效

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('isActive', CheckboxType::class, array(
            'required' => false
        ))
    $builder->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $e {
        $entity = $e->getData();
        $form = $e->getForm();
        $isActive = empty($_POST[$form->getName()]['isActive']) ? false : true;
        $entity->setIsActive($isActive);
    });
}

另一种可能是添加一个隐藏元素,并使用Javascript实现。在使用没有javascript的浏览器的用户中,有0.1%的用户会失败。 这是多个复选框FormType元素的简单示例:

            ->add('ranges', ChoiceType::class, array(
            'label'   => 'Range',
            'multiple' => true,
            'expanded' => true,
            'choices' => array(
                null => 'None',
                'B1' => 'My range',
            )
        ))

<script>
$(document).ready(function() {
       function updateDynRanges(object) {
            if (object.prop("checked")) {
                document.getElementById('ranges_0').checked = 0;
            } else {
                document.getElementById('ranges_0').checked = 1;
            }
        }
 // On page onload
        $('#ranges_1').change(function() {
           updateDynRanges($(this));
        });
        updateDynRanges($('ranges_1'));
}
</script>
->add('ranges',ChoiceType::class,array(
“标签”=>“范围”,
“多个”=>true,
“扩展”=>true,
“选项”=>数组(
null=>“无”,
“B1”=>“我的范围”,
)
))
$(文档).ready(函数(){
函数updateDynRanges(对象){
if(object.prop(“选中”)){
document.getElementById('ranges_0')。选中=0;
}否则{
document.getElementById('ranges_0')。选中=1;
}
}
//在页面上加载
$('#ranges_1')。更改(函数(){
更新的ynranges($(this));
});
更新的ynranges($('ranges_1'));
}
如果测试成功,您可以在第二个复选框中添加可见性:false

细枝模板:

 {{ form_label(form.dynamicRanges) }}<br>
 {{ form_widget(form.dynamicRanges[1]) }}
 <div class="hidden">{{ form_widget(form.ranges[0]) }}</div>
{{form_标签(form.dynamicRanges)}}
{{form_小部件(form.dynamicRanges[1])} {{form_小部件(form.ranges[0])}

看起来是一个丑陋的解决方案,但我只是想与其他丑陋的建议解决方案竞争,在这种情况下,主要是更新细枝模板。

我已经测试过了,但它不起作用。值得一提的是,我通过前端定制的表单将数据发送到表单。我已经测试过明确发送
false
如果未选中复选框,但最终会发送
“false”
字符串,该字符串由表单“empty\u data”解释为
true
是组件使用的php值,它不会转换为字符串,@Silverspur您的尝试不同,这可能会起作用。我知道这是两件不同的事情。我只是想告诉大家,我不仅按照建议测试了
'empty_data'
参数的使用,而且还显式发送了
false
值:)实际上,需要指出的是,
empty_data
在这里不起作用,因为当调用
Form::submit
函数时,
$clearMissing
设置为
false
(这是补丁请求的情况),提交过程甚至不考虑未发送数据的字段(其中未选中的复选框),因此,此类字段的
empty_data
值永远不会被使用。如果您使用自定义代码提交表单,并且希望将复选框标记为fals
 {{ form_label(form.dynamicRanges) }}<br>
 {{ form_widget(form.dynamicRanges[1]) }}
 <div class="hidden">{{ form_widget(form.ranges[0]) }}</div>