Codeigniter: интеграция экранов Ion Auth с модальными окнами Bootstrap

Если пользователь нажимает на любую ссылку на странице, я проверяю, вошел ли пользователь в метод контроллера. Если он не вошел в систему, я показываю на экране модальный экран входа в систему.
До этого момента все работает нормально.
Если пользователь вводит неправильное имя пользователя и пароль. Следующая страница отображается как новая страница без какого-либо CSS.
Как мне вернуть результат обратно на модальный экран входа в систему?
view/index.php

$('.index-product img').click(function() {
          var product = $('<div id="modal-productDetail" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"></div>');           
            $.ajax({
              url: "<?php echo site_url('gallery/openProductDetail');?>",
              type: 'POST',
              success: function(msg) {
                product.html(msg);
                product.modal('show');
              }
             });     
      });

Контроллер

function openProductDetail()
    {
        if (!$this->ion_auth->logged_in())
        {
            redirect('auth/login');
        } else {

            $this->load->view('modal/productdetail');
        }
    }

просмотр/login.php

<div class="modal-header">
    <h4 id="myModalLabel">Login To Your Account</h4>
  </div>
  <div id="loginModal" class="modal-body">
    <div class="row">
      <?php echo form_open("auth/login");?>
      <div class="span3">
        <ul class="unstyled" id="emailLogin">
          <li><small class="muted">Login with your email</small></li>
          <?php echo form_open("auth/login");?>
          <li>
            <input name="identity" value="" id="identity" type="text" placeholder="Email Address"/>
            <span class="help-block" id="emailError" style="display:none;"></span>
          </li>
          <li>
            <input name="password" value="" id="password" type="password" placeholder="Password"/>
            <span class="help-block" id="passwordError" style="display:none;"></span>
          </li>
          <li>
            <input style="display:none;" name="remember" value="1" id="remember" type="checkbox">
          </li>
          <li>
            <a class="text-info" id="accountProblem" href="auth/forgot_password">Account problem?</a>
            <input class="loginButton" type="submit"  name="submit" value="Login">
            <?php echo form_close();?>
          </li>
          <li>
            <div id="infoMessage"><?php echo $message;?></div>
          </li>
        </ul>
      </div>
    </div>
  </div>

person Himanshu Yadav    schedule 21.07.2013    source источник


Ответы (1)


Вам нужно изменить метод login() в application/controllers/auth.php. Я думаю, вам нужно добавить к методу login() перед перенаправлением вызова что-то вроде этого:

    $location = '';
    if($this->form_validation->run() == true)
    {
        //check to see if the user is logging in
        //check for "remember me"
        $remember = (bool) $this->input->post('remember');
        if ($this->ion_auth->login($this->input->post('identity'), $this->input->post('password'), $remember))
        {
            //if the login is successful
            //redirect them back to the home page
            $this->session->set_flashdata('message', $this->ion_auth->messages());
            $data = $this->ion_auth->messages();
            $location = '/';
        }
        else
        {
            $this->session->set_flashdata('message', $this->ion_auth->errors());
            $data = $this->ion_auth->errors();
            $location = 'auth/login';
        }
    }
    else
    {
        $this->data['message'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('message');

        $this->data['identity'] = array('name' => 'identity',
            'id' => 'identity',
            'type' => 'text',
            'value' => $this->form_validation->set_value('identity'),
        );
        $this->data['password'] = array('name' => 'password',
            'id' => 'password',
            'type' => 'password',
        );

        $data = $this->data;
    }

    if($this->input->is_ajax_request())
    {
        echo json_encode(array('data' => $data));
    }
    else
    {
        ($location) ? redirect($location, 'refresh') : $this->_render_page('auth/login', $data);
    }

И добавьте код js для обработки ответа от метода login().

person joni jones    schedule 21.07.2013
comment
Разве он не вернет ошибку для любого запроса ajax? Вы можете найти метод login() здесь github.com/benedmunds /CodeIgniter-Ion-Auth/blob/2/контроллеры/ - person Himanshu Yadav; 21.07.2013
comment
Извините, но я не понимаю вашего комментария. - person joni jones; 22.07.2013
comment
Где бы я добавил его в метод login()? - person Himanshu Yadav; 22.07.2013
comment
Что касается меня, я бы расширил контроллер авторизации и изменил метод login(), но это решение требует больше времени. Более простое решение - переместить все редиректы в login() в одно место и добавить проверку $this->input->is_ajax_request(), но нужно изменить логику login(). Пожалуйста, посмотрите мой обновленный код. - person joni jones; 22.07.2013