2012-07-03 14 views
7

Mi formulario como campo users (tipo de entidad). ¿Cómo puedo agregar validación para especificar que se debe seleccionar al menos un usuario? En realidad estoy añadiendo un detector de eventos, pero yo no sé si esto es una solución de fiar o no:¿Cómo validar una selección de al menos un elemento (o N elementos) en Symfony 2?

public function buildForm(\Symfony\Component\Form\FormBuilder $builder, 
    array $options) 
{ 
    $builder 
     ->add('title', 'text', array(
      'label' => 'Titolo' 
     )) 
     ->add('content', 'textarea', array(
      'label' => 'Contenuto' 
     )) 
     ->add('sender_text', 'text', array(
      'label' => 'Mittente testuale', 
     )) 
     ->add('users', 'entity', array(
      'label' => 'Destinatari', 
      'class' => 'DL\FidelityBundle\Entity\User', 
      'property' => 'select_label', 
      'multiple' => true 
     )); 
    ; 

    // Valida il numero di utenti selezionati 
    $builder->addEventListener(\Symfony\Component\Form\FormEvents::POST_BIND, 
     function($event) { 
      $form = $event->getForm(); 
      $data = $event->getData(); 

      if(!$data->users->isEmpty()) return; 

      $msg = 'Occorre specificare almeno un utente destinatario'; 
      $form->get('users')->addError(new FormError($msg)); 
    }); 
} 

Respuesta

0

Tenga una mirada en el componente de validación: http://symfony.com/doc/current/book/validation.html

puede escribir una callback constraint dentro del el objeto que desee validar:

use Symfony\Component\Validator\ExecutionContext; 

public function isUsersValid(ExecutionContext $context) 
{ 
    if ($this->users->isEmpty()) { 
     $propertyPath = $context->getPropertyPath() . '.users'; 
     $context->setPropertyPath($propertyPath); 
     $context->addViolation('Occorre specificare almeno un utente destinatario', array(), null); 
    } 
} 

Ver la página de restricción de devolución de llamada cómo agregar esta restricción a la entidad (esto depens si está utilizando anotaciones o yaml/xml).

+0

Pero el objeto es una colección doctrina en mi caso ... – gremo

+0

va a recuperar los datos en el detector de eventos con los datos '$ = $ event-> getData (); '. No creo que esto sea una colección de doctrinas. ¿Podría mostrar el método 'getDefaultOptions' de la clase de tipo? – Sgoettschkes

20

Desde Symfony 2.1, puede usar la restricción Count. Si está en 2.0, puede simplemente copiar la restricción en su proyecto y adaptar sus espacios de nombres y su API (que se modificó ligeramente entre 2.0 y 2.1).

/** 
* @Assert\Count(min = 1, minMessage = "Occorre specificare almeno un utente destinatario") 
*/ 
private $users = new ArrayCollection(); 
3

¿Ha intentado utilizar el validador Count constraint? supongo que el código se vería así:

->add('users', 'entity', array(
     'label' => 'Destinatari', 
     'class' => 'DL\FidelityBundle\Entity\User', 
     'property' => 'select_label', 
     'multiple' => true, 
     'constraints' => new Count(
      array('min' => 1, 'minMessage' => "Please select at least one user') 
     ), 
    )); 
Cuestiones relacionadas