【问题标题】:Silverstripe form image validation after submit failed提交失败后的 Silverstripe 表单图像验证
【发布时间】:2017-09-21 08:18:40
【问题描述】:

我在处理表单提交后验证图像时遇到了一点问题。有我的表单提交功能:

public function FormAjouterSubmit($data, $form) {

    ....

    Session::clear("PageAuteur.FormAjouterSubmit");

    $texte = "Veuillez remplir ce champ";

    if (!$data['ImageID']) {
        Session::set("PageAuteur. FormAjouterSubmit", $data);
        $form->addErrorMessage('Image', $texte, 'bad');
        return $this->redirectBack();
    }   

    ....

}

我已经尝试过 !$data['ImageID'] 和 !$data['Image'] 并且表单返回并清除我的会话数据。我做错了什么?

【问题讨论】:

  • 您没有使用RequiredFields 验证器是否有原因?在提交函数中构建验证通常是不好的做法。
  • 是的。它是在每个字段下方创建自定义错误消息,并带有向上箭头图像以指向字段。
  • 这就是RequiredFields 已经应该做的事情了……它的外观(例如向上箭头)可以通过 CSS 轻松实现。如果您需要进一步定制,只需子类RequiredFields?
  • 您能发布一个带有自定义错误消息的示例吗?

标签: php forms image silverstripe


【解决方案1】:

您可以使用RequiredFields 来验证所需的表单字段。 Form 构造函数采用第五个参数,您可以在其中提供必填字段验证器。

例子:

$form = Form::create(
    $this, 
    'FormAjouter', 
     $fields, 
     $actions, 
     RequiredFields::create(['Image'])
);

自定义验证消息的最简单方法是使用i18n。如果您的默认语言环境是法语,请创建一个名为 mysite/lang/fr.yml 的文件,您可以在其中放置如下内容:

Form:
  FIELDISREQUIRED: 'Veuillez remplir le champ {name}'

{name} 将替换为您的实际字段标题。当然你也可以省略占位符。

如果您需要为各个表单字段提供不同的文本,您可以在需要自定义错误消息的每个字段上使用setCustomValidationMessage

例子:

$uploadField = FileField::create('Image');
$uploadField->setCustomValidationMessage('Please upload a file');

【讨论】:

  • 不错!我永远不会使用 setCustomValidationMessage。我将删除我的代码并使用您的代码。效果很好,是时候更新我所有的代码了!谢谢@bummack。
  • 这很奇怪,自定义验证消息适用于 Image,但不适用于 TextField 等其他字段。它出现了一个 HTML5 样式的弹出窗口,写着 «请填写此字段»。
  • @StefGuev 这只是基本的 HTML5 验证。它发生在您的数据被发送到服务器之前(纯粹在浏览器中)
  • 是否可以在使用 setcustomvalidation 消息提交后进行验证?实际上,只有 ImageField 似乎以这种方式工作......
  • 查找 HTML5 验证。您可以通过删除单个字段上的 required 属性来禁用它。或者只需将novalidate="novalidate" 添加到表单元素。例如。 $form->setAttribute('novalidate', 'novalidate');
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 2010-12-30
  • 2020-01-31
  • 1970-01-01
  • 2013-04-15
相关资源
最近更新 更多