Я начинаю с 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)
Спасибо заранее:)