Вам необходимо создать базовые контроллеры, расширяющие CI_Controller. Затем все ваши контроллеры расширяют определенный базовый контроллер, который вы создали, в зависимости от того, что нужно сделать во всех случаях, когда этот контроллер вызывается.
В application/core
создайте файл с именем MY_controller.php
(префикс можно изменить в конфигурации):
class MY_Controller extends CI_Controller {
function __construct()
{
parent::__construct();
/* Widgets are only prepared -- they will be fetched and rendered once layout->render is called.
This saves the overhead of reading the files on requests where layout isn't rendered.
*/
$this->layout->prepare_widget( "widgets/navigation", "navigation_widget" );
$this->layout->prepare_widget( "widgets/footer", "footer_widget" );
$this->layout->prepare_widget( "widgets/twitter", "twitter_widget" );
}
}
class Public_Controller extends MY_Controller {
function __construct()
{
parent::__construct();
}
}
class Admin_Controller extends MY_Controller {
function __construct()
{
parent::__construct();
if( !$this->user->has_permissions( PERMISSION_ADMIN ) )
{
redirect( base_url(), "location", 303 );
die();
}
}
}
class Member_Controller extends MY_Controller {
function __construct()
{
parent::__construct();
if( !$this->user->has_permissions( PERMISSION_REGISTERED ) )
{
redirect( base_url(), "location", 303 );
die();
}
}
}
Как видите, все субконтроллеры имеют виджеты автоматически, потому что они расширяют public, admin или member. Субконтроллер, расширяющий контроллер администратора, автоматически проверяет разрешения, поэтому вам не нужно делать это снова. Вы можете применить эту концепцию к своему приложению.
Субконтроллер: (помещен в обычный application/controllers
)
class Articles extends Member_controller {
...
}
Будет автоматически гарантировать, что пользователь вошел в систему, и виджеты подготовлены, ничего не делая, потому что родительский класс родительского класса уже подготовил их. Все, что вам нужно сделать в статьях, это вызвать $this->layout->render
, если в конце логика требует рендеринга макета.