首页 > 解决方案 > 如何更改 Symfony 中的错误消息

问题描述

我创建了一个表单,然后当我单击提交按钮时,显示此错误消息:

请在列表中选择一个项目。

如何更改此消息并设置其样式(使用 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'
            ])
        ;
...
}

标签: symfonysymfony-1.4symfony-forms

解决方案


为了使用自定义消息,您必须在 HTML 表单中添加“novalidate”。例如:

用树枝:

  {{ 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 答案有更多关于如何在 Symfony 中使用 novalidate 的信息。您还可以查看文档以获取更多信息。

至于样式,您可以使用 JavaScript 来触发类,然后您可以在 CSS 中设置样式,就像这个取自Happier HTML5 Form Validation的示例一样。您还可以查看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 帖子中所述,该帖子还包含许多有用的链接。使用表单生成器的示例:

 $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'
         ]);

推荐阅读