Система разрешений пользователей с CodeIgniter

Я перерабатываю свою систему, используя CodeIgniter, который я новичок, и я пытаюсь загрузить функцию из моего контроллера, которая будет проверять, есть ли у пользователя разрешение на просмотр / доступ к этой функции.

Я использую TEXT в моей БД со всеми разрешениями, которые есть у каждого уровня пользователя, а затем сохранить разрешения в сеансе var, с которым работает в моем контроллере.

В моем контроллере Users.php:

public function UserHasPermissions($permission){
checkSession($this);

$arrayPermissions = explode($this->sessions->userdata('session_permissions'));
if(in_array($permission, $arrayPermissions)){
return true;
} else {
return false;
}
}

По-моему home.php я делаю следующую попытку:

$this->load->view('commons/header');
if($this->Users->UserHasPermissions('ADD_MEETING')){
echo 'content';
}
$this->load->view('commons/footer');

И это возвращает эту ошибку:

An uncaught Exception was encountered
Type: Error

Message: Call to a member function UserHasPermissions() on null

Filename: /var/www/html/DF_CHECKER_CI/application/views/home.php

Line Number: 4

Я взглянул на эти документы, но ничто не сильно помогло мне.

https://www.codeigniter.com/user_guide/general/views.html#adding-dynamic-data-to-the-view

Как вызвать функцию контроллера codeigniter из вида

0

Решение

Вы нарушаете MVC, пытаясь вызвать контроллер из своего представления, вместо этого вы должны определить, какие разрешения имеет пользователь в контроллере, прежде чем отображать ваше представление, либо в методе, который отображает представление, либо в конструкторе вашего класса. С учетом вышесказанного вы не можете вызвать контроллер из представления в CI, если не ссылаетесь на экземпляр singleton CI:

$ci = &get_instance();

$this->load->view('commons/header');
if($ci->UserHasPermissions('ADD_MEETING')){
echo 'content';
}
$this->load->view('commons/footer')

Это приведет к ошибке, однако:

объект класса Users не может быть преобразован в строку

Вот один из способов:

class Users extends CI_Controller{ //or whatever you're doing here

public function __construct()
{
// you can check all permissions here if you'd like
}
/**or**/
/**whatever is responsible for calling your view**/
public function index()
{
$data['has_permission'] = $this->userHasPermissions('ADD_MEETING');
$this->load->view('home',$data);
}

private function userHasPermissions($permission)
{
return in_array($permission, $this->sessions>userdata('session_permissions'));
}
}

И по вашему мнению:

<?if($has_permission):?>
<--show content-->
<?endif;?>
1

Другие решения

  1. вы не должны загружать представления в представлениях, если вы не используете шаблонизатор, такой как smarty
  2. вы не можете получить доступ к методу контроллера, как к методу библиотеки / модели (я думаю, что вы сможете, если вы используете HMVC, но вы явно не)

Вы можете сделать модель, или помощника, или библиотеку. Хотя модель / помощник подойдет лучше. Это относительно просто, особенно если вы использовали КИ в любом качестве до того, как вы это сделали.

Единственное, на что следует обратить внимание, это то, что если вы используете помощника, вы должны обращаться к экземпляру CI, как это делается в функции: $CI = &get_instance(); и тогда вы можете использовать его как $CI->load->database(); $CI->db->get('users')->result(); или что угодно.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector