我试图弄清楚如何向表单字段添加多个错误消息。这是我目前在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,
));
}
这意味着当我第二次添加错误消息时,它会覆盖第一个错误消息,因为它使用相同的名称。
答案 0 :(得分:1)
如果我没记错的话,AddErrorMessage
应该为每个字段添加一个错误。即使每个字段有多个规则,我也从未添加过多个错误消息,因为它可能会(a)让用户感到困惑,(b)修复一个问题也可能会修复其他问题。
我宁愿使用客户端验证(http://parsleyjs.org,https://rickharrison.github.io/validate.js/,..。),这是为了快速反馈。然后我将再次检查服务器端,但绝大多数问题已经在客户端修复了;因此,对于这种罕见的用例,我不会太担心它。
如果您仍想更改它,请查看http://api.silverstripe.org/3.1/source-class-Form.html#567-581 - 您应该能够覆盖/编写自己的实现,涵盖每个字段的多个错误,但我不确定是否&#39值得的。