skip to Main Content

I’ve added a constructor in a class to check if some user is logged in.

public function __construct() {
    parent::__construct();
    $this->load->library('form_validation');
    $this->load->library('encryption');
    if (!$this->session->userdata('id') || $this->session->userdata('role') != 'CUSTOMER') {
        redirect('account/login');
    }
}

Here’s the ajax

        $.ajax({
            type:'POST',
            url:'<?php echo base_url("cart/addToCart"); ?>',
            dataType: 'text',
            data:{'id':val},
            success:function(data) {
              if (data != 'added') {
                alert('Opps! something went wrong, please try again');
              }
            }
        });

but if I try to call this request without session, it’s not redirecting to login page but giving the whole login page code which I can see in network tab

3

Answers


  1. Add return to your redirect:

    return redirect('account/login');
    
    Login or Signup to reply.
  2. I think the problem arises due to ajax request not being completed. When the redirection happens it continues to treat it as ajax request, hence it shows the new page in the network tab.
    To solve this you’ll have to redirect it to any other function and send a response from it but as you are checking the session in constructor, we’ll have to check a condition for that particular function(method).

    AJAX

    $.ajax({
        type:'POST',
        url:'<?php echo base_url("cart/addToCart/some_new_function"); ?>',  // make a new function {some_new_function}
        dataType: 'json',  // expects json to be returned
        data:{'id':val},
        success:function(data) {
            if (data == 1) { // fail
                window.location.href = "<?php echo base_url('account/login'); ?>"; // your-location-&-logic
            }else{
                // whatever-you-want-to-do
            }
        }
    });
    

    Controller

    public function __construct() {
        parent::__construct();
        $this->load->library('form_validation');
        $this->load->library('encryption');
    
        $method = $this->router->fetch_method(); // get method name
    
        if($method !== 'some_new_function'){     
            if (!$this->session->userdata('id') || $this->session->userdata('role') != 'CUSTOMER') {
                redirect('account/login');
            }
        }
    }
    
    function some_new_function(){  // control will come here from ajax after construct
        //perform session check here
         if (!$this->session->userdata('id') || $this->session->userdata('role') != 'CUSTOMER') {
            echo 0; // fail
        }else{
            echo 1; // success // perform-your-task-here
        }
    }
    

    Hope this helps you.

    Login or Signup to reply.
  3. As I know, Ajax simply return a response text. It will not proccess the request

    You can try something like following

    AJAX

    $.ajax({
                type:'POST',
                url:'<?php echo base_url("cart/addToCart"); ?>',
                dataType: 'text',
                data:{'id':val, 'type':'ajax'}, //say this request coming from a ajax
                success:function(data) {
                  if (data != 'added') {
                     if(data == "not_log_in"){ //checking whether login or not
                           window.location = "login_page";
                     }else{
                           alert('Opps! something went wrong, please try again');
                     }
                  }
                }
            });
    

    Controller

    if (!$this->session->userdata('id') || $this->session->userdata('role') != 'CUSTOMER') {
           if(isset($_POST["type"])){ // checking whether request coming from ajax or not
               echo "not_log_in"; // if it is ajax, simply show an error massage
           }else{
                redirect('account/login'); //otherwise redirect
           }
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search