Кнопка входа в систему 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/

Другие вопросы по тегам