tags:

views:

183

answers:

1

I'm writing a simple app. I need to block user from a page if their credit is < 0.

I have a table "User_profiles" with a "credit" row.

How can I set up a model in conjunction with the controller to send the user to another page if the value of "credit" is 0?

This should be straightforward, but I'm new at the select->where stuff...

It has to be the row of the current user too--I don't know how to traverse arrays very well yet.

Thanks!

+4  A: 

Well, the easiest solution would be to just load a different view...

As for the model, it would look like this:

class UserModel extends Model {
    public function getUserCredit($id) {
        $this->load->database();
        //effectively generates: SELECT `credit` FROM `User_profiles` WHERE `id`=$id
        $query = this->db->select('credit')->where('id',$id)->get('User_profiles');
        //row() executes the query for a single result, returns the credit property
        return $query->row()->credit;
    }
}

Then in the controller:

class Users extends Controller {
    //....
    public function credit() {
        $this->load->model('userModel','users');
        // assuming the session library has been loaded
        $user_id = $this->session->userdata('id');
        $credit = $this->users->getUserCredit($user_id);
        if ($credit == '0') $this->load->view('users/no_credit');
        else $this->load->view('users/credit');
    }
}

That's untested, but it should at least help you get the idea.


  1. When you request the page /users/credit/1, CI will call the Users::credit(1) action.

  2. It then loads UserModel as $this->users

  3. You call $this->users->getUserCredit(1), which translates to UserModel::getUserCredit(1), to store as $credit

  4. The model loads the database.

  5. You tell the db to select('credit') (select the credit column), where('id',1) (where the id = 1), then get('User_profiles') (get matching rows from the User_profiles table). That returns a query, which you store as $query for readability.

  6. getUserCredit returns the credit property of the single-row result of the query

  7. If $credit == 0, you load the view views/users/no_credit.php

  8. Otherwise, you load the view views/users/credit.php (it's conventional to name the views after the actions they represent and put them in a folder corresponding to the controller)

Austin Hyde
+1. This is exactly the kind of thing Controllers are designed to handle.
GSto
I think I'm warmer!Could you explain the cred($user_id) part? I'm WAY new at this.
Kevin Brown
This does help, but I'm still having trouble. :(Sorry if that's a pain, but my understanding is very limited.
Kevin Brown
Just added an explanation. Hope it helps.
Austin Hyde
I think I got it! In the model I set "...where('user_id', $this->session->userdata('id'))"...Does that make sense?Thanks for the quick answer!
Kevin Brown
You could do that, but then you're making the model depend on session data to work. Instead, pass that as the argument. I'll update the code.
Austin Hyde
You'll have to explain! :)
Kevin Brown
What do you need explained? The idea is that the model is independent of the controller -- its only purpose is to communicate to the database. By having it communicate with sessions through `$this->session`, you make your model depend on there being session data. Instead, the controller is made to handle ALL incoming data, and use that to come up with an appropriate response. Therefore, you should leave `UserModel::getUserCredit($id)` to accept an arbitrary database row id, and pass it the id from the session from the controller.
Austin Hyde
Alright, I took the session data out of the controller, like you said, and put it in the controller--is that what I'm supposed to do?I get no errors, and it appears to work!
Kevin Brown
Sounds good. Glad I could help.
Austin Hyde