7

Can't find a way to do this, possibly because there is another way to do this?

Some of my controllers extend AdminLayout and some of them extend ModLayout but I also need these pages to extend a LoggedIn Controller.

class Profile extends AdminLayout, LoggedIn {

However looking into there is no way to do this nicely. Is there a workaround?

1
  • At least your LoggedIn functionality should be put at the service layer, not at the controller layer. Commented Feb 29, 2012 at 8:40

2 Answers 2

25

Assuming that you are using Codeigniter 2, this can be done by putting all you extended controller classes in the same file.

In /application/core create a file called MY_Controller.php (don't forget to check the subclass prefix in config.php around line 109)

In here you can add all you controller classes to extend. For example;

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
 * MY_Controller Class
 *
 *
 * @package Project Name
 * @subpackage  Controllers
 */
class MY_Controller extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->form_validation->set_error_delimiters('<div class="form-error">', '</div>');
    }
}

class LoggedIn extends MY_Controller {

    public function __construct() {
        parent::__construct();
        if (is_logged_in() == FALSE) {
            $this->session->set_userdata('return_to', uri_string());
            $this->session->set_flashdata('message', 'You need to log in.');
            redirect('/home');
        }
    }
}

class AdminLayout extends LoggedIn {

    public function __construct() {
        parent::__construct();
        // do something
    }
}

class ModLayout extends LoggedIn {

    public function __construct() {
        parent::__construct();
        // do something
    }
}

/* End of file  */
/* Location: ./application/core/ */

Then when you create your controllers as per normal, just choose the base controller class to extend. Example;

class Foo extends AdminLayout {

    public function __construct() {
        parent::__construct();
        if (is_logged_in() == FALSE) {
            $this->session->set_userdata('return_to', uri_string());
            $this->session->set_flashdata('message', 'You need to log in.');
            redirect('/home');
        }
    }
}

or

class Bar extends ModLayout {

    public function __construct() {
        parent::__construct();
        if (is_logged_in() == FALSE) {
            $this->session->set_userdata('return_to', uri_string());
            $this->session->set_flashdata('message', 'You need to log in.');
            redirect('/home');
        }
    }
}
Sign up to request clarification or add additional context in comments.

Comments

2

PHP does not support multiple inheritance. You could use Codeigniter helpers or libraries for this.

Have a look at the library examples:

http://codeigniter.com/wiki/Simplelogin

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.