在Symfony v4.2中将带有数据的数组传递给ChoiceType(HTML选择器)

4

介绍

我的个人项目中使用了:

  • Symfony v4.2
  • PHP 7.2.12

问题

我无法弄清如何使ChoiceType元素将IDsEMAILs显示为HTML SELECT选项的索引

示例

图片显示了当前从数据库中获取的idemail数据的html select的状态。

The picture displays current state of `thml select  with data from database

代码

来自数据库的数据数组($this->userChoices)

array:4 [
    0 => array:2 [
        "id" => 7
        "email" => "1st@example.com"
    ]
    1 => array:2 [
        "id" => 8
        "email" => "2nd@example.com"
    ]
    2 => array:2 [
        "id" => 5
        "email" => "3rd@example.com"
    ]
    3 => array:2 [
        "id" => 6
        "email" => "4th@example.com"
    ]
]

我正在了解的内容
<select id="my-select" name="my-select" class="form-control">
    <optgroup label="0">
        <option value="7">7</option>
        <option value="1st@example.com">1st@example.com</option>
    </optgroup>
    <optgroup label="1">
        <option value="8">8</option>
        <option value="2nd@example.com">2nd@example.com</option>
    </optgroup>
    <optgroup label="2">
        <option value="5">5</option>
        <option value="3rd@example.com">3rd@example.com</option>
    </optgroup>
    <optgroup label="3">
        <option value="6">6</option>
        <option value="4th@example.comm">4th@example.com</option>
    </optgroup>
</select>

What i want to get

<select id="my-select">
    <option value=""> Please choose an option </option>
    <option value="7">1st@example.com</option>
    <option value="8">2nd@example.com</option>
    <option value="5">3rd@example.com</option>
    <option value="6">4th@example.com</option>
</select>

myChoiceType的相关部分

->add('selectUser', ChoiceType::class,
    [
        'choices' => $this->userChoices,
        'choice_value' => function ($choice)
        {
            return $choice;
        },
        'choice_label' => function ($value)
        {
            return $value;
        },
        'mapped' => false,
        'expanded' => false,
        'multiple' => false,
    ]
)

最后

我做错了什么?

如何以我想要的方式让ChoiceTypehtml select中显示data

谢谢您的想法!


你好,@Jeto!它已经显示在第一个代码块中了。我澄清了代码块的标题。 - Rikijs
2个回答

3
根据文档choices值必须是一个简单的键值对数组。

选项choices是一个数组,其中数组键是项目的标签,数组值是项目的值。

您可以使用以下代码轻松获取所需的选项数组:

$choices = [];
foreach ($this->userChoices as $choice) {
  $choices[$choice['email']] = $choice['id'];
}

然后使用以下初始化代码:
->add('selectUser', ChoiceType::class,
    [
        'choices' => $choices,
        'mapped' => false,
        'expanded' => false,
        'multiple' => false
    ]
)

在这种情况下,我删除了choice_valuechoice_label,因为它们没有任何作用。


嘿@Jeto!在将数据数组传递到表单之前,我在控制器中使用了你的代码,但是我收到了一个通知“注意:未定义索引:1st@example.com”。 - Rikijs
@Rikijs 抱歉,我搞砸了代码。现在应该好了!(已编辑答案) - Jeto
谢谢@Jeto,现在它可以工作了!只是更改了“id”和“email”来适应我的需求-因此电子邮件得到显示且值为id。 - Rikijs
@Rikijs 哦,你说得对,我刚刚又编辑了一下,把它们两个搞混了(但是已经足够让你明白了)。现在应该没问题了。 - Jeto

1

只需将其作为一维数组传递,以电子邮件作为键,以ID作为值。

$choices = [
    '1st@example.com' => 7,
    '2nd@example.com' => 8,
];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接