Forms symfony2表单集合:从预填充列表向集合添加新项

Forms symfony2表单集合:从预填充列表向集合添加新项,forms,symfony,collections,entity,Forms,Symfony,Collections,Entity,我正在建立一个基本的幻想足球游戏,作为学习symfony2和学说的基础 我在以下实体中有一个合作伙伴: 竞赛-举办各种可以参加的竞赛 玩家-保存可为游戏选择的玩家的详细信息 较量 竞赛条目:保存由竞赛ID、用户ID和 球员的选择 我目前正在构建玩家选择页面 我有一个控制器,可以获取可供选择的玩家列表,该列表呈现为一个表,每行有一个按钮,我将使用javascript,以便在单击选择按钮时,它将玩家添加到表单集合中,然后在提交表单时将玩家保存在我的多人表中 不能添加或删除新玩家,只能从可用玩家列

我正在建立一个基本的幻想足球游戏,作为学习symfony2和学说的基础

我在以下实体中有一个合作伙伴:

  • 竞赛-举办各种可以参加的竞赛
  • 玩家-保存可为游戏选择的玩家的详细信息 较量
  • 竞赛条目:保存由竞赛ID、用户ID和 球员的选择
我目前正在构建玩家选择页面

我有一个控制器,可以获取可供选择的玩家列表,该列表呈现为一个表,每行有一个按钮,我将使用javascript,以便在单击选择按钮时,它将玩家添加到表单集合中,然后在提交表单时将玩家保存在我的多人表中

不能添加或删除新玩家,只能从可用玩家列表中选择

竞赛条目的主页:

{% extends '@Design/Default/layout-main.html.twig' %}

    {% block title %}Enter Contest{% endblock %}
    {% block stylesheets %}
    {{ parent() }}
    <link href="{{ asset('bundles/design/css/homebase.css') }}" type="text/css" rel="stylesheet"/>
    <link href="{{ asset('bundles/design/css/menu.css') }}" type="text/css" rel="stylesheet"/>
    <link href="{{ asset('bundles/design/css/bootstrap.css') }}" rel="stylesheet"/>
    {% endblock %}
    {% block header %}
        {% include 'DesignBundle:Default/Menus:homepage-menu.html.twig' %}
        <div class="row">
            {% if app.session.flashBag.has('success') %}
                <div class="alert alert-success">
                    <a href="#" class="close" data-dismiss="alert">&times;</a>
                    {% for msg in app.session.flashBag.get('success') %}
                        {{ msg }}
                    {% endfor %}
                </div>
            {% endif %}
        </div>
        <section>
            <div  class="container">
                <div class="row jumbotron color-bkg">
                    {% include 'GameBundle:Contest/Partial:contest_details.html.partial.twig' %}
                        <div class="row">
                            <div class="col-md-6">
                                <div class="row centered-form">
                                    {{ contest.contestID }}
                                    {{ render(controller('GameBundle:FantasyPlayer:getPlayers', {'contestID': contest.contestID})) }}
                                </div>
                            </div>
                            <div class="col-md-6">
                                Select Your Team!!
                                Need to render the contestEntry Form here with the ability to add a player when a player from the list is clicked
                                In addition each added player will have a remove button to remove the player from the team.



                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </section>
    {% endblock %}
    {% block javascripts %}
        {{ parent() }}
        <script type="text/javascript">


        </script>
    {% endblock %}
为玩家玩家准备的小树枝:

<table class="table table-condensed">
    <thead>
    <tr>
        <th>Position</th>
        <th>Player</th>
        <th>Opp</th>
        <th>Opp Rank</th>
        <th>FPPG</th>
        <th>Salary</th>
        <th></th>
    </tr>
    </thead>
    <tbody>

    {% for p in dfp %}
        <tr id="player-{{ p.playerID }}" data-player="{'position':'{{ p.position }}', 'salary': '{{ p.salary }}', 'pid': '{{ p.playerID }}'">
            <td>{{ p.position }}</td>
            <td>{{ p.name }}</td>
            <td>{{ p.team }} @ {{ p.opponent }}</td>
            <td>{{ p.opponentRank }}</td>
            <td>{{ p.opponentPositionRank }}</td>
            <td>{{ p.salary }}</td>
            <td>
                <div class="btn btn-sm btn-default player-select">Select</div>
            </td>
        </tr>
    {% endfor %}
    </tbody>
