Silex:在 Formbuilder 中使用复选框作为数组

Silex: use Checkboxes as array in Formbuilder

创建普通表单时,您可以有多个复选框,就像一个数组一样。示例:

<form action="/action_page.php" method="get">
  <input type="checkbox" name="vehicle" value="Bike"> I have a bike<br>
  <input type="checkbox" name="vehicle" value="Car" checked="checked"> I have a car<br>
  <input type="submit" value="Submit">
</form>

这使您能够说:

Give me al the checked checkboxes with name of vehicle

这可能只是自行车或汽车,但也可能两者都是 selected。您可以遍历它们并对数据做一些事情。

但是,当我尝试这样做时,Silex FormServiceProvider 不允许我这样做。

在我的例子中,我使用了这些代码行:

foreach($user->data() as $player){
        $builder->add('player', CheckboxType::class, [
                    'constraints' => array(new Assert\NotBlank()),
                    'label' => $player->username,
                    'attr' => array('class' => 'input-field', 'value' => $player->username),
                    'label_attr' => array('class' => 'label')
            ]);
    }

为游戏中的每个玩家创建了一个复选框。我可以 select 是否要将他们添加到团队中。

所以在提交表单后,我希望能够做这样的事情:

$data = $form->getData();
foreach($data['player'] as $checked){
    //Add to the team
}

任何人都可以向我解释如何在 Silex 中执行此操作吗?

我找到了我的解决方案。我一直在使用错误的输入类型。当我使用选择类型时。它工作正常:

$players = [];
foreach($user->data() as $player){
    $array = array($player->username => $player->username);
    array_push($players, $array);
}

$builder->add('player', ChoiceType::class, [
        'constraints' => array(new Assert\NotBlank()),
        'choices' => $players,
        'choice_attr' => function($val, $key, $index) {
            return ['class' => 'input-field'];
        },
        'multiple' => true,
        'expanded' => true
]);