如何更改Symfony中的错误消息

时间:2018-10-15 11:34:38

标签: symfony symfony-1.4 symfony-forms

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

  

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

如何更改此消息并设置样式(使用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 :(得分:0)

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

和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'
    )
));

This Stackoverflow answer有更多关于如何在Symfony中使用novalidate的信息。您还可以查看文档以获取更多信息。

关于样式,您可以使用JavaScript触发类,然后您可以在CSS中对类进行样式设置,例如本示例取自Happier HTML5 Form Validation。您还可以查看documentation on MDN并使用:valid:invalid选择器。

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

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

编辑: 您可能看不到自定义消息,因为它来自服务器端,提交表单时当前看到的消息是客户端验证。因此,您可以将novalidate放在字段中,也可以使用setCustomValidity(在客户端覆盖验证消息,如this SO post中所述,其中也包含许多有用的链接。使用表单生成器的示例:

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