2011-11-06 4 views
6

Problema 1errori di accesso nel controller di Symfony2 per AJAX presentate sotto forma

Mi piacerebbe costruire un modulo di registrazione per sottomissione ajax. I lavori di registrazione sono $form->isValid(). Tuttavia, se il modulo fallisce la registrazione devo restituire questi errori via ajax.

if ($form->isValid()) { 

}else{ 
    $errors = $form->getErrors(); 
    // return some json encoded errors here 
} 

$form->getErrors() restituisce un array vuoto anche se la forma non ha convalidato (in questo caso sto testando con un nome utente è troppo breve).

Problema 2

Il secondo problema che ho è che se la forma convalida ma c'è ancora un errore. Ad esempio un campo univoco che qualcuno cerca di inviare per lo stesso valore.

if ($form->isValid()) { 

    $em = $this->getDoctrine()->getEntityManager(); 
    $em->persist($form->getData()); 
    $em->flush(); 

    // error could be a username submitted more than once, username is unique field 

}else{ 
    // ... 
} 

Come posso rilevare questo errore e restituirlo tramite json?

risposta

7

Problema 1

Nel vostro costruttore modulo è possibile utilizzare error_bubbling per spostare gli errori nel vostro oggetto form. Quando si specifica il campo, passarlo come un'opzione come questa:

$builder->add('username','text', array('error_bubbling'=>true)); 

e si può accedere errori nel vostro oggetto form in questo modo:

$form->getErrors(); 

uscite qualcosa come

array (
    0 => 
    Symfony\Component\Form\FormError::__set_state(array(
    'messageTemplate' => 'Your username must have at least {{ limit }} characters.', 
    'messageParameters' => 
    array (
     '{{ value }}' => '1', 
     '{{ limit }}' => 2, 
    ), 
)), 
) [] [] 

fyi: Se si utilizza il modulo/tipo non è possibile impostare error_bubbling come valore predefinito, deve essere assegnato a ciascun campo.

Link utile: http://symfony.com/doc/2.0/reference/forms/types/text.html#error-bubbling

Problema 2

http://symfony.com/doc/2.0/reference/constraints/UniqueEntity.html

4

Problema 1

Gli errori non sono sul modulo stesso. Form::getErrors restituirebbe solo errori se ce n'erano sull'oggetto modulo stesso. È necessario attraversare il modulo e verificare eventuali errori su ciascun bambino.

Form::isValid al contrario, attraversa solo i bambini e controlla se uno di essi non è valido.

Problema 2

Se ci sono ancora "errori" Dopo la convalida, che significa che il vostro convalida non è completa. Se la tua applicazione richiede un vincolo non standard, devi solo andare avanti e scrivere un vincolo personalizzato. Vedere the cookbook entry on writing custom validator constraints per ulteriori informazioni.

+0

Come sarebbe il validatore sapere che qualcuno ha già utilizzato quel nome utente nella tabella? Pensavo che il validatore verificasse se i dati fossero corretti, non se i dati esistessero già, o lo faccia entrambi? – ed209

+0

Un validatore può eseguire qualsiasi tipo di convalida che si codifica per fare.Naturalmente, come è stato notato, esiste già un validatore per l'unicità, UniqueEntity. –