Как получить значение неотображенного поля в вашей форме Symfony 3

Если вы работаете с формами в Symfony, вы знаете, как легко реализовать новый тип для любой сущности, чтобы вы могли легко создать операцию CRUD-формы в своем приложении. Иногда вы можете захотеть добавить динамические поля в форму из контроллера, потому что вы не хотите, чтобы это поле отображалось в другом, так как оно требуется только в этом случае. Это может быть достигнуто благодаря сопоставленное свойство поля формы.

Давайте представим, что у нас есть UserType создать форму для регистрации пользователя в нашем приложении:

add('name', TextType::class , array(
"attr" => array(
"class" => "form-control"
)
))
->add('username', TextType::class, array(
"attr" => array(
"class" => "form-control"
)
))
->add('description', TextareaType::class, array(
"attr" => array(
"class" => "form-control",
"maxlength" => 255
)
))
->add('password', RepeatedType::class, array(
'type' => PasswordType::class,
'invalid_message' => 'The password fields must match.',
'options' => array(
'attr' => array(
'class' => 'form-control'
)
),
'required' => true,
'first_options'  => array('label' => 'Password'),
'second_options' => array('label' => 'Repeat Password'),
))
;
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'userBundle\Entity\User'
));
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'userbundle_user';
}
}

Этот тип содержит 5 обязательных полей из UserEntity это будет обработано в нашем контроллере для создания нового пользователя. В нашем newAction из контроллера мы создадим форму со следующим кодом:

createForm(UserType::class, $user);
// Add dinamically a new multiple select field that isn't in the UserEntity:
$form->add('roles_options', ChoiceType::class, array(
"mapped" => false,
"multiple" => true,
"attr" => array(
'class' => "form-control"
),
'choices'  => array(
'Blogger' => 'ROLE_BLOGGER',
'Administrator' => 'ROLE_ADMIN'
)
));
$form->handleRequest($request);
if ($form->isSubmitted()) {
// Rest of the logic
}
return $this->render('users/new.html.twig', array(
'form' => $form->createView()
));
}

Теперь, если пользователь получит доступ к новому маршруту, он увидит форму, которую ему нужно только отправить. После отправки будет запущено то же действие newAction (если оно настроено в routing.yml с POST), и ваша логика для обработки формы будет выполнена. Преимущества создания формы с типами Symfony заключаются в том, что вы можете легко сохранять сущность в своих контроллерах, однако иногда вам нужно будет сделать шаг обработки динамическим в контроллере, изменив некоторые значения (или используя их для других целей), чтобы вы могли легко получить значения формы легко с помощью getData метод формы:

isSubmitted()) {
$data = $form->getData();
// $data  contains an array like:
// array(
//    "name" => "The submitted name",
//    "username" => "The submitted Username",
//    "description" => "The submitted description",
//    "password" => "The submitted password"
// );
}

Но подождите, где **** это значение roles_options поле, которое мы динамически добавляем в наш контроллер? Он не внутри реальной формы, просто потому, что поле не отображено, поэтому он не может быть внутри реальной формы, потому что это вызовет другое исключение, а именно 'This form should not contain extra fields',

Получить значение неотображенного поля

Вместо доступа к значению из данных массива формы вам нужно использовать метод get из формы, который в качестве первого аргумента ожидает имя поля, которое не было отображено. Из возвращенного объекта вы можете получить значение, используя getData метод:

isSubmitted()) {
$data = $form->getData();
// Retrieve the value from the extra field non-mapped !
$roles = $form->get("roles_options")->getData();
// Where $data  contains an array like:
// array(
//    "name" => "The submitted name",
//    "username" => "The submitted Username",
//    "description" => "The submitted description",
//    "password" => "The submitted password"
// );
// and $roles another array in this case with our options (that were selected obviously):
// [
//   0 => "ROLE_BLOGGER"
//   1 => "ROLE_ADMIN"
// ]
}
Ссылка на основную публикацию
Adblock
detector