我正在运行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的评论是正确的。脚本在第一次验证错误后中断并返回。
我没有扩展任何类,而是修改了代码,对每个规则进行迭代,并连接错误字符串,如下所示:
$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;
问题
当测试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
只有实际的字段名称被包装在标签标签中。但是,嘿,有了一些简单的风格(下面),它一点也不坏。对于更有组织性的样式,最好在该标签中添加一个自定义类,或者使用set_error_dimiters():将整个错误消息包装在某个唯一的容器中(这样您就可以只为该错误标签指定样式)
$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');
我自己偶然发现了这一点,并找到了解决方法。这不是一个真正的正统解决方案,但这里是
$errors = validation_errors('/', '/');
$errors = explode("/", $errors);
echo $errors[1];
这将只输出数组中的第一个错误。
编辑:确保检查您的数组中是否有超过1个值
if(count($errors) > 1) {
echo $errors[1];
}
第一个错误
第二错误