【问题标题】:Codeigniter form_error() displays only one errorCodeigniter form_error() 只显示一个错误
【发布时间】:2015-05-30 18:36:22
【问题描述】:

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

以上输出:&lt;p&gt;The Value field must be at least 5 characters in length.&lt;\/p&gt;

虽然该字段作为数值也未能通过验证。

我似乎找不到这方面的文档。我是否缺少一个简单的步骤来获取单个字段输出的所有验证错误?有没有比多次运行验证更好的解决方案,每条规则一次?

编辑: 需要明确的是,我在这个特定示例中寻找的输出是:

<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 的表单验证库一旦失败,就会停止检查单个项目的规则。在您的情况下,一旦 min_length[6] 失败并且不会检查数字规则,它就会停止。您需要扩展表单验证库,可能还需要扩展表单助手以获得您想要的结果。

标签: php codeigniter validation


【解决方案1】:

问题

在测试 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_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');

【讨论】:

  • 这绝对是一个有趣的技术,我将来可能会使用它。但它并没有真正解决我的特殊问题。
【解决方案2】:

我自己偶然发现了这个并找到了解决方法。这不是一个真正的正统解决方案,但在这里

$errors = validation_errors('/', '/');
$errors = explode("/", $errors);
echo $errors[1];

这只会输出数组中的第一个错误。

编辑:确保检查您的数组中是否有超过 1 个值

if(count($errors) > 1) {
echo $errors[1];
}

【讨论】:

  • validation_errors() 仍然只给我一个错误。请注意,在我的情况下,我希望在单个字段上获得多个验证错误的输出。
  • 刚刚使用 echo validation_errors('any-separator-you-wan', 'like-empty-space'); ?>
  • 嗯,是的,这会给我所有已验证字段的验证错误。然而,这不是我想要的。就我而言,我在一个字段上有两个验证错误,但表单验证器在输出第一个发现的错误后停止检查。
【解决方案3】:

第一个错误

第二个错误

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2014-05-25
    • 2016-07-26
    • 1970-01-01
    相关资源
    最近更新 更多