2012-01-02 16 views
6

Sto cercando di aggiungere EWZRecaptcha al modulo di registrazione. mio modulo di iscrizione costruttore di simile a questa:Symfony2 aggiungi il campo reCaptcha al modulo di registrazione

public function buildForm(FormBuilder $builder, array $options) 
{ 
    $builder->add('username', 'text') 
      ->add('password') 
      ->add('recaptcha', 'ewz_recaptcha', array('property_path' => false)); 
} 

public function getDefaultOptions(array $options) 
{ 
    return array(
      'data_class' => 'Acme\MyBundle\Entity\User', 
    ); 
} 

Ora, come posso aggiungere il Recaptcha vincolo al campo captcha? Ho cercato di aggiungere questo ai validation.yml:

namespaces: 
    RecaptchaBundle: EWZ\Bundle\RecaptchaBundle\Validator\Constraints\ 

Acme\MyBundle\Entity\User: 
    ... 
    recaptcha: 
    - "RecaptchaBundle:True": ~ 

Ma ottengo Property recaptcha does not exists in class Acme\MyBundle\Entity\User errore.

Se rimuovo array('property_path' => false) dalle opzioni del campo recaptcha, ottengo l'errore:

Neither property "recaptcha" nor method "getRecaptcha()" nor method "isRecaptcha()" 
exists in class "Acme\MyBundle\Entity\User" 

Qualsiasi idea di come risolverlo? :)

risposta

4

Acme\MyBundle\Entity\User non ha una proprietà recaptcha, pertanto si ricevono errori per tentare di convalidare tale proprietà sull'entità User. L'impostazione 'property_path' => false è corretta, poiché indica all'oggetto Form che non dovrebbe tentare di ottenere/impostare questa proprietà per l'oggetto dominio.

Quindi, come si può convalidare quel campo su questo modulo e persistere ancora l'entità User? Semplice: viene anche spiegato in . Dovrai configurare tu stesso il vincolo e passarlo allo FormBuilder. Ecco cosa si dovrebbe finire con:

<?php 

use Symfony\Component\Validator\Constraints\Collection; 
use EWZ\Bundle\RecaptchaBundle\Validator\Constraints\True as Recaptcha; 

... 

    public function getDefaultOptions(array $options) 
    { 
     $collectionConstraint = new Collection(array(
      'recaptcha' => new Recaptcha(), 
     )); 

     return array(
      'data_class' => 'Acme\MyBundle\Entity\User', 
      'validation_constraint' => $collectionConstraint, 
     ); 
    } 

L'unica cosa che non so su questo metodo, è se questa collezione vincolo verrà fusa con il tuo validation.yml o se si sovrascrive.

Si consiglia di leggere this article che spiega un po 'più in profondità il processo corretto per l'impostazione di moduli con convalida per entità e altre proprietà. È specifico per MongoDB ma si applica a qualsiasi entità Doctrine. A seguito di questo articolo, è sufficiente sostituire il campo termsAccepted con il campo recaptcha.

+0

Ottimo articolo, grazie! – tamir

+2

Poiché Symfony 2.1, 'maped = false' dovrebbe essere usato al posto di' property_path = false', vedere http://symfony.com/doc/current/reference/forms/types/form.html#property-path e http: //symfony.com/doc/current/reference/forms/types/form.html#mapped, rispettivamente. –

Problemi correlati