2012-01-02 3 views
6

Я пытаюсь добавить EWZRecaptcha в свою регистрационную форму. Мои регистрационная форма строители выглядят примерно так:Symfony2 добавить поле reCaptcha в регистрационную форму

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

Теперь, как я могу добавить ReCaptcha Constraint в поле капчи? Я попытался добавить это validation.yml:

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

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

Но я получаю Property recaptcha does not exists in class Acme\MyBundle\Entity\User ошибку.

Если удалить array('property_path' => false) из вариантов поле ReCaptcha, я получаю ошибку:

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

Любая идея, как решить эту проблему? :)

ответ

4

Acme\MyBundle\Entity\User не имеет свойства recaptcha, поэтому вы получаете ошибки для проверки этого свойства на объекте User. Значение 'property_path' => false верное, так как это сообщает объекту Form, что он не должен пытаться получить/установить это свойство для объекта домена.

Итак, как вы можете проверить это поле в этой форме и по-прежнему сохраняете свой объект User? Простой - это даже объясняется в . Вам нужно будет установить ограничение самостоятельно и передать его на FormBuilder. Вот то, что вы должны закончить с:

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

Единственное, что я не знаю об этом методе, является ли эта коллекция ограничение быть объединены с validation.yml или если он перепишет его.

Вы должны прочитать this article, в котором объясняется более глубокий процесс настройки форм с проверкой сущностей и других свойств. Он специфичен для MongoDB, но применяется к любому объекту Doctrine. Следуя этой статье, просто замените поле termsAccepted полем recaptcha.

+0

Отличная статья, спасибо! – tamir

+2

Поскольку Symfony 2.1, 'mapped = false' следует использовать вместо' property_path = false', см. Http://symfony.com/doc/current/reference/forms/types/form.html#property-path и http: //symfony.com/doc/current/reference/forms/types/form.html#mapped, соответственно. –

Смежные вопросы