Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Validar select (choice) en función de otro campo con Silex

13 de mayo de 2015

Hola,

Aquí vengo con otra duda de las mías jeje. Estoy haciendo un proyecto en Silex y a la hora de registrar usuarios selecciono el role que puede ser admin, delegado o alumno y también selecciono una clase. En caso de ser admin no hace falta pero eso ya lo compruebo en el controlador antes de crear el usuario.

Lo que estoy intentando hacer es que si seleccionas un perfil alumno o delegado, te obligue a seleccionar una clase, en caso contrario nada. El formulario lo creo en el controlador y ese choice en concreto tiene el siguiente código:

...
->add('class_id', 'choice', array(
    'constraints' => array(
        new Assert\Callback(array($this, 'validateStudent')
    )),
    'choices' => $choice_class,
    'empty_value' => true,
    'required' => false,
    'placeholder' => 'Seleccione una clase...',
    'label' => 'Clase'
))
...

La función validateStudent quedaría tal que así:

public function validateStudent($data, ExecutionContext $context)
{
    if ($data['roles'] != 'ROLE_ADMIN' && $data['class_id'] == null) {
        $context->addViolation('Debe seleccionar una clase para el alumno.');
    }
}

Necesito acceder al valor del campo roles pero en $data solo recibo el valor de class_id. ¿Como puedo acceder al resto de campos del formulario para hacer esa validación? Es la primera vez que uso este tipo de constraint y ando muy perdido.

Gracias.

Un saludo.


Respuestas

#1

Normalmente el método de validación asociado a Assert\Callback se define en la propia entidad, ya que así tienes acceso a cualquiera de sus propiedades con un $this->nombrePropiedad o con el getter correspondiente. ¿Puedes probar a mover este método a la entidad que estés usando?

Otra posible solución, dado lo sencilla que es la lógica de esta validación propia, sería usar la constraint Expression.

@javiereguiluz

14 mayo 2015, 19:12
#2

El problema es que no uso entidades en Silex, simplemente hago un SELECT para obtener el usuario (en caso de estar editando) y luego un INSERT o UPDATE. También miré la constraint Expression, pero estamos en las mismas si necesito entidades.

La verdad que con Silex no suelo usar entidades porque no uso ORM, llámalo mala practica o más bien desconocimiento jeje. De todas formas es algo que podría cambiar para este proyecto. ¿Sería la única forma entonces? Decir que tampoco hago uso de FormType, creo el formulario directamente en el controlador. Si otra mala práctica, pero por un motivo u otro he terminado usándolo así. Al final con Silex siempre termino usándolo mal, cosa que estoy intentando corregir.

Gracias por la respuesta.

@LoGaNsF

14 mayo 2015, 19:55
#3

Para acceder a todos los datos que se validan lo haces así:

$values = $context->getRoot();

Saludos.

@iBet7o

14 mayo 2015, 22:31
#4

Muchísimas gracias, al final con $context->getRoot()->getData() he podido acceder al formulario y con $values['class_id'] obtengo lo que necesito. Esto me viene genial para otros proyectos que tengo por ahí.

Gracias de nuevo.

@LoGaNsF

15 mayo 2015, 13:17