【问题标题】:Processing form with multiple checkboxes using Symfony form component使用 Symfony 表单组件处理带有多个复选框的表单
【发布时间】:2017-02-09 14:33:47
【问题描述】:

作为 Silex 应用程序的一部分,我有一个带有多个复选框的表单,以便用户可以从列表中选择一个或多个选项。我导入symfony/form 组件来处理后端表单处理。

我正在编写用于手动显示表单的 HTML,因为它显示在表格中,但我不确定如何使 form_widget 助手实现这一点(当我只想要一个显示“原样”的表单时,这很好)。

每个复选框的代码是(plan.id 是每个计划的唯一 ID):

<input type="checkbox" name="plans[]" value="{{ plan.id }}">

我苦苦挣扎的部分是如何处理数据。目前我路线中的代码是:

$form_builder = $app['form.factory']->createBuilder(FormType::class);

foreach ($plans as $plan) {
  $form_builder->add("plans[]", CheckboxType::class);
}

$form = $form_builder->getForm();

$form->handleRequest($request);

$data = $form->getData();

但是,当我提交表单时,我收到以下错误:

名称“plans[]”包含非法字符。名称应以字母、数字或下划线开头,并且只能包含字母、数字、数字、下划线(“_”)、连字符(“-”)和冒号(“:”)。

在不使用框架的情况下,我在处理带有名为 foo[] 的元素的表单时从来没有遇到过问题。是否有可能使用 Symfony 表单实现相同的结果,还是我需要重新考虑我是如何做到这一点的?

来自composer show的相关版本是:

silex/silex               v2.0.4             The PHP micro-framework based
symfony/form              v3.2.2             Symfony Form Component
symfony/validator         v3.2.2             Symfony Validator Component

【问题讨论】:

  • 我已经更新了使用集合的答案。
  • 您要保存这些复选框的目标实体是什么?
  • 我不确定您所说的“目标实体”是什么意思。我没有保存复选框,它们用于决定在动态生成的报告中使用哪些文档(计划),因此不需要保存在任何地方。

标签: php forms symfony silex


【解决方案1】:

您应该将collections 用于一组复选框。

use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
// ...

$builder->add('plans', CollectionType::class, array(
    'entry_type'   => CheckboxType::class,
    // these options are passed to each "checkbox" type
    'entry_options'  => array(
        'attr'      => array('class' => 'check-box')
    ),
));

【讨论】:

  • 谢谢,我想这很有道理。我如何将单个复选框添加到表单中?目前,表单处理导致$form-&gt;isValid()false$form-&gt;getErrors()-&gt;count()0
  • 一如既往地添加个人 - $form_builder-&gt;add("indivname", CheckboxType::class);
  • 我认为我需要更多代码来调试验证行为。那么,它是否使用name="plans[]" 复选框创建了正确的表单?
  • 不,它不会创建带有多个 name="plans[]" 复选框的表单。
【解决方案2】:

尽管尝试了很多次,但我无法让任何建议的答案/cmets 发挥作用。

最后,我只是简单地为每个复选框添加了一个唯一名称(“plans_”+plan.id),而不是尝试创建一个具有相同名称的复选框数组。它不像处理数组那样干净,我不知道为什么这在 Symfony 中这么麻烦,但它确实有效。

【讨论】:

    猜你喜欢
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2015-01-24
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多