Массив Symfony как коллекция форм - PullRequest
0 голосов
/ 26 апреля 2018

Я застрял с проблемой в Symfony в течение нескольких дней, и ничего не могу найти в Google.

У меня есть две таблицы.

Учетная запись:

AppBundle\Entity\Account:
type: entity
fields:
    name:
        type: string
        nullable: true
        length: 255
oneToMany:
    towns:
        targetEntity: AppBundle\Entity\Town
        mappedBy: owner
        cascade: ['persist']

Город:

AppBundle\Entity\Town:
type: entity
fields:
    name:
        type: string
        nullable: true
        length: 255
manyToOne:
    owner:
        targetEntity: AppBundle\Entity\Account
        inversedBy: towns

И у меня есть массив с именами:

$names = ['New York','Berlin'];

Я хочу форму вкоторый пользователь может проверить имя из массива (флажки).Когда пользователь проверяет «Нью-Йорк» и отправляет форму, я хочу новую сущность Town с «Нью-Йорк» в поле name.Если пользователь снимает флажок «Нью-Йорк», я хочу удалить объект.

До сих пор я пробовал его с EntityType, CollectionType и ChoiceType.Лучшее, что я могу получить - это ChoiceType.

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('towns', ChoiceType::class,
            [
                'choices' =>
                    [
                        new Town('New York'),
                        new Town('Berlin'),
                    ],
                'choice_label' => function (Town $town, $key, $index) {
                    return $town->getName();
                },
                'choice_value' => function (Town $town) {
                    return $town->getName();
                },
                'expanded' => TRUE,
                'multiple' => TRUE,
                'required' => FALSE,
            ]
        );
}

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

1 Ответ

0 голосов
/ 26 апреля 2018

Не используйте массив, сохраняйте города в базе данных.
Затем установите тип поля towns на EntityType.

->add(
    'towns',
    EntityType::class,
    [
        'class' => Town::class,
        'multiple' => true,
        'expanded' => true,
        'required' => false,
    ]
)

Добавьте этот метод в класс Town дляотображать имя автоматически везде, где оно должно быть преобразовано в строку:

/**
 * @return string
 */
public function __toString()
{
    return $this->name;
}

Если идея с массивом состояла в том, чтобы отфильтровать отображаемые варианты выбора городов, вы можете использовать его в query_builderопция:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $names = ['New York', 'Berlin']; // Or pass it from the controller in $options

    $builder
        ->add('towns',
            EntityType::class,
            [
                'class' => Town::class,
                'query_builder' => function (EntityRepository $er) use ($names) {
                    return $er->createQueryBuilder('town')
                        ->where('town.name IN (:names)')
                        ->setParameter('names', $names);
                },
                'multiple' => true,
                'expanded' => true,
                'required' => false,
            ]
        );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...