【问题标题】:How do I stop Symfony 2 checkbox from returning null如何阻止 Symfony 2 复选框返回 null
【发布时间】:2015-06-24 14:34:10
【问题描述】:

在我的 Symfony 2 表单上,我有 2 个复选框。文档说明

"如果该框被选中,该字段将被设置为true,如果该框是 未选中,该值将设置为 false"

这是我希望发生的事情,但是当未选中复选框时,我实际上什么也得不到。我意识到如果未选中,HTML 表单上的复选框通常不会返回任何内容,我通常会在后端添加一些逻辑来处理它,但听起来 Symfony 应该为我这样做,而不是。

我做错了什么或错过了什么?

我的表单类型如下所示:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('fullname', 'text')
            ->add('screened', 'checkbox', array(
                'label'     => 'Enable screening emails?' ))
            ->add('dedupe', 'checkbox', array(
                'label'     => 'Enable live dedupeing?'))
 );)

树枝模板的相关部分如下所示:

<div class="form-group">
    <div class="input-group col-sm-offset-2 col-sm-10">
        <div class="checkbox col-sm-6">
            {{ form_widget(form.screened) }}
            {{ form_label(form.screened) }}
        </div>
        <div class="checkbox col-sm-6">
            {{ form_widget(form.dedupe, {'attr': {'required': 'false'}}) }}
            {{ form_label(form.dedupe) }}
        </div>

    </div>
</div>

在此处的控制器中创建表单:

/**
     * Creates a new User entity.
     *
     */
    public function createAction(Request $request)
    {
        $entity = new User();
        $form = $this->createCreateForm($entity);
        $form->handleRequest($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $this->get('project_login.user_manager')->setUserPassword($entity, $form->get('password')->getData());

            $em->persist($entity);
            $em->flush();

            return $this->redirect($this->generateUrl('user_show', array('id' => $entity->getId())));
        }

        return $this->render('ProjectLoginBundle:User:new.html.twig', array(
            'entity' => $entity,
            'form'   => $form->createView(),
        ));
    }

    /**
     * Creates a form to create a User entity.
     *
     * @param User $entity The entity
     *
     * @return \Symfony\Component\Form\Form The form
     */
    private function createCreateForm(User $entity)
    {
        $form = $this->createForm(new UserType(), $entity, array(
            'action' => $this->generateUrl('user_create'),
            'method' => 'POST', 'validation_groups' => array('create')
        ));

        $form->add('submit', 'submit', array('label' => 'Create'));

        return $form;
    }

【问题讨论】:

  • 我不太清楚是什么问题...你能澄清一下吗?
  • 当表单被提交并且复选框被取消选中时,复选框的值不会被返回。 Thios 是我对 HTML 表单的期望,但在 Symfony 文档中,当未选中时,它应该返回 False。为什么我一无所获,反而是假的?

标签: symfony checkbox symfony-forms


【解决方案1】:

如果我理解得很好,您需要在未检查该字段时进行处理,因为您在处理表单请求时没有得到响应

你可以这样解决:

 if ($form->isValid()) {
     $form->handleRequest($request);

     $em = $this->getDoctrine()->getManager();

     $entity = $form->getData();

     var_dump($entity->getScreened());
     var_dump($entity->getFullname());
     var_dump($entity->getDedupe());

     // They should return you the values set on the create form
     $em->persist($entity);
     $em->flush();
 }

如果没有以这种方式获取值,但不是正确的方式......

if (!isset($form->get('screened')) {
    $entity->setScreened(false);
}

if (!isset($form->get('dedupe')) {
    $entity->setDedupe(false);
}

它将检查您是否没有收到任何重复数据删除数据并从表单中筛选,如果是这种情况,您将知道该值尚未被检查

【讨论】:

  • 是的,正如我所说,我通常会(在标准 PHP 中)处理后端缺少值的情况,但 Symfony 文档说我不需要,它应该处理它我。
  • 您是否使用实体属性映射字段? data_class 是否与某个实体相关?
  • 不确定你的意思。表单在创建时映射到用户实体,并且筛选和重复数据删除是用户实体中的字段。我将编辑我的问题添加该代码。\
  • 如果我要添加你建议的代码来设置缺失值,我需要把它放在哪里?
  • 尝试转储 $form->getData(),如果表单与实体相关联,您以后不需要设置值,$form->getData() 应该返回实体$user 因为已经被映射,我会更新我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 2013-10-24
  • 2015-03-31
相关资源
最近更新 更多