如果文件上传错误,请停止表单验证提交

时间:2016-09-03 04:46:53

标签: codeigniter codeigniter-3

问题:当用户填写表单验证正确但图片上传时出现错误时,如何停止提交表单

即使我的图片上传出错,目前仍会提交数据。

<?php

class Users extends MY_Controller {

    private $error = array();

    public function __construct() {
        parent::__construct();
        $this->load->library('form_validation');
        $this->load->library('countries');
        $this->load->library('upload');
        $this->load->model('admin/user/user_model');
        $this->load->model('admin/user_group/usergroup_model');
    }

    public function add() {
        $this->form_validation->set_rules('username', 'Username', 'trim|required');

        if ($this->form_validation->run() == true) {

            if (isset($_FILES['userfile']) && $_FILES['userfile']['size'] > 0) {
                if (!is_dir(FCPATH . 'uploads/users/' . $this->input->post('username') . '/')) {
                    mkdir(FCPATH . 'uploads/users/' . $this->input->post('username') . '/');
                }

                $config['upload_path'] = './uploads/users/' . $this->input->post('username') . '/';
                $config['allowed_types'] = 'gif|png';
                $config['max_size'] = 3000;
                $config['max_width'] = 0;
                $config['max_height'] = 0;
                $config['overwrite'] = TRUE;

                $this->upload->initialize($config);

                if ($this->upload->do_upload('userfile')) {
                    return true;
                } 
            }

            $this->user_model->insert($this->upload->data());
        }

        if ($this->upload->display_errors() != false) {
            $this->error['warning'] = $this->upload->display_errors();
        }

        if (validation_errors() != false) {
            $this->error['warning'] = validation_errors('<div class="alert alert-danger">', '</div>');
        }

        if (isset($this->error['warning'])) {
            $data['warning_error'] = $this->error['warning'];
        } else {
            $data['warning_error'] = '';
        }

        $data['countries'] = $this->countries->get();
        $data['timezones'] = DateTimeZone::listIdentifiers(DateTimeZone::ALL);
        $data['usergroups'] = $this->usergroup_model->get_user_groups();
        $data['header'] = Modules::run('admin/common/header/index');
        $data['footer'] = Modules::run('admin/common/footer/index');

        $this->load->view('user/add_view', $data);
    }
}

模型

<?php

class User_model extends CI_Model {

    public function insert($upload_data = array()) {
        $this->db->trans_begin();

        $options = [
            'cost' => 12,
        ];

        $hash = password_hash($this->input->post('password'), PASSWORD_BCRYPT, $options);

        $data = array(
            'user_group_id' => $this->input->post('user_group_id'),
            'username' => $this->input->post('username'),
            'password' => $hash,
            'firstname' => $this->input->post('firstname'),
            'lastname' => $this->input->post('lastname'),
            'email' => $this->input->post('email'),
            'image' => ($upload_data['file_name']) ? $upload_data['file_name'] : '',
            'country' => $this->input->post('country'),
            'timezone' => $this->input->post('timezone'),
            'status' => $this->input->post('status'),
            'date_added' => date('Y-m-d')
        );

        $this->db->set($data);
        $this->db->insert($this->db->dbprefix . 'user');

        if ($this->db->trans_status() === FALSE) {
            $this->db->trans_rollback();
        } else {
            $this->db->trans_commit();
        } 
    }
}

Codeigniter版本3.1.0&amp; XAMPP Windows 10

1 个答案:

答案 0 :(得分:0)

现在已经解决了。

<?php

class Users extends MY_Controller {

    private $error = array();

    public function __construct() {
        parent::__construct();
        $this->load->library('form_validation');
        $this->load->library('countries');
        $this->load->library('upload');
        $this->load->model('admin/user/user_model');
        $this->load->model('admin/user_group/usergroup_model');
    }

    public function add() {
        $this->form_validation->set_rules('username', 'username', 'trim|required|is_unique[user.username]');
        $this->form_validation->set_message('is_unique', 'Opps looks like someone has all ready got that {field}');

        if ($this->form_validation->run() == true) {

            if (isset($_FILES['userfile']) && $_FILES['userfile']['size'] > 0) {

                if ($this->upload() == true) {
                    $this->user_model->insert($this->upload->data());
                }

            } else {

                $this->user_model->insert();
            }
        }

        if (validation_errors() != '') { 
            $this->error['warning'] = validation_errors('<div class="alert alert-danger">', '</div>'); 
        }

        if (isset($this->error['warning'])) {
            $data['warning_error'] = $this->error['warning'];
        } else {
            $data['warning_error'] = '';
        }

        $data['countries'] = $this->countries->get();
        $data['timezones'] = DateTimeZone::listIdentifiers(DateTimeZone::ALL);
        $data['usergroups'] = $this->usergroup_model->get_user_groups();
        $data['header'] = Modules::run('admin/common/header/index');
        $data['footer'] = Modules::run('admin/common/footer/index');

        $this->load->view('user/add_view', $data);
    }

    public function upload() {
        if (!is_dir(FCPATH . 'uploads/users/' . $this->input->post('username') . '/')) {
            mkdir(FCPATH . 'uploads/users/' . $this->input->post('username') . '/');
        }

        $config['upload_path'] = './uploads/users/' . $this->input->post('username') . '/';
        $config['allowed_types'] = 'gif|jpg|png';
        $config['max_size'] = 3000;
        $config['max_width'] = 0;
        $config['max_height'] = 0;
        $config['overwrite'] = TRUE;

        $this->upload->initialize($config);

        if (!$this->upload->do_upload('userfile')) {
            $this->error['warning'] = $this->upload->display_errors('<div class="alert alert-danger">', '</div>');
        } else {
            return true;
        }

        return !$this->error;
    }
}