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).