2012-01-02 20 views
6

Estoy intentando agregar EWZRecaptcha a mi formulario de registro. Mi constructor de la forma de registro es como la siguiente:Symfony2 agregue el campo ReCaptcha al formulario de registro

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

Ahora, ¿cómo puedo añadir la restricción Reconocer texto en el campo código de imagen? He intentado añadir esto a validation.yml:

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

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

Pero consigo Property recaptcha does not exists in class Acme\MyBundle\Entity\User error.

Si quito array('property_path' => false) de las opciones del campo Reconocer texto, me sale el error:

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

alguna idea de cómo solucionarlo? :)

Respuesta

4

Acme\MyBundle\Entity\User no tiene una propiedad recaptcha, por lo que recibirá errores al intentar validar esa propiedad en la entidad User. La configuración 'property_path' => false es correcta, ya que le dice al objeto Form que no debe tratar de obtener/establecer esta propiedad para el objeto de dominio.

Entonces, ¿cómo puede validar ese campo en este formulario y aún persistir su entidad User? Simple: incluso se explica en . Tendrá que configurar la restricción usted mismo y pasarla al FormBuilder. Esto es lo que debe terminar 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, 
     ); 
    } 

La única cosa que no sé acerca de este método, es si esta colección restricción se fusionará con su validation.yml o si va a sobrescribir.

Debe leer this article que explica un poco más en profundidad el proceso adecuado para configurar formularios con validación para entidades y otras propiedades. Es específico de MongoDB pero se aplica a cualquier entidad de Doctrine. Después de este artículo, simplemente reemplace su campo termsAccepted con su campo recaptcha.

+0

¡Gran artículo, gracias! – tamir

+2

Desde Symfony 2.1, se debe usar 'mapped = false' en lugar de' property_path = false', ver http://symfony.com/doc/current/reference/forms/types/form.html#property-path y http: //symfony.com/doc/current/reference/forms/types/form.html#mapped, respectivamente. –

Cuestiones relacionadas