type isvalid form collection symfony doctrine2 symfony-forms

isvalid - ¿Cómo validar una selección de al menos un elemento(o N elementos) en Symfony 2?



symfony form validation (3)

Mi formulario como users campo (tipo de entidad). ¿Cómo puedo agregar validación para especificar que se debe seleccionar al menos un usuario ? En realidad, estoy agregando un detector de eventos pero no sé si esta es una solución legítima o no:

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)); }); }


¿Has probado usar el validador de restricciones de conteo? Supongo que su código se verá 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'') ), ));


A partir de 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();


Eche un vistazo al componente de validación: http://symfony.com/doc/current/book/validation.html

Puede escribir una restricción de devolución de llamada dentro del objeto que desea 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); } }

Vea la página de restricción de devolución de llamada cómo agregar esta restricción a su entidad (esto se deja de lado si está usando anotaciones o yaml / xml).