Symfony 4 Форма: как работает CollectionType - PullRequest
0 голосов
/ 26 апреля 2020

Я начинаю с Symfony, и чтобы учиться лучше, я начал воспроизводить небольшой сайт, который был сделан на Codeigniter. Проблема в том, что я блокирую формы.

Подводя итог: Цель для меня - создать форму Создателя сезона чемпионата. Для этого он должен ввести даты начала и окончания чемпионата. Укажите лиги, введенные для чемпионатов в этом сезоне.

Для этого у меня есть субъект "Сезон", "Лига". Я создал форму на основе сущности "Сезон", в которую он может войти. дата начала и окончания.

Но я бы хотел добавить поле с несколькими вариантами ответов в эту форму, чтобы он также мог выбирать Лиги, участвующие в этом сезоне.

И это на последнем пункте что я борюсь, потому что множественный выбор не появляется.

Вот фрагменты кода:

Сезон сущностей


namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\SeasonRepository")
 */
class Season
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="datetime")
     */
    private $start_date;

    /**
     * @ORM\Column(type="datetime")
     */
    private $date_end;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $name;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\League", mappedBy="leagues")
     */
    private $leagues;

    public function __construct()
    {
        $this->leagues = new ArrayCollection();
    }
    .
    .
    .
    .

Entity League

<?php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\LeagueRepository")
 */
class League
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Team", mappedBy="league")
     */
    private $teams;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Match", mappedBy="league")
     */
    private $matches;

    /**
     * @ORM\Column(type="string", length=10)
     */
    private $format;

    /**
     * @ORM\OneToOne(targetEntity="App\Entity\Poule", mappedBy="league", cascade={"persist", "remove"})
     */
    private $team;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Season", inversedBy="leagues")
     */
    private $leagues;

    public function __construct()
    {
        $this->teams = new ArrayCollection();
        $this->matches = new ArrayCollection();
    }

Форма SeasonType

<?php

namespace App\Form;

use App\Entity\Season;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\ButtonType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;

use Symfony\Component\Form\Extension\Core\Type\ChoiceType;

class SeasonType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class)
            ->add('start_date', DateType::class)
            ->add('date_end', DateType::class)
            ->add('next', ButtonType::class)
            ->add('leagues', CollectionType::class, [
                // each entry in the array will be an "text" field
                'entry_type' => ChoiceType::class,
                // these options are passed to each "email" type
                'entry_options' => [
                    'attr' => ['class' => 'email-box'],
                    "multiple" => true,
                ],
                "mapped" => false
            ])

        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Season::class
        ]);
    }
}

Контроллер SeasonController

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;

use App\Form\SeasonType;
use App\Entity\Season;
use App\Entity\League;

/**
 * @Route("/saison")
 */
class SeasonController extends AbstractController
{
    /**
     * @Route("/admin", name="season.admin")
     * @IsGranted("ROLE_ADMIN")
     */
    public function admin() {

        return $this->render('season/admin.html.twig', [
            'controller_name' => 'SeasonController',
        ]);
    }

    /**
     * @Route("/admin/create", name="season.admin.create")
     *
     * @IsGranted("ROLE_ADMIN")
     */
    public function create() {
        $oSeason = new Season();

        $oLeagueRepo =  $this->getDoctrine()->getRepository(League::class);

        /*foreach($oLeagueRepo->findAll() as $oLeague){
            $oSeason->addLeague($oLeague);
        }
        dump($oLeagueRepo->findAll(), $oSeason);*/
        $oForm = $this->createForm(SeasonType::class, $oSeason);


        return $this->render('season/admin.create.html.twig', [
            'controller_name' => 'SeasonController',
            'form' => $oForm->createView()
        ]);
    }


    /**
     * @Route("/", name="season")
     */
    public function index()
    {
        return $this->render('season/index.html.twig', [
            'controller_name' => 'SeasonController',
        ]);
    }
}

Результат :

Визуализация формы

Так что здесь я не использую ArrayCollection правильным образом, я думаю (даже на результате: D)

Спасибо заранее:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...