Silex:如何在 Form 中创建循环

Silex: How to create a loop in Form

以下代码行为我提供了 Silex 表格。一个文本字段和一个复选框。文本字段包含团队的名称。复选框应包含用户的用户名,以便我可以将他们添加到团队中。

$form = $app['form.factory']->createBuilder(FormType::class)
        ->add('name', TextType::class, array(
            'constraints' => array(new Assert\NotBlank(), new Assert\Length(array('min' => 4,'max' => 64))),
            'label' => 'Team Name',
            'required' => 'required',
            'attr' => array('class' => 'input-field', 'autocomplete' => 'off', 'value' => $team->data()->name),
            'label_attr' => array('class' => 'label')
        ))
        ->add('players', CheckboxType::class, [
                'constraints' => array(new Assert\NotBlank()),
                'label' => $player->username,
                'attr' => array('class' => 'input-field', 'value' => $player->username),
                'label_attr' => array('class' => 'label')
        ])
        ->add('submit', SubmitType::class, [
            'label' => 'Edit',
            'attr' => array('class' => 'submit'),
        ])
        ->getForm();

我可以使用以下行获取我的用户列表:

$user = new User()
$user->getList();

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

但是,我不知道如何将这两个部分结合起来,因为 $form 变量是在 'line' 中用一个 ';' 定义的在末尾。我怎样才能将这个 $form 分成几个部分,以便我可以遍历我的用户并为每个用户添加一个复选框?

执行 ->getForm(); 后表单为 "generated" 因此如果您想在生成之前添加任何字段,您应该完成 ->getForm();

因此您的代码可能如下所示:

// add you "static" fields
$formBuilder = $app['form.factory']->createBuilder(FormType::class)
    ->add('name', TextType::class, array(
        'constraints' => array(new Assert\NotBlank(), new Assert\Length(array('min' => 4,'max' => 64))),
        'label' => 'Team Name',
        'required' => 'required',
        'attr' => array('class' => 'input-field', 'autocomplete' => 'off', 'value' => $team->data()->name),
        'label_attr' => array('class' => 'label')
    ))
    ->add('players', CheckboxType::class, [
            'constraints' => array(new Assert\NotBlank()),
            'label' => $player->username,
            'attr' => array('class' => 'input-field', 'value' => $player->username),
            'label_attr' => array('class' => 'label')
    ])
    ->add('submit', SubmitType::class, [
        'label' => 'Edit',
        'attr' => array('class' => 'submit'),
    ]);


 $user = new User();
 $user->getList();

// then add your "dynamic" fields 

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


// then generate your form
$form = $formBuilder->getForm();