Ошибка приложения Codeigniter 3: вошедший в систему аватар пользователя не обновляется в режиме реального времени - PullRequest
1 голос
/ 07 апреля 2020

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

Приложение имеет пользователя (автора) учетные записи. Существует проблема с отображением фотографии (аватара) вошедшего в систему до уничтожения сеанса, из-за того, что я отображаю аватар из сеанса (заголовок. php просмотр):

<?php if ($this->session->userdata('user_avatar')): ?>
    <img src="<?php echo base_url('assets/img/authors/') . $this->session->userdata('user_avatar'); ?>" class="avatar" />
<?php else: ?>  
    <img src="<?php echo base_url('assets/img/authors/') . 'default-avatar.png' ?>" class="avatar" />
<?php endif ?>

В то время это казалось хорошей идеей, простой и логичной реализацией отображения аватара, пока не появилась проблема с обновлением. Конечно, я должен выйти из системы и войти снова, чтобы увидеть мой аватар в заголовке сайта, как я должен был признать. : (

В модели у меня есть:

public function update_user($avatar, $id) {
        $data = [
            'first_name' => $this->input->post('first_name'),
            'last_name' => $this->input->post('last_name'),
            'email' => $this->input->post('email'),
            'bio' => $this->input->post('bio'),
            'avatar' => $avatar
        ];

        $this->db->where('id', $id);
        return $this->db->update('authors', $data);
    }

В контроллере входа у меня есть:

public function login() {  
    $this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email');
    $this->form_validation->set_rules('password', 'Password', 'required|trim');
    $this->form_validation->set_error_delimiters('<p class="error-message">', '</p>');
    if ($this->form_validation->run()) {
        $email = $this->input->post('email');
        $password = $this->input->post('password');
        $this->load->model('Usermodel');
        $current_user = $this->Usermodel->user_login($email, $password);
        // If we find a user
        if ($current_user) {
            // If the user found is active
            if ($current_user->active == 1) {
                $this->session->set_userdata(
                    array(
                        'user_id' => $current_user->id,
                        'user_email' => $current_user->email,
                        'user_avatar' => $current_user->avatar,
                        'user_first_name' => $current_user->first_name,
                        'user_is_admin' => $current_user->is_admin,
                        'user_active' => $current_user->active,
                        'is_logged_in' => TRUE
                    )
                );
                // After login, display flash message
                $this->session->set_flashdata('user_signin', 'You have signed in');
                //and redirect to the posts page
                redirect('/');  
            } else {
                // If the user found is NOT active
                $this->session->set_flashdata("login_failure_activation", "Your account has not been activated yet.");
                redirect('login'); 
            }
        } else {
            // If we do NOT find a user
            $this->session->set_flashdata("login_failure_incorrect", "Incorrect email or password.");
            redirect('login'); 
        }
    }
    else {
        $this->index();
    }
}

Что было бы легко реализовать исправление ошибки?

1 Ответ

3 голосов
/ 08 апреля 2020

Согласно документации codeigniter session , вы можете использовать что-то вроде этого:

$this->session->set_userdata('user_avatar', $new_user_avatar);

Конечно, вам нужно добавить это в свой код где-то над место, где вы отображаете аватар.

Для $new_user_avatar вам даже понадобится повторно запросить базу данных после обновления аватара, или вы просто обновите сеанс после получения формы после загрузки файла.

Согласно вашему коду:

  1. В контроллере входа вы настраиваете в массиве сеанс.
  2. с update_user в модели вы обновляете свой аватар.
  3. Вы видите в заголовке из сеанса.

Ваш вопрос, как обновить аватар. В тот момент, когда вы используете модель update_user, у вас есть 2 варианта: 1. вы также обновляете сеанс с указанным c аватаром. 2. Вы запускаете эту функцию

$current_user = $this->Usermodel->user_login($email, $password); array['user_avatar'] = $current_user->first_name

Таким образом, окончательное решение будет:

$this->session->set_userdata('user_avatar', $avatar); должно go после $avatar = $_FILES['userfile']['name']; в контроллере (строка 91 ).

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