symfony2表单集合:从预先填充的列表中向集合添加新项目

时间:2015-11-03 14:24:38

标签: forms symfony collections entity

我正在建立一个基本的梦幻足球游戏,作为学习symfony2和教义的基础。

我有以下实体:

  • 比赛 - 举办各种可以输入的比赛
  • 播放器 - 保存可以为其选择的玩家的详细信息 竞赛
  • ContestEntry:举办比赛参赛作品,包括:contestID,UserID和 选择球员。

我正在构建播放器选择页面。

我有一个控制器,可以获取可供选择的可用玩家列表,该列表呈现为一个表格,每一行都有一个按钮,我将使用javascript,这样当点击选择按钮时,它会将玩家添加到表单中收集,然后在提交表单时将播放器保存在我的ManyToMany表中。

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

参赛作品的主页:

{% 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 %}

获取可供选择的玩家列表的控制器:

class FantasyPlayerController extends Controller
{
    public function getPlayersAction($contestID)
    {
        $em = $this->get('doctrine.orm.entity_manager');

        //get the repos
        $contestRepo = $em->getRepository('GameBundle:Contest');
        $scheduleGroupRepo = $em->getRepository('GameBundle:ScheduleGroup');
        $playerRepo = $em->getRepository('DataBundle:DailyFantasyPlayer');
        $contest = $contestRepo->find($contestID);
        //var_dump($contest);die();
        //get the ScheduleGroup
        $scheduleGroup = $contest->getScheduleGroup();
        //var_dump($scheduleGroup);die();

        //get schedules
        $schedules = $scheduleGroupRepo->getScheduleGroup($scheduleGroup);
        //var_dump($schedules);die();
        //get teams playing in schedules
        $teamsArray = array();
        foreach($schedules as  $schedule){
            $hometeam = $schedule->getHomeTeam();
            $awayteam = $schedule->getAwayTeam();
            array_push($teamsArray, $hometeam);
            array_push($teamsArray, $awayteam);
        }
        //Get players matching the teams
        $dfp = $playerRepo->getAvaliablePlayersByTeam($teamsArray);

        return $this->render('GameBundle:Forms:player-list.html.twig', array(
            'dfp' => $dfp
        ));

    }

玩家列表的Twig Tempate:

<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>

在我的树枝模板中调用控制器进入比赛。

我的ContestEntry实体具有ManyToMany Defined(它是单向的,因为我只需要获得已分配到比赛条目的玩家)

/**
 * 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';
    }
}

我已经阅读了关于symfony表单集合的文档,但我很难理解它,因为它似乎没有提供我正在尝试做的任何示例,添加了<TR>与玩家信息,以及包含playerID的隐藏字段(存储在我的ManyToMany表中)。

有人可以给我一些正确方向吗?

0 个答案:

没有答案