Как я могу хранить ошибки валидации, связанные с загрузкой изображений, как fla sh массажи в этом приложении Codeigniter 3? - PullRequest
1 голос
/ 06 февраля 2020

Я работаю над базовым c приложением для блога с Codeigniter 3.1.8 и Bootstrap 4 .

посты, конечно же, имеют основные изображения. Существует изображение по умолчанию , если пользователь не загрузил ни одного изображения.

Существуют ограничения на файлы изображений, которые пользователь может загрузить:

$config['upload_path'] = './assets/img/posts';
$config['allowed_types'] = 'jpg|jpeg|png';
$config['max_size'] = '2048';

Мне удалось отобразите сообщения об ошибках загрузки, которые соответствуют конфигурации выше (для вашего любопытства и / или использования код здесь ).

Однако для метода update(), поскольку в нем задействованы перенаправления, все сообщения проверки формы сохраняются как «fla sh messages».

public function update() {
    // Form data validation rules
    $this->form_validation->set_rules('title', 'Title', 'required',  array('required' => 'The %s field can not be empty'));
    $this->form_validation->set_rules('desc', 'Short description', 'required',  array('required' => 'The %s field can not be empty'));
    $this->form_validation->set_rules('body', 'Body', 'required',  array('required' => 'The %s field can not be empty'));
    $this->form_validation->set_error_delimiters('<p class="error-message">', '</p>');

    $id = $this->input->post('id');

    // Update slug (from title)
    if ($this->form_validation->run()) {
        $slug = url_title(convert_accented_characters($this->input->post('title')), 'dash', TRUE);
        $slugcount = $this->Posts_model->slug_count($slug, $id);
        if ($slugcount > 0) {
            $slug = $slug."-".$slugcount;
        }
    } else {
        $slug = $this->input->post('slug');
    }

// Upload image
    $config['upload_path'] = './assets/img/posts';
    $config['allowed_types'] = 'jpg|jpeg|png';
    $config['max_size'] = '2048';

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

    if (isset($_FILES['userfile']['name']) && $_FILES['userfile']['name'] != null) {
        // Use name field in do_upload method
        if (!$this->upload->do_upload('userfile')) {

            $errors = array('error' => $this->upload->display_errors());

            // Dysplay upload validation errors 
            // only if a file is uploaded and there are errors
            if (empty($_FILES['userfile']['name'])) {
                $errors = [];
            }

            if (!empty($errors)) {
                $data['upload_errors'] = $errors;
            }

        } else {
            $data = $this->upload->data();
            $post_image = $data[ 'raw_name'].$data[ 'file_ext'];
        }
    }
    else {
        $post_image = $this->input->post('postimage');
    }

    if ($this->form_validation->run() && empty($errors)) {
        $this->Posts_model->update_post($id, $post_image, $slug);
        $this->session->set_flashdata('post_updated', 'Your post has been updated');
        redirect('/' . $slug);
    } else {
        $this->form_validation->run();
        $this->session->set_flashdata('errors', validation_errors());
        // this line was added later
        // but the bug persists 
        $this->session->set_flashdata('upload_errors', $errors);
        redirect('/dashboard/posts/edit/' . $slug);
    }
}

В представлении edit-post.php у меня есть:

<input type="hidden" name="postimage" id="postimage" value="<?php echo $post->post_image; ?>">
<label for="postimage">Upload an image</label>
<div class="form-group">
    <input type="file" name="userfile" id="postimage" size="20">
    <?php if ($this->session->flashdata('upload_errors')) { ?>
        <div class="error-messages">
            <?php if(isset($upload_errors)){
                 foreach ($upload_errors as $upload_error) {
                     echo $upload_error;
                 }
            }?>
        </div>
   <?php } ?>
</div>

Мне не удалось добавить сообщения об ошибках загрузки изображения как "fla sh messages".

Как я могу это сделать?

Ответы [ 5 ]

2 голосов
/ 13 февраля 2020

В правке-посте. php Вы должны изменить:

