Подтвердить что ты не робот

Symfony проверяет форму с отображаемыми полями ложной формы

У меня есть форма с добавленными полями с опцией mapped до false. Но когда я пытаюсь проверить мою форму, она не будет пропущена, показывая, что это значение недействительно над этими конкретными полями формы. Разве этот вариант не должен обходить проверку?

Эти поля формы полезны только для заполнения других полей, и мне не нужно их сохранять или даже проверять.

Единственное решение, которое я нашел, - удалить все лишние поля с помощью js при нажатии кнопки отправки.

4b9b3361

Ответ 1

Этот пост не обновляется с помощью Symfony 2.3

прочитать комментарии ниже

Запускается новая версия!

Проверка не отображаемых полей в форме (Symfony 2.1.2)

Это глобальный ответ для некоторых вопросов stackoverflow о текущем способе проверки неограниченного или не отображаемого поля в формах.

Богатая экосистема Symfony 2 делает нашу систему выбора быстро развивающимся инструментом.
Версия Symfony 2.1 приносит много неудобств. Это означает, что то, что работает с Symfony 2.0 до 2.1.2, больше не будет работать в Symfony 2.3. Для получения дополнительной информации об этом читайте UPGRADE FROM Symfony 2.0 до 2.1 и читайте @deprecated комментарии в коде Symfony.

Невязанные поля

При создании формы обычно используются сущности, и ваша валидация может быть сделана в базах Entity для аннотаций проверки.

namespace Dj\TestBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**    
 * Dj\TestBundle\Entity\Post
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Dj\TestBundle\Entity\PostRepository")
 */
class Post
{
    // ... some code

    /**
    * @var string $title
    * @ORM\Column(name="title", type="string", length=200, nullable=false)
    * @Assert\NotBlank()
    */
    private $title;

    // .. getters and setters
}

Но иногда (часто) вам нужно вставить некоторые поля в вашу форму, которые не сопоставляются с моделью.

Наш пример модели выглядит следующим образом:

namespace Dj\TestBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Dj\TestBundle\Entity\Post
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Dj\TestBundle\Entity\PostRepository")
 */
class Post
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**ghjkl
     * @var string $title
     * @ORM\Column(name="title", type="string", length=200, nullable=false)
     * @Assert\NotBlank()
     */
    private $title;

    // ... getters and setters
}

Если мы хотим добавить дополнительное поле с именем myExtraField в нашу форму:

class PostType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('title')
                ->add('myExtraField', 'choice', array(
                        'label' => 'myExtraField option :',
                        'choices' => array(
                            1 => 'Option One',
                            2 => 'Option Wat !'
                        ),
                        'expanded' => true,
                        'mapped' => false
                   ));
    }
    // other methods
}

Примечание:

  • сопоставлено заменяет property_path, который будет устаревшим в Symfony 2.3
  • вы можете добавить выбранное значение по умолчанию в myExtraField, добавив в массив параметров 'data' = > 1.

Пример кода:

$builder->add('title')
    ->add('myExtraField', 'choice', array(
        'label' => 'myExtraField option :',
        'choices' => array(
            1 => 'Option One',
            2 => 'Option Wat !'
        ),
        'data' => 1, // default selected option
        'expanded' => true,
        'mapped' => false
));

Если вы хотите проверить поле myExtraField, вы не можете сделать это в аннотации Post Entity, вы должны сделать это в своей форме.

Неверное поле проверки достоверности - путь Symfony 2.0

2.0 способ состоял в том, чтобы добавить валидатор в конструктор форм ($ builder- > addValidator (..)), но этот метод устарел!

namespace Dj\TestBundle\Form;

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

// needed namespaces for 2.0 validation
use Symfony\Component\Form\CallbackValidator;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormError;

class PostType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // ... $builder->add()

        // VALIDATING NON MAPPED FIELD Symfony 2.0 way
        /** @var Symfony\Component\Form\CallbackValidator $myExtraFieldValidator **/
        $myExtraFieldValidator = new CallbackValidator(function(FormInterface $form){
          $myExtraField = $form->get('myExtraField')->getData();
            if (empty($myExtraField)) {
              $form['myExtraField']->addError(new FormError("myExtraField must not be empty"));
            }
        });
        // adding the validator to the FormBuilderInterface
        $builder->addValidator($myExtraFieldValidator);
    }
    // ... other methods
}

В настоящее время мы проверяем поле myExtraField, НО $builder- > addValidator умрет в Symfony 2.3!

Код, совместимый с Forward

Как указано в ОБНОВЛЕНИЕ ОТ Symfony 2.0 до 2.1, поскольку FormValidatorInterface устарел, теперь мы должны передать нашу функцию закрытия проверки на прослушиватель событий, связанный с событием FormEvents:: POST_BIND.

Это код.

namespace Dj\TestBundle\Form;

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

// needed namespaces for 2.1 validation
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormError;

class PostType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // ... $builder->add()

        // VALIDATING NON MAPPED FIELD Symfony 2.1.2 way (and forward)
        /** @var \closure $myExtraFieldValidator **/
        $myExtraFieldValidator = function(FormEvent $event){
            $form = $event->getForm();
            $myExtraField = $form->get('myExtraField')->getData();
            if (empty($myExtraField)) {
              $form['myExtraField']->addError(new FormError("myExtraField must not be empty"));
            }
        };

        // adding the validator to the FormBuilderInterface
        $builder->addEventListener(FormEvents::POST_BIND, $myExtraFieldValidator);
    }
    // ... other methods
}

Это, безусловно, может быть улучшено с помощью некоторой справки Sf gurus, но на данный момент он проверяет несвязанное поле формы на совместимом с ним способом.

Надеюсь, что это поможет оттолкнуть некоторых из нас.

Дэвид

Ответ 2

Как я упоминал в вопросе по аналогичной теме, начиная с Symfony 2.1, вы должны используйте параметр "ограничения" , чтобы добавить подтверждение к вашим немаркированным полям:

use Symfony\Component\Validator\Constraints\MinLength;
use Symfony\Component\Validator\Constraints\NotBlank;

$builder
    ->add('firstName', 'text', array(
        'constraints' => new MinLength(3),
    ))
    ->add('lastName', 'text', array(
        'constraints' => array(
            new NotBlank(),
            new MinLength(3),
        ),
    ))
;

Надеюсь, что это поможет кому-нибудь вроде меня, кто потерял время на этом...

Ответ 3

Если вы уже используете ограничение, вы можете сделать это:

$builder
    ->add('new', 'repeated', array(
            'type' => 'password',
            'required'          => true,                    
            'invalid_message' => 'crmpicco.status.password_mismatch',
            'constraints'       => array(
                new NotBlank(),
                new Assert\Length([
                    'min'        => 2,
                    'max'        => 50,
                    'minMessage' => 'Your first name must be at least 2  characters long',
                    'maxMessage' => 'Your first name cannot be longer than 2 characters',
                ])
            )
        ))
    ->add('save', 'submit', array(
            'label' => 'password.form.fields.save',
        ))
    ;

Ответ 4

Это работает. Проверено на symfony 2.1. Код должен выглядеть следующим образом:

$builder->add('password', 'password', ['required' => false, 'mapped' => false]);

Конечно, свойство "требуется" не требуется. Пример из документации.