Как я могу изменить сообщение об ошибке в Symfony - PullRequest
0 голосов
/ 15 октября 2018

Я создаю форму, а затем, когда нажимаю на кнопку «Отправить», отображается следующее сообщение об ошибке:

Пожалуйста, выберите элемент в списке.

Как я могуизменить это сообщение и стилизовать его (с помощью CSS)?

Сущность:

...
    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\NotBlank(message="Hi user, Please select an item")
     */
    private $name;
...

Контроллер:

...
        public function index(Request $request)
        {
            $form = $this->createForm(MagListType::class);
            $form->handleRequest($request);
            return $this->render('index.html.twig', [
                'form' => $form->createView()
            ]);
        }
...

Форма:

...
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', EntityType::class,[
                'class' => InsCompareList::class,
                'label' => false,
                'query_builder' => function(EntityRepository $rp){
                return $rp->createQueryBuilder('u')
                    ->orderBy('u.id', 'ASC');
                },
                'choice_label' => 'name',
                'choice_value' => 'id',
                'required' => true,
            ])
            ->add('submit', SubmitType::class, [
                'label' => 'OK'
            ])
        ;
...
}

1 Ответ

0 голосов
/ 15 октября 2018

Чтобы использовать пользовательские сообщения, вы должны добавить «novalidate» в вашу HTML-форму.Например:

С Twig:

  {{ form_start(form, {attr: {novalidate: 'novalidate'}}) }}
  {{ form_widget(form) }}
  {{ form_end(form) }}

Или в вашем контроллере:

$form = $this->createForm(MagListType::class, $task, array( //where task is your entity instance
    'attr' => array(
           'novalidate' => 'novalidate'
    )
));

Этот ответ Stackoverflow содержит больше информации о том, как использовать novalidate с Symfony.Вы также можете проверить документы для получения дополнительной информации.

Что касается стилей, вы можете использовать JavaScript для запуска классов, которые затем можно стилизовать в вашем CSS, как в этом примере, взятом из Более счастливая форма HTML5Валидация .Вы также можете взглянуть на документацию для MDN и поиграть с селекторами :valid и :invalid.

const inputs = document.querySelectorAll("input, select, textarea");

inputs.forEach(input => {
   input.addEventListener(
      "invalid",
        event => {
          input.classList.add("error");
        },
        false
    );
  });

РЕДАКТИРОВАТЬ: Возможно, выЕсли вы не видите свое пользовательское сообщение, потому что оно приходит со стороны сервера, то сообщение, которое вы видите в данный момент при отправке формы, является проверкой на стороне клиента.Таким образом, вы можете либо разместить novalidate на своем поле, либо вы можете переопределить сообщения проверки на стороне клиента, используя setCustomValidity(), как описано в этой публикации SO , которая также содержит много полезных ссылок.Пример использования вашего Form Builder:

 $builder
    ->add('name', EntityType::class,[
          'class' => InsCompareList::class,
          'label' => false,
          [
           'attr' => [
             'oninvalid' => "setCustomValidity('Hi user, Please select an item')"
           ]
          ],

          'query_builder' => function(EntityRepository $rp){
                return $rp->createQueryBuilder('u')
                    ->orderBy('u.id', 'ASC');
                },
              'choice_label' => 'name',
              'choice_value' => 'id',
              'required' => true,
            ])
      ->add('submit', SubmitType::class, [
          'label' => 'OK'
         ]);
...