【问题标题】:Determine which RadioType form was selected in contorller确定在控制器中选择了哪个 Radio Typeform
【发布时间】:2019-03-18 21:44:52
【问题描述】:

我有一个表单,它有多个 RadioTypes 来表示一个 Announcement 实体的类别。

$builder
->add('info', RadioType::class,
            [
                'label_attr' => ['class' => 'sr-only'],
                'required' => false
            ])

        ->add('star', RadioType::class,
            [
                'label_attr' => ['class' => 'sr-only'],
                'required' => false
            ])

我计划为 8 种选择提供 8 种不同的 RadioType。确定选择了哪个 RadioType 的最佳方法是什么。我目前的实现是每个都有一个if 声明,但这似乎是一个糟糕的解决方案。

if ($form->getData()['info'] == true) {
            //do stuff
        }
        if ($form->getData()['star'] == true) {
            //do stuff
        }

【问题讨论】:

  • 为什么if 似乎是一个糟糕的解决方案?您可以改用 switch 语句,尽管它们在语义上是相同的。
  • 如果你有 8 个单选输入并且你只希望用户能够同时选择一个,那么没有理由使用 JS。这就是无线电输入默认的工作方式。这就是他们的目的。只需给它们相同的名称但不同的值即可。
  • @MagnusEriksson 的问题是,他们的代码生成了一堆不相关但名称不同的单选按钮,因此它们根本没有链接。
  • @miken32 - 除非他们按照你在回答中建议的那样做:-)
  • @MagnusEriksson 我实际上尝试了建议的答案,但它使样式变得更加困难(请参阅我对答案的评论)

标签: php symfony symfony-forms


【解决方案1】:

According to the documentation,您通常不应该直接使用RadioType。使用ChoiceType object 允许您遵循预期的HTML 标准,这意味着您可以为每个元素使用相同的名称但不同的值。这样,浏览器就会像单选按钮一样自动将用户限制为一个选项。

<?php
$builder->add('yourCategory', ChoiceType::class, [
    'choices' => [
        'Info' => 'info',
        'Star' => 'star',
        'Some other label' => 'other',
    ],
    // attributes for label elements
    'label_attr' => ['class' => 'sr-only'],
    // attributes for input elements
    'choice_attr' => [
        'Info' => ['class' => 'fa fa-info'],
        'Star' => ['class' => 'fa fa-star'],
        'Some other label' => ['class' => 'whatever'],
     ],
    // setting these options results in radio buttons
    // being generated, instead of a select element
    'expanded' => true,
    'multiple' => false,
]);

然后在你的控制器中:

switch($form->getData()['yourCategory']) {
    case 'info':
        // do stuff
        break;
    case 'star':
        // do stuff
        break;
    case 'other':
        // do stuff
        break;
}

【讨论】:

  • 我尝试以这种方式实现它,但问题在于它使样式变得非常困难。本质上,我想隐藏标签,并且只有 Font Awesome Icons 作为“单选按钮”。据我所知,ChoiceType 是不可能的
  • @d1596 - 您可以跳过表单构建器并手动编写单选按钮吗?如果它对你的阻碍大于对你的帮助,那么你不应该使用它。
  • @d1596 label_attr 选项应该仍可用于执行与原始代码相同的操作。或者,正如 Magnus 所建议的,只需手动输入即可。
  • @miken32 label_attr 选项只会更改整个选择类型表单的单个标签,不是吗?我需要为每个选项设置一个独特的图标
  • @d1596 我不知道,你试过了吗?从我在示例中可以看到,没有办法指定“整个选择类型表单的单个标签”,因此它看起来并不相关。您可以为每个输入指定属性,但似乎不能为每个标签指定属性。
【解决方案2】:

所以我最终能够手动更改每个选项的标签

{# Manually set the label for each choice in the form, so only an icon is shown #}
        <label for="{{ form.choices.children[0].vars.id}}" class="mt-2">
            <span class="fa-stack fa-2x type-icon" id="info-type">
                <span class="fas fa-circle fa-stack-2x circle"></span>
                <span class="info fas fa-info fa-stack-1x"></span>
            </span>
         </label>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    相关资源
    最近更新 更多