【问题标题】:Symfony checkbox checked by default, but not if unchecked after persistedSymfony 复选框默认选中,但如果在持久化后未选中则不会
【发布时间】:2018-10-04 15:24:45
【问题描述】:

剧透警告:多年来,这个问题已被多次提出,但到目前为止我还没有看到任何可行的解决方案。以here 为例

我正在开发一个基于 Symfony 2.8 版本的应用程序。

我有一个带有布尔值的实体,我用 CheckboxType 映射到 formType。

我需要的是:

  • 如果这是一个新实体,则选中复选框
  • 如果用户取消选中复选框,然后坚持,我希望取消选中复选框
  • 如果我在用户选中复选框的情况下重新打开表单,那么 坚持,如果我重新打开表单,我希望选中复选框

这就是说,我已经尝试了许多针对主题提出的“解决方案”

1) 在实体中

我已将我的布尔属性设置为 true => FAIL:默认情况下不选中复选框

class MyEntity
{
  /**
   * @ORM\Column(name="enabled", type="boolean")
   */
  private $enabled = true;

  public function __construct()
  {
    $this->enabled = true;
  }
}

2) 在FormType中

  public function buildForm(FormBuilderInterface $builder, array $options)
  {
    $builder
      ->add('enabled', CheckboxType::class, [
        'required' => false,
        'empty_data' => true,
      ]);
  }

这个'empty_data' => true(或'empty_data' => 1,或其他)“部分”工作: 它在持久性之后显示正确的复选框状态,但默认情况下不选中复选框 => FAIL

  public function buildForm(FormBuilderInterface $builder, array $options)
  {
    $builder
      ->add('enabled', CheckboxType::class, [
        'required' => false,
        'data' => true,
      ])
  }

默认情况下它会选中复选框,但如果用户取消选中复选框并保留,重新加载的表单仍然显示复选框已选中,即使持久状态未选中 => FAIL 这是预期的in the docs

由于这个实体不是主表单实体:一个子表单(在一个集合中),我还尝试在 CheckboxType 中将compound attribute 设置为 true,但没有任何效果。

3) 实例化表单时在控制器中设置值

这是不可能的选项,因为复选框不在主实体/表单类型中

=>我的方法

到目前为止,我发现的唯一“工作解决方案”是在使用 javascript 添加此集合的新块时选中复选框:

$(element).prop('checked', true)

这不是最佳的......

对于 SF >=2.8(2.8 是我的版本)你有解决方案吗? Symfony 方面的解决方案。

【问题讨论】:

  • 您在尝试解决方案 1 时是否更新了数据库?在我的项目中,它运行良好。

标签: javascript symfony checkbox


【解决方案1】:
 $builder->add('enabled', CheckboxType::class, array(
        'attr' => array('checked' => 'checked'),
    ));

在persist之前不要忘记设置为true:

$obj->setCheckboxValue(true);

【讨论】:

  • 1) 我不认为它会像我解释的那样工作:我不希望复选框一直选中,只有默认情况下。用户可以取消选中,所以我想不选中它,然后如果重新加载显示未选中。 2)您的回复的第二部分对我来说是不行的:我的复选框不在主要实体中,所以我必须在预冲洗中循环,这是一个代价高昂的额外步骤。
猜你喜欢
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
相关资源
最近更新 更多