Тип пользовательского поля Symfony2 и события формы при отправке

0

Я сделал тип поля captcha, который показывает изображения captcha пользователям.

Я хочу проверить, является ли пользователь правильным или нет в моем настраиваемом типе поля (самооценка в настраиваемом поле).

Мой тип поля:

<?php
namespace CS\CommonBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class CaptchaType extends AbstractType
{
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array('mapped' => false));
    }

    public function getParent()
    {
        return 'text';
    }

    public function getName()
    {
        return 'captcha';
    }
}

Мой сервис:

cs_common.form.type.captcha:
    class: CS\CommonBundle\Form\Type\CaptchaType
    tags:
        - { name: form.type, alias: captcha }

Это отлично работает, когда мы вызываем из любого типа формы.

Изображение 174551

Теперь я должен проверить, что данные формы соответствуют значению session captcha в моем настраиваемом типе поля.

Как я могу это сделать?

Спасибо!

Теги:
validation
forms

2 ответа

0
Лучший ответ

Полное решение:

<?php
namespace CS\CommonBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;

class CaptchaType extends AbstractType
{
    private $session;

    public function __construct(Session $session)
    {
        $this->session = $session;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
            $form = $event->getForm();
            $captcha_value = $form->getData();

            if($captcha_value !== $this->session->get('captcha')) {
                $form->addError(new FormError('Doğrulama Kodu Yanlış!'));
            }
        });
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array('mapped' => false));
    }

    public function getParent()
    {
        return 'text';
    }

    public function getName()
    {
        return 'captcha';
    }
}

Не забудьте обновить сервис:

cs_common.form.type.captcha:
    class: CS\CommonBundle\Form\Type\CaptchaType
    arguments:
        session: "@session"
    tags:
        - { name: form.type, alias: captcha }
1

Добавьте это в свой FormType, чтобы добавить валидатор.

public function buildForm(FormBuilderInterface $builder, array $options) {
    $validator = new CustomValidator();
    $builder->addEventListener(FormEvents::POST_BIND, array($validator, 'validate'));
}
  • 0
    Ваш ответ хорош, но недостаточно хорош. Я сделал это сам и буду публиковать и отвечать :) +1 для buildForm

Ещё вопросы

Сообщество Overcoder
Наверх
Меню