<?php if ($this->session->flashdata('upload_errors')) { ?>

С:

<?php if ($upload_errors = $this->session->flashdata('upload_errors')) { ?>
1 голос
/ 11 февраля 2020

Я делаю то же самое (загружаю ошибки go в элемент flashdata). Вот как это работает для меня:

(я пропущу конфигурацию загрузки ... но для этого примера она хранится в массиве с удобным названием $config)

In мой контроллер:

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

if (!$this->upload->do_upload('userfile'))
{
   $this->session->set_flashdata('message', "An error ocurred: ".$this->upload->display_errors());
   $this->session->set_flashdata('alert_class', "alert-danger");
}

else
{
   $this->session->set_flashdata('message', "Upload successful");
   $this->session->set_flashdata('alert_class', "alert-success");

}

На мой взгляд (все мои взгляды содержат этот код)

<?php
if (null !== $this->session->flashdata('message'))
{ ?>
    <div class="alert <?php echo $this->session->flashdata('alert_class'); ?> text-center mb-2"><i class="fas fa-exclamation-triangle fa-fw"></i> <?php echo $this->session->flashdata('message'); ?></div>
<?php 
}
?>

Таким образом, если я не установите элемент flashdata с именем message, при котором в представлении даже не отображается DIV, где отображается предупреждение. Если, с другой стороны, я установил элемент message, предупреждение col-12 будет отображаться с сообщением, которое я определил, и стилизовано с нужным мне классом предупреждения (успех, предупреждение, опасность, информация и т. Д. c)

Это будет работать только для ошибок проверки загрузки. В вашей многочастной форме у вас также могут быть регулярные ошибки проверки, которые вы должны проверять отдельно. Вы можете сделать то же самое с элементом fla sh:

$this->session->set_flashdata('message', validation_errors());

Я использую то же имя элемента (message), потому что я остановлюсь на первой ошибке, поэтому не будет ошибки загрузки и ошибка проверки формы на том же дисплее.

1 голос
/ 07 февраля 2020

Попробуйте:

$this->session->set_flashdata('errors', validation_errors());
$this->session->set_flashdata('upload_errors', $errors);

Или вы можете создать $errorArray из validation_errors() и $errors.

0 голосов
/ 09 февраля 2020

Попробуйте это. Добавьте это в конструктор

$this->session->keep_flashdata('errors');

и удалите данные сеанса после их использования в представлении

 $this->session->unset_userdata('errors');
0 голосов
/ 07 февраля 2020

Это должно работать.

public function update() 
{
    // Form data validation rules
    $this->form_validation->set_rules('title', 'Title', 'required',  array('required' => 'The %s field can not be empty'));
    $this->form_validation->set_rules('desc', 'Short description', 'required',  array('required' => 'The %s field can not be empty'));
    $this->form_validation->set_rules('body', 'Body', 'required',  array('required' => 'The %s field can not be empty'));
    $this->form_validation->set_error_delimiters('<p class="error-message">', '</p>');

    $id = $this->input->post('id');

    $form_is_valid = $this->form_validation->run()
    $errors = [];

    // Update slug (from title)
    if ($form_is_valid) {
        $slug = url_title(convert_accented_characters($this->input->post('title')), 'dash', TRUE);
        $slugcount = $this->Posts_model->slug_count($slug, $id);
        if ($slugcount > 0) {
            $slug = $slug."-".$slugcount;
        }
    } else {
        $slug = $this->input->post('slug');
        $errors[] = validation_errors();
    }

// Upload image
    $config['upload_path'] = './assets/img/posts';
    $config['allowed_types'] = 'jpg|jpeg|png';
    $config['max_size'] = '2048';

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

    if (isset($_FILES['userfile']['name']) && $_FILES['userfile']['name'] != null) {
        // Use name field in do_upload method
        if (!$this->upload->do_upload('userfile')) {

            $upload_errors = array('error' => $this->upload->display_errors());

            // Dysplay upload validation errors 
            // only if a file is uploaded and there are errors
            if (empty($_FILES['userfile']['name'])) {
                $upload_errors = [];
            }

            if (!empty($upload_errors)) {
                $data['upload_errors'] = $upload_errors;
                $errors[] = $upload_errors;
            }

        } else {
            $data = $this->upload->data();
            $post_image = $data[ 'raw_name'].$data[ 'file_ext'];
        }
    }
    else {
        $post_image = $this->input->post('postimage');
    }

    if (empty($errors)) {
        $this->Posts_model->update_post($id, $post_image, $slug);
        $this->session->set_flashdata('post_updated', 'Your post has been updated');
        redirect('/' . $slug);
    } else {
        $this->session->set_flashdata('errors', $errors);
        redirect('/dashboard/posts/edit/' . $slug);
    }
}

$this->form_vlaidation->run() вызывается только один раз. Ошибки сохраняются как (проверка формы и загрузка) в одном массиве. Сообщение обновляется, только если $errors пусто.

Вы должны подумать, как можно улучшить код дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...