Codeigniter form_error()只显示一个错误


Codeigniter form_error() displays only one error

我正在运行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];
}

第一个错误

第二错误

框p:nth-child(2){display:none;}