【问题标题】:Stop form validating on first error codeigniter在第一个错误代码点火器上停止表单验证
【发布时间】:2018-12-07 12:31:47
【问题描述】:

我正在使用 CI 3.1.7,如果出现错误,我想停止验证表单。例如:

$config = array(
    array(
            'field' => 'username',
            'label' => 'Username',
            'rules' => 'required',
            'errors' => array(
                    'required' => '%s is required',
            ),
    ),
    array(
            'field' => 'password',
            'label' => 'Password',
            'rules' => 'required',
            'errors' => array(
                    'required' => '%s is required',
            ),
    ),
    array(
            'field' => 'email',
            'label' => 'Email',
            'rules' => 'required',
            'errors' => array(
                    'required' => '%s is required',
            ),
    )
);

当用户将 usernameemail 留空时,表单将仅显示 username is required。感谢您的帮助,谢谢!

【问题讨论】:

  • 要么您必须在循环中逐个验证规则并抛出错误而不是完整数组,或者使用 css 隐藏错误,但使用 ex 的第一个错误除外:.error-class{ display:none; } .error-class:nth-child(1){ display:block; }
  • 我正在寻找一种非 JavaScript 方式。如果我只使用 css,我不能(或者我不知道如何)准确选择 .error-class 来显示
  • 您希望它列出所有错误吗?

标签: php codeigniter validation


【解决方案1】:

您无法停止validation->run(),但您可以控制显示的错误消息。限制是您不能在相关字段旁边显示错误。或者,我应该说,我想不出一种简单的方法来在它所属的输入旁边显示错误。

不管怎样,下面是提取第一条错误消息的方法。

if($this->form_validation->run() == FALSE)
{
    $errors = $this->form_validation->error_array();
    // There could be many but grab only the first
    $fields = array_keys($errors);
    $err_msg = $errors[$fields[0]];
}

如果你想要字段的名称,你可以使用它。

$err_field = $fields[0];

【讨论】:

  • 我有一种方法可以在其输入字段的旁边/下方显示错误消息..您可以返回 error_array 并使用 js/jquery 您可以循环抛出该数组,其键等效于输入名称然后追加其输入字段旁边的错误,或者如果您使用 bootstrap addClass is-invalid 输入并在 .invalid-feedback 中显示错误
  • 是的,您可以以相同的方式生成它并将其发送到视图并重新加载整个表单或在 php 和 js 之间分散负载.. 额外的灵活性
  • @SherifSalah 我和你的想法一样,使用了自定义 error_array。但我真正想要的是立即停止执行表单验证。好像还没有什么好办法。
【解决方案2】:

如果我的问题是正确的 .. 你想停止第一次遇到的表单验证错误,那么你必须编辑核心表单验证库,这是非常糟糕的做法,但幸运的是你可以扩展它的功能并编辑 @987654321 @ 方法本身或创建您自己的方法,只需复制 run() 代码并编辑此代码块:

    // Execute validation rules
    foreach ($this->_field_data as $field => &$row)
    {
        // Don't try to validate if we have no rules set
        if (empty($row['rules']))
        {
            continue;
        }

        $this->_execute($row, $row['rules'], $row['postdata']);

        // here is the modification
        if(count($this->_error_array) > 0) return true; // error found
    }

现在它会在发现第一个错误时停止执行

【讨论】:

  • @Kien Pham 试试这个,它应该在第一个错误后立即停止执行.. 但是创建您自己的库并使其扩展 ci 表单验证库并修改运行方法。
  • 您的解决方案将不起作用,因为 _execute 方法会进行验证。我试过了
  • 是的,我知道_execute 方法会进行实际验证,但根据run 内的foreach 循环,这就是我们在找到第一个错误后从_execute 第一次返回后想要停止的地方。
  • 对不起,我再次测试了它,它现在可以工作了。非常感谢!
【解决方案3】:

请检查

  public function __construct() 
    {
        parent::__construct();

        // load form and url helpers
        $this->load->helper(array('form', 'url'));

        // load form_validation library
        $this->load->library('form_validation');
    }

或查看https://code.tutsplus.com/tutorials/codeigniter-form-validation-from-start-to-finish--cms-28768

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-14
    • 2017-11-04
    • 2016-07-12
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多