Symfony Динамически изменять форму - PullRequest
0 голосов
/ 25 декабря 2018

Я настраиваю новую форму с 2 полями, Площадь и город.

и хочу настроить, когда выбрана Область, выдаст список поддерживаемых городов для идентификатора области.

IСконфигурируйте ManyToOne для разных городов

My Form Builder:

public function buildForm(FormBuilderInterface $builder, array $options): void
{
    $builder
        ->add('area', EntityType::class, [
            'class' => 'App:Area',
            'choice_label' => 'getName',
        ])
    $builder->get('area')->addEventListener(
        FormEvents::POST_SUBMIT,
        function (FormEvent $event) {
            $form = $event->getForm();
            $form->add('city', EntityType::class, [
                'class' => 'App\Entity\City',
                'choices' => $form->getData()->getCity()
            ]);
        }
    );

    $builder->addEventListener(
        FormEvents::POST_SET_DATA,
        function (FormEvent $event) {
            $form = $event->getForm();
            $data = $event->getData();
            $city = $data->getCity();

            if ($city) {
                $form->get('area')->setData($city->getCity);
                $form->add('city', EntityType::class, [
                    'class' => 'App\Entity\City',
                    'choices' => $city->getArea->getCity()
                ]);
            } else {
                $form->add('city', EntityType::class, [
                    'class' => '\App\Entity\City',
                    'choices' => $city->getArea->getCity()
                ]);
            }
        }
    );
}

Городской объект:

 <?php

 namespace App\Entity;

 use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
*/
class City
{
/**
 * @ORM\Id()
 * @ORM\GeneratedValue()
 * @ORM\Column(type="integer")
 */
private $id;
/**
 * @ORM\Column(type="string", length=50)
 */
private $name;
/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Area")
 */
private $area;

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

public function getArea(): ?Area
{
    return $this->area;
}

public function setArea(?Area $area): self
{
    $this->area = $area;

    return $this;
}
}

Площадь объекта:

  <?php

  namespace App\Entity;

  use Doctrine\ORM\Mapping as ORM;

 /**
 * @ORM\Entity
  */
 class Area
 {
/**
 * @ORM\Id()
 * @ORM\GeneratedValue()
 * @ORM\Column(type="integer")
 */
private $id;

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

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

Я ожидаю, когда я изменюArea это даст мне только город area.

После большого количества попыток.

теперь у меня ошибка:

Вызов функции-члена getCity () onnull

Я также пытаюсь добавить в FormBuilder

        ->add('city', EntityType::class, [
            'class' => 'App:City',
            'choice_label' => 'getName',
        ])

1 Ответ

0 голосов
/ 25 декабря 2018

Слушатель события поля должен быть

$form = $event->getForm()->getParent();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...