Symfony表单设计

No_*_*ame 7 symfony-forms symfony doctrine-orm

我有一个Event实体,People可以参加的实体.事件发生后,事件的主持人坐下来,应该会看到这样的表格.

         user a    user b     user c      user d     user e    user f     user g
user a     _
user b               _
user c                          _
user d                                      _
user e                                                 _
user f                                                           _
user g                                                                      _
Run Code Online (Sandbox Code Playgroud)

无论用户是否喜欢其他用户,所有空白都是复选框.下划线被禁用复选框,因为用户不能喜欢自己.我应该使用choice_list吗?我想像这样处理输入:

foreach(guests as guest)//horizontal
{
    foreach(guests as other)//vertical
    {
         if(guest != other && guest.likes(other) && other.likes(guest))
         {
             //do something
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何使用formbuilder来实现这样的目标?

小智 1

这种形式不符合您的需求吗?

$userIDsArray = $userIDsArray = array('1' => 'name1','2' => 'name2','3' => 'name3','4' => 'name4');

$form = $this->createFormBuilder($initialData);
    foreach($userIDsArray as $userId)
        $form->add($userId, 'choice', array(
                        'choices' => $userIDsArray,
                        'multiple' => true,
                        'expanded' => true 
                    )
                );
$form = $form->getForm();
Run Code Online (Sandbox Code Playgroud)

对于该用户数组,检查用户 1 的所有其他三个用户以及仅检查用户 3 的第四个用户,将产生如下结果。

array (size=4)
  'name1' => 
    array (size=3)
      0 => int 2
      1 => int 3
      2 => int 4
  'name2' => 
    array (size=0)
      empty
  'name3' => 
    array (size=1)
      0 => int 4
  'name4' => 
    array (size=0)
      empty
Run Code Online (Sandbox Code Playgroud)

当您渲染表单时,您可以迭代表单中的每个项目,然后对于每个项目,您可以迭代每个选项并禁用您想要的选项:

{% for formWidget in classForm %}
    {{ form_label(formWidget) }}
    {% for child in formWidget %}
        {{ form_widget(child) }}</td>
    {% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

当然,您可以对表单中的行和选择使用不同的数组,从而实现您想要的结构。