<?php
namespace App\Form;
use App\Entity\User;
use App\Entity\Region;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\Callback;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Doctrine\ORM\EntityRepository;
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$userActual = $options['userActual'];
$listaRoles = [
'Evaluador - Admisibilidad' => 'ROLE_EVALUADOR_ADM',
'Evaluador - Individual' => 'ROLE_EVALUADOR_IND',
'Evaluador - Colectivo' => 'ROLE_EVALUADOR_COL',
'Supervisor - Postulaciones' => 'ROLE_SUPERVISOR_POS',
'Administrador - Usuarios' => 'ROLE_ADMINISTRADOR_USU',
'Administrador - Convocatorias' => 'ROLE_ADMINISTRADOR_CON',
'Administrador - Postulaciones' => 'ROLE_ADMINISTRADOR_POS',
// ROLES PUNTO DE CULTURA
'Punto Cultura - Evaluador - Admisibilidad' => 'ROLE_PU_EVALUADOR_ADM',
'Punto Cultura - Evaluador - Colectivo' => 'ROLE_PU_EVALUADOR_COL',
'Punto Cultura - Evaluador - Selección' => 'ROLE_PU_EVALUADOR_SEL',
'Punto Cultura - Supervisor - Postulaciones' => 'ROLE_PU_SUPERVISOR_POS',
'Punto Cultura - Administrador - Convocatorias' => 'ROLE_PU_ADMINISTRADOR_CON',
];
$builder
//->add('email')
->add('email',EmailType::class,[
'required' => true,
'attr' => ['maxlength' => 64]
]
)
->add('nombres')
->add('activo',CheckboxType::class,[
'required' => false,
'label'=>'¿Cuenta activa?',
])
->add('super_admin',CheckboxType::class,[
'required' => false,
'label'=>'Super Administrador',
])
// ->add('password')
// ->add('region')
->add('changePassword', CheckboxType::class, [
'mapped' => false,
'required' => false,
'label' => '¿Cambiar contraseña?',
])
->add('plainPassword', RepeatedType::class, [
'type' => PasswordType::class,
'mapped' => false,
'required' => true,
'invalid_message' => 'Las contraseñas deben coincidir.',
'first_options' => ['label' => 'Contraseña'],
'second_options' => ['label' => 'Repetir Contraseña'],
'constraints' => [
new Callback(function ($value, ExecutionContextInterface $context) {
$form = $context->getRoot();
$changePassword = $form->get('changePassword')->getData();
if ($changePassword) {
if (empty($value)) {
$context->buildViolation('La contraseña no puede estar vacía.')
->atPath('first')
->addViolation();
} elseif (strlen($value) < 6) {
$context->buildViolation('La contraseña debe tener al menos 6 caracteres.')
->atPath('first')
->addViolation();
}
}
}),
],
]);
if(!$userActual->isSuperAdmin()){
$listaRoles = [
'Evaluador - Admisibilidad' => 'ROLE_EVALUADOR_ADM',
'Evaluador - Individual' => 'ROLE_EVALUADOR_IND',
'Evaluador - Colectivo' => 'ROLE_EVALUADOR_COL',
'Supervisor - Postulaciones' => 'ROLE_SUPERVISOR_POS',
// ROLES PUNTO DE CULTURA
'Punto Cultura - Evaluador - Admisibilidad' => 'ROLE_PU_EVALUADOR_ADM',
'Punto Cultura - Evaluador - Colectivo' => 'ROLE_PU_EVALUADOR_COL',
'Punto Cultura - Evaluador - Selección' => 'ROLE_PU_EVALUADOR_SEL',
'Punto Cultura - Supervisor - Postulaciones' => 'ROLE_PU_SUPERVISOR_POS',
];
$builder->add('regiones', EntityType::class,[
'class' => Region::class,
'choice_label' => 'nombre',
'multiple' => true,
'expanded' => true,
'query_builder' => function (EntityRepository $er) use ($userActual) {
return $er->createQueryBuilder('r')
->select('r')
->leftjoin('r.usuarios', 'u')
->addSelect('u')
->where('u.id = :userId')
->setParameter('userId', $userActual->getId());
}
]);
} else {
$builder->add('regiones', EntityType::class, [
'class' => Region::class,
'choice_label' => 'nombre',
'multiple' => true,
'expanded' => true,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('r')
->orderBy('r.orden', 'ASC');
},
]);
}
$builder
->add('rolesValue',ChoiceType::class,[
'mapped' => true,
'required' => true,
'expanded' => true,
'multiple' => true,
'choices' => $listaRoles,
])
->add('save', SubmitType::class);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => User::class,
//'validation_groups' => false,
'empty_data', null,
'csrf_protection' => true,
// the name of the hidden HTML field that stores the token
'csrf_field_name' => '_token',
// an arbitrary string used to generate the value of the token
// using a different string for each form improves its security
'csrf_token_id' => 'task_item',
'userActual' => User::class,
]);
}
}