</table>
从我在这里读到的其他问题来看,我需要使用一个表单集合

class ContestEntryType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('user', 'hidden')
            ->add('contest', 'hidden')
            ->add('locked', 'hidden')
            ->add('players', 'collection', array(
                'type' => 'hidden',
                'allow_add' => true)
            );
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'FantasyPro\GameBundle\Entity\ContestEntry'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'fantasypro_gamebundle_contestentry';
    }
}
我读了symfony表单集合的文档,但理解起来有点困难,因为它似乎没有给出我要做的任何示例,添加了一个带有玩家信息的
,以及一个包含玩家ID的隐藏字段(存储在我的manytomy表中)

谁能给我指点正确的方向吗

/**
 * ContestEntry
 *
 * @ORM\Table(name="fp_contestEntry")
 * @ORM\Entity(repositoryClass="FantasyPro\GameBundle\Entity\ContestEntryRepository")
 */
class ContestEntry
{
    public function __construct()
    {
        $this->user = new ArrayCollection();
        $this->contest = new ArrayCollection();
        $this->players = new ArrayCollection();
    }

    /**
     * @var integer
     *
     * @ORM\Column(type="integer", name="id")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var integer
     *
     * @ORM\Column(type="integer", nullable=true, name="user")
     * 
     */
    private $user;

    /**
     * @var integer
     *
     * 
     * @ORM\ManyToOne(targetEntity="FantasyPro\GameBundle\Entity\Contest", inversedBy="contestEntries")
     * @ORM\Column(type="integer", nullable=false, name="contest")
     * 
     */
    private $contest;

    /**
     * 
     * 
     * @ORM\ManyToMany(targetEntity="FantasyPro\DataBundle\Entity\Player", inversedBy="contestEntries")
     * @ORM\JoinTable(
     *     name="Player_ContestEntry",
     *     joinColumns={@ORM\JoinColumn(name="contestEntryID", referencedColumnName="id", nullable=false)},
     *     inverseJoinColumns={@ORM\JoinColumn(name="playerID", referencedColumnName="playerID", nullable=false)}
     * )
     */
    private $players;

    /**
     * @var boolean
     *
     * @ORM\Column(type="boolean", nullable=true, name="locked")
     */
    private $locked;

    /**
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return int
     */
    public function getUser()
    {
        return $this->user;
    }

    /**
     * @param int $user
     */
    public function setUser( $user = null )
    {
        $this->user = $user;
    }

    /**
     * @return int
     */
    public function getContest()
    {
        return $this->contest;
    }

    /**
     * @param int $contest
     */
    public function setContest( $contest = null )
    {
        $this->contest = $contest;
    }

    /**
     * @return int
     */
    public function getPlayers()
    {
        return $this->players;
    }

    /**
     * @param int $players
     */
    public function setPlayers( $players = null )
    {
        $this->players = $players;
    }

    /**
     * @return boolean
     */
    public function isLocked()
    {
        return $this->locked;
    }

    /**
     * @param boolean $locked
     */
    public function setLocked( $locked )
    {
        $this->locked = $locked;
    }
}
class ContestEntryType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('user', 'hidden')
            ->add('contest', 'hidden')
            ->add('locked', 'hidden')
            ->add('players', 'collection', array(
                'type' => 'hidden',
                'allow_add' => true)
            );
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'FantasyPro\GameBundle\Entity\ContestEntry'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'fantasypro_gamebundle_contestentry';
    }
}