Как создать одно поле формы для двух полей модели в Symfony 2? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть старый проект, который все еще использует Symfony 2. В нем есть форма для редактирования профиля клиента.В контроллере у нас есть это:

$form = $this->createForm(new ClientProfile($remindTimes), $client);
$form->handleRequest($request);

А в классе ClientProfile у нас есть

class ClientProfile extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('client_name', 'text', array('label' => 'Full name'))
            ->add('client_address', 'text', array('label' => 'Address', 'required' => false))
            ->add('client_city', 'text', array('label' => 'City', 'required' => false))
            ->add('client_post_code', 'text', array('label' => 'Postal index', 'required' => false))
            ->add('client_email', 'email', array('label' => 'E-mail', 'required' => false));
    }
}

... и некоторые другие поля, но вы понимаете суть.Тогда есть также представление Twig, которое отображает HTML.Стандартные вещи, насколько я могу судить.

Теперь для моего требования.Клиентский объект имеет два специальных свойства.Давайте назовем их FroobleEnabled и FroobleType.Если Frooble отключен, значение типа не имеет значения (может быть установлено в 0).В пользовательском интерфейсе я хочу раскрывающийся список со значениями:

Disabled
Type 1
Type 2
Type 3

Если пользователь выбирает Disabled, тогда FroobleEnabled устанавливается на false, а FroobleType устанавливается на 0.В противном случае FroobleEnabled устанавливается на true и FroobleType на 1, 2 или 3 соответственно.

Как это сделать?Особенностью этого является то, что это больше не отображение 1: 1.В объекте модели есть два поля, но только один элемент управления пользовательского интерфейса.Я думаю Я мог бы добиться этого с помощью DataMapper, но я также не хочу вручную отображать все другие поля (хотя я могу, если нет другого варианта).Я также не могу найти приличную документацию о DataMapper или о любых других функциях Symfony Forms, которые могли бы мне помочь.

1 Ответ

1 голос
/ 05 июня 2019

Один из способов сделать это - создать поле, скажем, frooble.

  • В классе формы создайте поле frooble Выбор с mapped => false и значениями 0, 1, 2, 3. Установите его варианты выбора в строки, соответствующие приложению.
  • В контроллере, после отправки и проверки формы, введите код, например:

    ...
    $frooble = $form->get('frooble')->getData();
    if (0 === $frooble) {
        $client->setFroobleEnabled(false);
        $client->setFroobleType(0);
    } else {
        $client->setFroobleEnabled(true);
        $client->setFroobleType($frooble);
    }
    
...