2015-10-12 5 views
0

Мне нужно динамически добавлять поля в форму на основе ввода пользователем. Предположим, что у меня есть сущность A с сущностями B и C. Первоначально форма имеет поле выбора, в котором пользователь может выбрать тип, B или C. Если пользователь выбирает B, поля Bx и By должны быть добавлены к форме, и если пользователь выбирает C, вместо этого следует добавлять поля Cx, Cy и Cz.Добавить поля формы на основе выбора формы

Могу ли я это сделать с помощью PHP/Symfony, или мне нужно использовать JavaScript для отображения/скрытия полей? Я читал Dynamic Form Modification учебник по Symfony, но я все еще не мог понять, как это сделать.

+0

Короткий ответ: AJAX представить частичную форму, а затем использовать форму события. В зависимости от того, как вы используете формы symfony (как услуги или нет): событие 'PRE_SET_DATA' или' POST_SUBMIT' –

ответ

1

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

Вы просто определяете тип формы для первой страницы, а затем для всех возможных результатов второй страницы. Вы также можете использовать динамическую модификацию формы, которую вы уже читали, если это имеет больше смысла, чем создание совершенно разных форм. Затем в контроллере вы добавляете свою логику, чтобы решить, какую форму представить.

Может быть, это будет выглядеть примерно так:

$entity = new Entity(); 
$form1 = $this->createForm(new EntityPageOneType(), $entity); 
$form1->handleRequest($request); 
if($form1->isSubmitted() && $form1->isValid()){ 
    if($entity->foo = 'bar'){ 
     $form2 = $this->createForm(new EntityPageTwoBarType(), $entity); 
    } 
    else{ 
     $form2 = $this->createForm(new EntityPageTwoOtherType(), $entity); 
    } 
    if($form2->isSubmitted() && $form2->isValid()){ 
     // persist data & redirect 
    } 
    return $this->render('template.twig', ['form' => $form2]); 
} 
else{ 
    return $this->render('template.twig', ['form' => $form1]); 
} 
Смежные вопросы