Кнопка входа в систему Codeigniter
Я делаю первый сайт, используя codeigniter Framework. Я сделал пользовательский класс с методом, чтобы проверить, вошел ли пользователь, например:
public function is_logged_in()
{
$this->load->library('session');
$loggedin = $this->session->userdata('logged_in');
if ($loggedin)
{
return TRUE;
}
else
{
return FALSE;
}
}
Теперь у меня есть меню в заголовке с кнопкой, которая должна меняться в зависимости от статуса входа. Если пользователь не вошел в систему, я хочу показать кнопку входа, в противном случае кнопку выхода (с правильными ссылками, конечно). Я думаю, что в MVC должен быть только HTML и только PHP, где это необходимо. Где я должен поставить чек, чтобы увидеть, показываю ли я кнопку входа или выхода из системы, должен ли я делать это на каждом контроллере, где я вызываю заголовок, например:
$data['menubutton']= $this->getbutton();//something to get the button
$this->load->view('templates/header', $data);
Если бы я сделал это таким образом, мне нужно добавить его к каждому контроллеру, должен ли я просто выполнить проверку в представлении, или есть другое простое решение.
Короче говоря, каков наилучший способ / позиция для создания правильной кнопки меню в зависимости от статуса входа? (кнопка входа или выхода)
3 ответа
Решения, приведенные там, где мне не нравится, поэтому я сам их создал, с помощью этой темы
Я создал библиотеку как
<?php defined('BASEPATH') OR exit('No direct script access allowed');
class Auth
{
public function get_menu($data)
{
$CI =& get_instance();
if ($this->is_logged_in())
{
return ($CI->load->view('templates/headerlogged', $data));
}
else
{
return ($CI->load->view('templates/header', $data));
}
}
public function is_logged_in()
{
$CI =& get_instance();
$CI->load->library('session');
$loggedin = $CI->session->userdata('logged_in');
if ($loggedin)
{
return TRUE;
}
else
{
return FALSE;
}
}
}
В моем /application/config/autoload.php я добавляю
$autoload['libraries'] = array('auth',);
чтобы я всегда мог использовать код в моих контроллерах, не загружая их вручную
В моих контроллерах теперь я могу использовать
$this->auth->get_menu($data);
вместо
this->load->view('templates/header', $data);
и я всегда получаю правильное меню.
Я знаю, что имя auth странное, но вы можете изменить его по своему вкусу.
Вкратце Ответ: Вы можете сделать это на странице просмотра.
Более продвинутым способом: Вы можете использовать два разных макета для гостевого пользователя и вошедшего в систему пользователя. Между ними может быть гораздо больше различий, таких как просмотр информации о пользователе (имя пользователя, приветствие, ссылка на профиль и т. Д.).
NB. Выяснение, вошел ли пользователь в систему или нет, не является частью просмотра. Но представление может действовать на одной проверке состояния
Вы можете расширить свой контроллер, поместив файл в приложение / ядро с именем MY_Controller.php
<?php
class MY_Controller extends CI_Controller {
public function __construct()
{
parent::__construct();
// Perform the login check here
}
}
?>
В ваших обычных контроллерах вы бы расширили MY_Controller вместо CI_Controller
class User extends MY_Controller { }
Поскольку теперь вы расширяете My_Controller вместо CI_Controller, вы можете поместить код в MY_Controller __construct()
метод для выполнения при каждой загрузке контроллера, это идеальное место для размещения таких вещей, как проверки входа в систему, которые вы выполняете на каждом контроллере, но не хотите дублировать код.
Если бы я реализовывал это, у меня просто был бы объект пользователя или логическое значение, которое я мог бы проверить в своих представлениях, и просто сделать оператор if, чтобы отобразить правильную кнопку. Я хотел бы сохранить код кнопки в представлениях.
Более подробную информацию о расширении основных классов можно найти в документации CodeIgniters: http://ellislab.com/codeigniter/user-guide/general/core_classes.html
Более подробное описание использования расширения основного контроллера можно найти здесь: http://www.gregaker.net/2011/mar/18/extending-codeigniters-controller/