7

Non riesci a trovare un modo per farlo, probabilmente perché esiste un altro modo per farlo?CodeIgniter Estensione di più controller?

Alcuni dei miei controller estendono AdminLayout e alcuni di essi estendono ModLayout ma ho bisogno anche di queste pagine per estendere un controller di LoggedIn.

class Profile extends AdminLayout, LoggedIn { 

Tuttavia, esaminando non c'è modo di farlo bene. C'è una soluzione?

+0

Almeno la funzionalità 'LoggedIn' dovrebbe essere messo a livello di servizio, non a livello di controller. – Flavius

risposta

25

Supponendo che si sta utilizzando Codeigniter 2, questo può essere fatto mettendo tutti voi classi controller estesi nello stesso file.

In /applicazione/core creare un file chiamato MY_Controller.php (non dimenticare di controllare il prefisso sottoclasse in config.php intorno alla linea 109)

Qui è possibile aggiungere tutti le classi del controllore da estendere. Per esempio;

<?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/ */ 

Quindi quando si creano i controller come di norma, basta scegliere la classe del controller di base da estendere. Esempio;

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'); 
     } 
    } 
} 

o

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'); 
     } 
    } 
} 
Problemi correlati