2012-07-03 4 views
7

Mein Formular als Feld users (Entitätstyp). Wie kann ich die Validierung hinzufügen, um so spezifisch zu sein, dass mindestens ein Benutzer ausgewählt werden sollte? Eigentlich Zuhörer ich hinzufüge, ein Ereignis, aber ich weiß nicht, ob dies eine legitime Lösung ist oder nicht:Wie validiere ich eine Auswahl von mindestens einem Element (oder N Elementen) in 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)); 
    }); 
} 

Antwort

0

Werfen Sie einen Blick auf die Validierungskomponente: http://symfony.com/doc/current/book/validation.html

Sie können eine callback constraint innerhalb der Schreib Objekt, das Sie überprüfen möchten:

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

die Rückruf Einschränkung Seite sehen, wie diese Einschränkung zu Ihrem Unternehmen hinzuzufügen (diese depens wenn Sie Anmerkungen oder yaml/xml verwenden).

+0

Aber die Aufgabe ist eine Lehre Sammlung in meinem Fall ... – gremo

+0

Sie die Daten in Ihrem Ereignis-Listener mit '$ data = $ event-> getData Abrufen (); '. Ich denke nicht, dass das eine Doktrin-Sammlung ist? Können Sie die 'getDefaultOptions' Methode der Typklasse anzeigen? – Sgoettschkes

20

Ab Symfony 2.1 können Sie die Count Einschränkung verwenden. Wenn Sie 2.0 verwenden, können Sie die Einschränkung einfach in Ihr Projekt kopieren und seine Namespaces und seine API (die leicht zwischen 2.0 und 2.1 geändert wurde) anpassen.

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

Haben Sie versucht, Constraint-Validator zu verwenden? Ich nehme Ihren Code wie folgt aussehen:

->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') 
     ), 
    ));