Как создать объект с несколькими датами в одной форме с помощью EasyAdmin - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь разработать свое первое symfony веб-приложение и решил использовать пакет EasyAdmin.

В этом веб-приложении я хотел бы определить следующую модель: Event с несколькими датами.

Чтобы создать это, я создал 2 сущности с помощью консоли symfony: Event и EventDate:

<?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\EventRepository")
 */
class Event
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\EventDate", mappedBy="event", orphanRemoval=true)
     */
    private $dates;

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

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    /**
     * @return Collection|EventDate[]
     */
    public function getDates(): Collection
    {
        return $this->dates;
    }

    public function addDate(EventDate $date): self
    {
        if (!$this->dates->contains($date)) {
            $this->dates[] = $date;
            $date->setEvent($this);
        }

        return $this;
    }

    public function removeDate(EventDate $date): self
    {
        if ($this->dates->contains($date)) {
            $this->dates->removeElement($date);
            // set the owning side to null (unless already changed)
            if ($date->getEvent() === $this) {
                $date->setEvent(null);
            }
        }

        return $this;
    }

    public function __toString(): String
    {
        return $this->name;
    }

}
<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

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

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

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Event", inversedBy="dates")
     * @ORM\JoinColumn(nullable=false)
     */
    private $event;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getDate(): ?\DateTimeInterface
    {
        return $this->date;
    }

    public function setDate(\DateTimeInterface $date): self
    {
        $this->date = $date;

        return $this;
    }

    public function getEvent(): ?Event
    {
        return $this->event;
    }

    public function setEvent(?Event $event): self
    {
        $this->event = $event;

        return $this;
    }
}

Чтобы быть удобным для пользователя, я хотел бы «настроить» форму Event, чтобы позволить пользователю создавать в той же форме событие и его даты.

Для для этого я должен определить форму сущности Event следующим образом:

easy_admin:
  entities:
    Event:
      class: App\Entity\Event
      form:
        fields:
          - {property: 'name'}
          - {property: 'dates', type: 'collection'}

Визуализация коллекции правильная, поскольку я могу добавить или удалить дату:

enter image description here

Но, как вы можете видеть, поле, представляющее EventDate, является редактируемым текстом. Я думаю, это потому, что поле представляет класс EventDate, а не только атрибут date.

Цель состоит в том, чтобы иметь селектор даты, который у меня есть, если я добавлю новый EventDate в EasyAdmin:

enter image description here

Так что вопрос: Как настроить EasyAdmin для добавления Event и его дат в единой форме?

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 05 апреля 2020

Я нашел способ сделать это.

Мне нужно изменить свой файл yaml EasyAdmin, чтобы ввести entry_type:

easy_admin:
  entities:
    Event:
      class: App\Entity\Event
      form:
        fields:
          - {property: 'name'}
          - {property: 'dates', type: 'collection', type_options: {entry_type: 'App\Form\EventDateForm', by_reference: false}}

Затем я должен создать EventDateForm class:

<?php

namespace App\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class EventDateForm extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('date');
    }

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

}

Мне также нужно обновить атрибут $date моего Event объекта следующим образом:

/**
 * @ORM\OneToMany(targetEntity="App\Entity\EventDate", mappedBy="event", orphanRemoval=true, cascade={"persist", "remove"})
*/
private $dates;

Визуализация не очень красивая, но она работы:

enter image description here

...