Отправить форму с пустой загрузкой файла не работает

На моем контроллере страниц у меня есть функция обратного вызова для проверки моей основной формы, называемая do_upload, которая является моей загрузкой файла.

Вопрос Когда я отправляю форму без загрузки изображения, возникает ошибка You did not select a file to upload. Каков наилучший способ, чтобы я мог отправить форму, если не загружаю изображение.

<?php

class Pages extends MX_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->library('form_validation');
    }

    public function index() {
        $page_info = $this->get_page_info($this->uri->segment(5));

        $data['page_name'] = $page_info['page_name'];
        $data['page_description'] = $page_info['page_description'];
        $data['page_image'] = $page_info['page_image'];
        $data['page_status'] = $page_info['page_status'];

        if ($page_info['page_image'] == TRUE) {
            $data['main_page_image'] = $this->resize($page_info['page_image']);
        } else {
            $data['main_page_image'] = "";
        }

        $results = $this->get_page_extra_images();

        foreach ($results as $result) {
            $data['popup_images'][] = array(
                'page_extra_image_id' => $result['page_extra_image_id'],
                'image' => $result['page_extra_image'],
                'src' => $this->resize($result['page_extra_image'])
            );
        }

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

        $this->form_validation->set_rules('page_name', 'Page Name', 'required|callback_do_upload');

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

            $this->load->view('template/catalog/page_form_view', $data);

        } else {

            redirect('admin/catalog/pages');

        }

    }

    public function do_upload() {
        $config['upload_path'] = './uploads/';
        $config['allowed_types'] = 'gif|jpg|png';
        $config['max_size'] = '30000';
        $config['max_width']  = '0';
        $config['max_height']  = '0';

        $this->load->library('upload', $config);
        $this->upload->initialize($config);

        if (!$this->upload->do_upload('userfile')) {

            $this->form_validation->set_message('do_upload', $this->upload->display_errors());

            return FALSE;

        } else {

            return TRUE;
        }
    }
}

person Mr. ED    schedule 19.05.2015    source источник


Ответы (1)


Я решил свой вопрос:

При проверке основной формы я добавил isset и && !empty для установленных правил, и теперь он работает.

if (isset($_FILES['userfile']['name']) && !empty($_FILES['userfile']['name'])) {
$this->form_validation->set_rules('page_name', 'Page Name', 'required|callback_do_upload');
} else {
$this->form_validation->set_rules('page_name', 'Page Name', 'required');
}
person Mr. ED    schedule 19.05.2015
comment
Не так связано с проблемой, которая у вас была, но несколько моментов: 1.) нет необходимости в $this->load->library('form_validation'); в методе индекса, поскольку он находится в конструкторе, 2.) избегайте стандартных имен, используемых инфраструктурой CI, таких как do_upload(), 3.) если вы используете $this->upload->initialize($config); нет необходимости в второй параметр в библиотеке загружает $this->load->library('upload');, если вы используете метод initialize() класса или наоборот. - person Tpojka; 19.05.2015