forms - Symfony2 表单未选中的复选框未考虑在内,为什么?

标签 forms symfony checkbox

当我发送带有未选中复选框的表单时,如果相关实体属性等于 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;

编辑:问题的发生是因为表单是使用 提交的PATCH 请求 .

在 Symfony 中,Form::submit方法由具有以下行的请求处理程序调用:
$form->submit($data, 'PATCH' !== $method);

结果Form::submit $clearMissing参数设置为 false在 PATCH 请求的情况下,因此将未发送的字段保留为旧值。

但我不知道如何解决这个问题。如果我明确地传递一个 JSON {secret: false}当复选框未被选中时,Symfony 框架会将其解释为 "false"字符串并认为这是一个真实的值,因此考虑选中复选框...

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

最佳答案

非上述没有帮助我。
所以,我正在使用这个......

说明

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

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

表单类型

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

Twig
{{ form_widget(form.time_stamp) }}
{{ form_widget(form.some_checkbox) }}

构建器中的 PRE_SUBMIT 事件
$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
    }            
});

关于forms - Symfony2 表单未选中的复选框未考虑在内,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35502979/

相关文章:

javascript - $_POST with javascript – 它在 javascript 中有效,但在 jquery 插件中无效

mysql - Symfony2,加入 doctrine2 或 sql

javascript - 使用 nextall jquery 的复选框选择器

html - 输入检查状态不影响 css 选择器

html - 根据 &lt;input&gt; 的状态设置 <label> 的样式

php - 将变量从一个 PHP 页面发送到另一个

javascript - 如何比较表格中的两个数字?

php - 从具有 PHP 值的 html 表创建输入字段

symfony - FOSUser 捆绑 check_path 与本地化

PHP 命令行界面 : Possible to set a $_SERVER Variable that's an Array?