Skip to content
Snippets Groups Projects
Forked from it-lab / grade
Source project has a limited visibility.
Handler.php 2.46 KiB
<?php defined('SYSPATH') or die('No direct script access.');
 
class Controller_Handler extends Controller {
    protected $user, $post, $model;
    private $access;
    
    const ACCESS_ADMIN = 0; 
    const ACCESS_TEACHER = 1; 
    const ACCESS_STUDENT = 2; 
    const ACCESS_USER = 3; 
    const ACCESS_GUEST = 4; 
    const ACCESS_ANYBODY = 5; 

    public function before()
    {
        // Если у нас запрос идет не из AJAX
        if(!$this->request->is_ajax())
        {
            // Перенаправляем на ошибку доступа
            throw HTTP_Exception::factory (403);   
        }
        
        // Обработка POST-данных
        $this->post = Validation::factory(Arr::map('trim', $_POST));
        
        // Если авторизован, получаем данные аккаунта
        if(Account::instance()->isSignedIn())
        {
            $this->user = Account::instance()->getInfoAsArray();
        }
        
        // Если запрос не прошел на проверку доступа
        if(!$this->checkAccessLevel())
        {
            // Перенаправляем на ошибку доступа
            throw HTTP_Exception::factory (403, $this->user['Type']);
        }
    }
    
    protected function setAccessLevel($level)
    {
        $level = (int) $level;
        if($level < self::ACCESS_ADMIN AND $level > self::ACCESS_ANYBODY)
            return;
        else
            $this->access = (int) $level;
    }
    
    protected function checkAccessLevel()
    {
        switch($this->access)
        {
            case self::ACCESS_ADMIN:
                return Account::instance()->isSignedIn() AND $this->user['Type'] == 'admin';
            break;
            
            case self::ACCESS_TEACHER:
                return Account::instance()->isSignedIn() AND $this->user['Type'] == 'teacher';            
            break;
            
            case self::ACCESS_STUDENT:
                return Account::instance()->isSignedIn() AND $this->user['Type'] == 'student';
            break;
            
            case self::ACCESS_USER:
                return Account::instance()->isSignedIn();            
            break;
        
            case self::ACCESS_GUEST:
                return !Account::instance()->isSignedIn();            
            break;
        
            case self::ACCESS_ANYBODY:
                return TRUE;
            break;
        }
    }
}