我正在运行CI表单验证并使用form_error()为每个字段单独显示错误。但问题是form_error()函数只返回第一个验证错误
示例字段:
<input type="text" name="value" value="short">
验证脚本:
$validationRules = "min_length[6]|numeric";
$this->form_validation->set_rules(
'value',
'lang:mod_the_field',
$validationRules
);
if($this->form_validation->run() === FALSE){
echo form_error('value');
}
以上输出:<p>The Value field must be at least 5 characters in length.<\/p>
虽然该字段也未通过验证作为数值。
我似乎无法找到关于此的文档。我是否缺少一个简单的步骤来获取单个字段输出的所有验证错误?有没有比多次运行验证更好的解决方案,每个规则一次?
编辑: 需要明确的是,我在这个特定示例中寻找的输出是:
<p>The Value field must contain only numbers.</p>
<p>The Value field must be at least 5 characters in length.</p>
一种解决方案是为每个规则运行一次验证并聚合输出,但是我试图找出是否有办法在CI中开箱即用?
解决方案:
我检查了Form_validation库,发现Samutz&#39;评论是正确的。脚本会在第一次验证错误后发生并返回。
而不是扩展任何类,我改变了我的代码来迭代每个规则并连接错误字符串,如下所示:
$validationRules = "min_length[6]|numeric";
$validationRules = explode('|', $validationRules);
$errors = '';
foreach($validationRules as $rule){
$this->form_validation->set_rules(
'value',
'lang:mod_the_field',
$rule
);
if($this->form_validation->run() === FALSE){
$errors .= form_error('value');
}
}
$errors = ($errors) ? $errors : FALSE;
echo $errors;
答案 0 :(得分:0)
问题
在对CI表单中的错误进行测试时,表单帮助中的validation_errors()
所提供的错误并不完全是我称之为“可访问的”。
当然,它们是整齐的,因为每个错误都会显示错误消息(因此在需要时无法填充用户名和密码,默认情况下会显示两条错误消息),但这应该是更进一步。我正在谈论错误标签,例如:
<label for="password">The Password field must be at least 6 characters in length</label>
因此,用户可以点击错误并直接进入需要修复的字段。 想法
我的第一个想法是为表单助手编写一个包装器或以某种方式扩展表单类。虽然这似乎是一个很好的解决方案,但对验证类使用的深入研究揭示了更快的解决方案。默认情况下,密码规则可能如下所示:
$this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[6]|md5');
其中set_rules()方法参数如下:
Password field name attribute (the same which you've defined)
Quoting the manual - A "human" name for this field, which will be inserted into the error message.
Validation rules for password field (in the above example password is required and at least 6 characters long) plus some modifiers (trimming spaces and instant conversion to md5).
一个简单的解决方案是在第二个参数中插入一个标签,该参数将用于显示错误。它看起来像这样:
$this->form_validation->set_rules('password', '<label for="password">Password</label>', 'trim|required|min_length[6]|md5');
但是为什么不进一步使用表单助手中的form_label()呢?这将导致:
$this->form_validation->set_rules('password', form_label('Password', 'password'), 'trim|required|min_length[6]|md5');
正如您可能已经注意到的那样,此修复程序将导致我们针对的代码略有不同:
The <label for="password">Password</label> field must be at least 6 characters in length
只有实际字段名称包含在label标签中。但是嘿 - 有一些简单的风格(下面),它并没有那么糟糕。对于更有条理的样式,最好将自定义类添加到该标签,或者更好 - 将整个错误消息包装在一个独特的容器中(这样您就可以只为该错误标签指定样式)使用set_error_delimiters ():
$this->form_validation->set_error_delimiters('<div class="form_error">','</div>');
这将导致以下html:
<div class="form_error">The <label for="password">Password</label> field must be at least 6 characters in length</div>
添加一些样式:
.form_error label {color:#F00;text-decoration:underline}
希望您现在可以使用form_error()做更多事情:
// in stylesheet
.form_error label {color:#F00;text-decoration:underline}
// in form controller
$this->form_validation->set_error_delimiters('<div class="form_error">','</div>');
$this->form_validation->set_rules('password', form_label('Password', 'password'), 'trim|required|min_length[6]|md5');
答案 1 :(得分:0)
我自己偶然发现了这一点并找到了解决方法。这不是一个正统的解决方案,但在这里它是
$errors = validation_errors('/', '/');
$errors = explode("/", $errors);
echo $errors[1];
这只会输出数组中的第一个错误。
编辑:确保检查数组中是否包含多于1个值
if(count($errors) > 1) {
echo $errors[1];
}
答案 2 :(得分:0)
第一个错误
第二次错误