使用回调函数时,无法在Code Igniter 3中设置错误消息

时间:2016-03-16 13:09:03

标签: php ajax codeigniter codeigniter-3

我正在编写一个方法,使用POST发布的AJAX变量将用户添加到数据库中的某个课程,但我无法使回调正常工作:

 public function enroll()
{
    $package = array();
    $this->load->library('form_validation');
    $this->form_validation->set_rules('course', 'Vak', 'required|callback_not_enrolled');
    $fields = array("course");

    if ($this->form_validation->run($this) === FALSE) {
        $errors = array();
        $success = array();
        foreach ($fields as $field) {
            $error = form_error($field);
            if ($error !== "") {
                $errors[$field] = $error;
            } else {
                $success[$field] = True;
            }
        }
        $package["field_errors"] = $errors;
        $package["field_success"] = $success;
        $package["success"] = False;
    } else {
        $package["database"] = $this->course_model->enroll_user($this->data["user"], $this->input->post("course"));
        $package["success"] = True;
    }
    echo json_encode($package);
}

我编写了回调not_enrolled来检查用户是否尚未注册到数据库。请注意,我不能使用is_unique,因为我必须测试两个字段的组合唯一性(因此只有一个或两个单独的字段不起作用)并且用户的id不是包含在表单中(因为它是Code Igniter会话的一部分)。

回调函数:

    public function _not_enrolled($course)
    {
    $exists = ($this->user->is_enrolled($course, $this->data["user_id"]) != False);
    if ($exists != False) {
        $this->form_validation->set_message("not_enrolled", "Already enrolled");
        return False;
    } else {
        return True;
    }
}

最后来自模型的方法is_enrolled

    public function is_enrolled($course, $user=False) {
    if($user==False){
        $user = $this->data["user_id"];
    }
    $this->db->select()->from("course_participant")->where("user_id", $user)->where("course_id", $course);
    $query = $this->db->get();
    return($query->num_rows()>0);
}

通过调用var_dump($this->_not_enrolled($existing_course_id));我知道回调函数和模型中的方法都正常工作,因为它正确返回true。 当我var_dump $package数组或validation_errors()时,我没有收到任何验证错误,除非它说无法访问与您的字段名称相对应的错误消息Vak(not_enrolled)

  1. 我尝试从函数名中删除初始的 _ ,但这会给我一个Server Status 500错误。
  2. 我有另外一个完全这样的设置,尽管是其他数据库调用,使用相同的语法进行回调。这种方法非常有效。

0 个答案:

没有答案