Содержание
Все поля типа формы обычно используются повсеместно, но в некоторых случаях поле не должно появляться в некоторых разделах вашего приложения по некоторым причинам. Очевидно, что вы не будете рендерить поля во внешнем интерфейсе и скрывать их с помощью 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 ...
}
// .. //
}