Как программно удалить поле из формы Symfony 3 (типы форм)

Все поля типа формы обычно используются повсеместно, но в некоторых случаях поле не должно появляться в некоторых разделах вашего приложения по некоторым причинам. Очевидно, что вы не будете рендерить поля во внешнем интерфейсе и скрывать их с помощью CSS, НЕ ДЕЛАЙТЕ ЭТОГО, ПОЖАЛУЙСТА. В таких случаях вы можете легко удалить поля из типа формы, чтобы вам не нужно было создавать неполный тип формы, а затем записывать условные поля в контроллерах.

Например, в этой статье мы будем использовать следующее FormType а именно 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 getBlockPrefix()
{
return 'userbundle_user';
}
}

Этот FormType имеет 4 поля: имя, имя пользователя, описание и пароль. Эта форма будет использоваться в 2 действиях: newAction а также editAction, Работая в newAction нам не нужно удалять какое-либо поле, однако, когда пользователь редактирует, нам нужно будет удалить поле пароля, и это может быть достигнуто двумя способами:

А. Удаление поля с использованием метода удаления

Из возвращенного объекта createForm метод, просто вызовите метод удаления класса Form:

getDoctrine()->getManager();
$user = $em->getRepository("userBundle:User")->find($id);
if(!$user){
throw $this->createNotFoundException("The providen user doesn't exist with id $id");
}
// Prepare Form
$editForm = $this->createForm(UserType::class, $user);
// Remove the password field !
$editForm->remove('password');
// Rest of the code ...
}
// .. //
}

Это просто удалит поле из формы и все.

Б. Фильтрация с использованием параметров в buildForm

Как вы можете (а может и нет) знать, createForm В качестве третьего аргумента метод ожидает массив с параметрами:

/**
* Creates and returns a Form instance from the type of the form.
*
* @param string $type    The fully qualified class name of the form type
* @param mixed  $data    The initial data for the form
* @param array  $options Options for the form
*
* @return Form
*/
protected function createForm($type, $data = null, array $options = array()){}

что отправлено buildForm функция в качестве второго аргумента в классе Form Type:

public function buildForm(FormBuilderInterface $builder, array $options)

Таким образом, вы можете использовать простой аргумент «flag», который указывает (только если он определен) для визуализации поля пароля или нет, например, вам нужно изменить ваш тип и добавить условие с параметрами:

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
)
))
;
// If the usePassword options is set to true,
if($options["usePassword"]){
$builder->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'),
));
}
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
// Set by default when the options aren't providen, use the password
$resolver->setDefaults(array(
'usePassword' => true
));
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'userbundle_user';
}
}

Обратите внимание, что вам нужно использовать setDefaultOptions указать значение, когда третий аргумент не предоставляется при создании формы. И, наконец, в вашем контроллере укажите массив с параметрами, которые в данном случае являются только ona, а именно usePassword с логическим значением:

getDoctrine()->getManager();
$user = $em->getRepository("userBundle:User")->find($id);
if(!$user){
throw $this->createNotFoundException("The providen user doesn't exist with id $id");
}
// Prepare Form and remove the password field
$editForm = $this->createForm(UserType::class, $user , [
'usePassword' => false
]);
// Rest of the code ...
}
// .. //
}
Ссылка на основную публикацию
Adblock
detector