php - validacion - cómo hacer que la forma ignore los campos de contraseña si está en blanco(formularios symfony2)
validar solo letras en html (7)
En su entidad setter para la propiedad de la contraseña, haga que sea así:
/**
* Set password
*
* @param string $password
* @return User
*/
public function setPassword($password)
{
if (!is_null($password)) {
$this->password = $password;
}
return $this;
}
El truco es verificar si el parámetro que se pasa está vacío y solo establecer si no lo está.
Tengo un administrador de usuarios simple en mi back-end, y quiero poder editar el usuario sin establecer una nueva contraseña / repitiendo la contraseña anterior todo el tiempo.
En este momento, si dejo los campos de contraseña en blanco cuando edito un usuario, symfony2 se queja de que se debe ingresar una contraseña y, por supuesto, quiero esta funcionalidad cuando registro nuevos usuarios, pero cuando los edito, me gustaría que el formulario simplemente ignore los cuadros de contraseña si no están completos.
¿Cómo se logra esto?
Hay un artículo que ofrece muchas opciones para lograr su pedido, del libro de cocina Symfony2, en particular, la siguiente sección funcionó para mí:
Personalizar su formulario basado en los datos subyacentes
Debajo está la implementación:
public function buildForm(FormBuilderInterface $builder, array $options)
{
// ...
$builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) {
$product = $event->getData();
$form = $event->getForm();
// check if the Product object is "new"
// If no data is passed to the form, the data is "null".
// This should be considered a new "Product"
if (!$product || null === $product->getId()) {
$form->add(''name'', ''text'');
}
});
}
Lo que hice fue dejar el UserType
tal como está y solo eliminar el campo de contraseña en el controlador:
/**
* @Route("/users/edit/{username}", name="user_edit")
*/
public function editAction(Request $request, User $user)
{
$form = $this->createForm(UserType::class, $user);
// Remove the password field when editing the user
// Otherwise it must be entered each time the user is edited
// We can change the password via a special edit-user-password page
$form->remove(''password'');
$form->handleRequest($request);
if ($form->isValid()) {
// ...
}
}
De esta forma, puede tener un solo UserType, reutilizable en editAction y newAction.
Asegúrese de agregar la línea $form->remove(''password'');
before $form->handleRequest($request);
.
Para la referencia de otra persona, trabajé este de esta manera.
Mi formType:
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add(''username'', ''text'', array(''label'' => ''Servernamn ''))
->add(''plainPassword'', ''repeated'', array(''type'' => ''password'', ''first_name'' => ''Lösenord för server '', ''second_name'' => ''Upprepa lösenord för server'',));
$builder-> addValidator(new CallbackValidator(function(FormInterface $form){
$username = $form->get(''username'')->getData();
if (empty($username)) {
$form[''username'']->addError(new FormError("Du måste ange ett namn för servern"));
}
}));
}
Mi actualizaciónAcción:
public function updateServerAction($id)
{
$em = $this->getDoctrine()->getEntityManager();
$entity = $em->getRepository(''BizTVUserBundle:User'')->find($id);
if (!$entity) {
throw $this->createNotFoundException(''Unable to find Container entity.'');
}
$originalPassword = $entity->getPassword();
$editForm = $this->createForm(new editServerType(), $entity);
$request = $this->getRequest();
$editForm->bindRequest($request);
if ($editForm->isValid()) {
$plainPassword = $editForm->get(''plainPassword'')->getData();
if (!empty($plainPassword)) {
//encode the password
$encoder = $this->container->get(''security.encoder_factory'')->getEncoder($entity); //get encoder for hashing pwd later
$tempPassword = $encoder->encodePassword($entity->getPassword(), $entity->getSalt());
$entity->setPassword($tempPassword);
}
else {
$entity->setPassword($originalPassword);
}
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl(''Server''));
}
Por lo tanto, la actualización de la contraseña de mis usuarios debe configurarse; de lo contrario, conserve la contraseña original.
Para la validación, use 2 grupos de validación diferentes y establezca el correcto por la función invocable.
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add(
''oldPassword'',
PasswordType::class,
[
''constraints'' => new UserPassword([
''groups'' => ''profile_password'',
]),
''mapped'' => false,
''required'' => false,
]
);
$builder->add(
''plainPassword'',
PasswordType::class,
[
''constraints'' => new NotBlank([
''groups'' => ''profile_password'',
]),
''mapped'' => false,
''required'' => false,
]
);
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(
[
''validation_groups'' => function (FormInterface $form) {
$newPassword = $form->get(''plainPassword'')->getData();
$oldPassword = $form->get(''oldPassword'')->getData();
if ($oldPassword || $newPassword) {
return [''profile'', ''profile_password''];
} else {
return [''profile''];
}
},
]
);
}
Puedes hacer algo con
if (empty($password)) {
//edit the password
}
Intenta corregirlo en el PHP de tu formulario.
Si necesita agregar la opción requerida a $ options array. Ejemplo:
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add(''username'', ''text'', array(''label'' => ''Servernamn ''))
->add(''plainPassword'', ''repeated'', array(
''type'' => ''password'',
''first_name'' => ''password'',
''second_name'' => ''repeat_password'',
''required'' => false,
));
}