表单上的Silverstripe多个错误

时间:2015-10-18 19:25:58

标签: forms silverstripe

我试图弄清楚如何向表单字段添加多个错误消息。这是我目前在doFormAction方法中使用的逻辑:

$errors = $validation->ValidateInput($data);
foreach($errors as $key => $value){
    if(!empty($value)){
        $errorMessages = "<ul>";
        foreach($value as $errorMessage){
            $errorMessages = $errorMessages . "<li>" . $errorMessage . "</li>"
        }
        $errorMessages = $errorMessages . "</ul>";
        $form->AddErrorMessage($key, $errorMessages, 'bad');
    }
}

以上打印输出实际上不会为我打印出列表,它会在页面打印出来之前对字符进行html编码。如果我尝试使用这样的东西:

$form->AddErrorMessage("Field1", "First Error", 'bad');
$form->AddErrorMessage("Field1", "Second Error", 'bad');

我只会看到最后一条错误消息。有没有办法使用silverstripe表单在单个字段上产生多个错误消息?

编辑: 以下是silverstripe的功能:

public function addErrorMessage($fieldName, $message, $messageType, $escapeHtml = true) {
    Session::add_to_array("FormInfo.{$this->FormName()}.errors",  array(
       'fieldName' => $fieldName,
       'message' => $escapeHtml ? Convert::raw2xml($message) : $message,
       'messageType' => $messageType,
    ));
}

这意味着当我第二次添加错误消息时,它会覆盖第一个错误消息,因为它使用相同的名称。

1 个答案:

答案 0 :(得分:1)

如果我没记错的话,AddErrorMessage应该为每个字段添加一个错误。即使每个字段有多个规则,我也从未添加过多个错误消息,因为它可能会(a)让用户感到困惑,(b)修复一个问题也可能会修复其他问题。

我宁愿使用客户端验证(http://parsleyjs.orghttps://rickharrison.github.io/validate.js/,..。),这是为了快速反馈。然后我将再次检查服务器端,但绝大多数问题已经在客户端修复了;因此,对于这种罕见的用例,我不会太担心它。

如果您仍想更改它,请查看http://api.silverstripe.org/3.1/source-class-Form.html#567-581 - 您应该能够覆盖/编写自己的实现,涵盖每个字段的多个错误,但我不确定是否&#39值得的。