具有自定义标签和集合的Symfony表单呈现

时间:2016-03-31 21:52:59

标签: php forms twig symfony

在尝试习惯symfony3表单时,我在自定义表单视图时遇到问题。

我正在尝试建立一个赌注足球比赛的表格,如

team1Name(logoTeam1)[1]:[2](logoTeam2)team2Name

team3Name(logoTeam3)[2]:[0](logoTeam4)team4Name ...

很简单,我想但不是用symfonies表单构建器(或者我可能不接受它)。

我通读了(我认为)所有文档,但还没有找到一个干净的解决方案。我认为通过使用自定义数组表单是可能的,但这看起来很脏。

所以我试着让我的课程符合symfonies形式的逻辑。

使用的类:

gamebet :由betteam1整数,betteam2整数,游戏对象和其他一些东西组成,并通过学说与游戏相关联

https://github.com/Invis00/pub/blob/master/Gamebet.php

游戏:拥有Team1Name,Team2Name等游戏信息

https://github.com/Invis00/pub/blob/master/Game.php

gamebetCollection :我创建的一个类来保存gamebet对象的集合,因为我的表单中的每一行都是一个gamebet对象,因此我可以使用smyfonies Collection Type。

自定义GamebetType

class GamebetType extends AbstractType
{
   public function buildForm(FormBuilderInterface $builder, array $options)
   {
      $builder->add('betteam1', IntegerType::class);
      $builder->add('betteam2', IntegerType::class);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
         $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\Gamebet',
    ));
    }
}

控制器:

(...)
$formbuilder = $this->createFormBuilder($userBets);
$form = $formbuilder
     ->add('gamebets', CollectionType::class, array(
            'entry_type' => GamebetType::class,
            'entry_options'  => array(
                'required'  => false,
                'attr'      => array('gamebets' => $userBets)
        )))
        ->add('bet', SubmitType::class, array('label' => 'Tippen'))
        ->getForm();
 (...)

模板

            {{ form_start(form) }}
             <table>

             {% for gamebet in form.gamebets %}
                 <tr>
                     <td>{{ form_label(gamebet.betteam1) }}</td>
                     <td><img src=pic/</td>
                     <td>{{ form_row(gamebet.betteam1) }}</td>
                     <td> : </td>
                     <td>{{ form_row(gamebet.betteam2) }}</td>
                     <td></td>
                     <td>{{ form_label(gamebet.betteam2) }}</td>
                 </tr>
             {% endfor %}

             </table>
             {{ form_end(form) }}

经过一番搜索后,我至少能够构建表格并为每个游戏玩家创建一行,虽然它对我来说似乎并不“干净”。

我的问题: 如何为集合中的每个对象自定义标签,以便我可以渲染团队名称?目前我完全不知道如何传递和获取该集合的单个目标的数据。

是否可以在自定义类型中访问它(我试图通过数组传递它但不知道如何获取“当前”对象)。

是否可以在模板中访问它,因为我不仅需要标签,还需要创建Logos URL。

有没有办法访问这些信息,因为目前我真的不知道如何解决这个简单的表单问题。

2 个答案:

答案 0 :(得分:0)

如果我理解你想做什么,你就不需要一个gamebetCollection课程。

相反,您应该使用collectionType和&#39; data_class&#39;创建父表单。 =&GT;空。

您可以使用symfony cookbook文档:  http://symfony.com/doc/current/cookbook/form/form_collections.html 要么  One form with all row of one entity

更新

在你的Twig中你可以做类似的事情:

     {% for for gamebet in form.gamebets %}
                        {{ form_errors(gamebet) }}
                        <tr>
                            <td>{{ form_label(gamebet.betteam1) }}</td>
                            <td><img src=pic/{{ gamebet.vars.value.betteam1 }}.jpg</td>
                            <td>{{ form_widget(gamebet.betteam1, {'attr': {'class': 'c-select'}}) }}</td>
                           ...
                        </tr>
      {% endfor %}

答案 1 :(得分:0)

转储解决了!在gamebet.vars.data中,存储了表单的相应对象。所以从那里可以得到我需要的所有信息:gamebet.vars.data.game.team1.getNamelong谢谢!