Controller.php 4.33 KB
<?php
/**
 *
 * @author Adhidarma <adhisimon@gmail.com>
 */
abstract class Controller extends BaseF3nr {
    private $_auto_render = true;
    protected $db;

    protected function getModel() {
        return null;
    }

    function __construct() {
        parent::__construct();

        if (empty($this->getPageTitle())) {
            $this->setPageTitle('');
        }
    }

    /**
     * F3 beforeRoute hook.
     */
    function beforeRoute($f3) {
        $this->f3->set('ACTIVE_VISITOR_IS_ADMIN', false);
        $this->f3->set('ACTIVE_VISITOR_IS_OPERATOR', false);

        $f3->set('HAS_LOGIN', $this->hasLogin());

        if ($this->hasLogin()) {
            $user_id = $f3->get('SESSION.user_id');

            $user_model = new UserModel();
            $user = $user_model->getById($user_id);

            $user_role_model = new UserRoleModel();
            $user['role_titles'] = $user_role_model->getRoleTitlesByUserId($user_id);

            $f3->set('ACTIVE_VISITOR', $user);

            $this->updateSession($user);
        }
    }

    /**
     * F3 afterRoute hook.
     */
    function afterRoute($f3) {
        if ($this->isAutoRender()) {
            $this->render($f3);
        }
    }

    /**
     * Enable auto render.
     */
    protected function enableAutoRender() {
        $this->_auto_render = true;
    }

    /**
     * Disable auto render.
     */
    protected function disableAutoRender() {
        $this->_auto_render = false;
    }

    /**
     * Detect is auto render enable or disable.
     */
    protected function isAutoRender() {
        return $this->_auto_render;
    }

    /**
     * Render the output using template and view file.
     */
    protected function render($f3) {
        $template = new Template();

        if (!empty($f3->get('TEMPLATE_FILE'))) {
            echo $template->render($f3->get('TEMPLATE_FILE'));

            $f3->clear('SESSION.alerts');
        } else if ($f3->exists('VIEW_FILE')) {
            echo $template->render($f3->get('VIEW_FILE'));
        }
    }


    /**
     * Set view file to be used by an action.
     */
    protected function setViewFile($file) {
        $this->f3->set('VIEW_FILE', $file);
    }

    protected function setTemplateFile($file) {
        $this->f3->set('TEMPLATE_FILE', $file);
    }

    /**
     * Set page title.
     */
    protected function setPageTitle($title) {
        $this->f3->set('PAGE_TITLE', $title);
    }

    /**
     * Get page title.
     */
    protected function getPageTitle() {
        return $this->f3->get('PAGE_TITLE');
    }

    public function install() {
        $model = $this->getModel();
        if (!$model) {
            return;
        }
        $model->install();
        $this->disableAutoRender();
    }

    protected function hasLogin() {
        return $this->f3->exists('SESSION.user_id');
    }

    protected function needLogin() {
        if (!$this->hasLogin()) {
            $this->f3->reroute('/login');
        }
    }

    protected function needOneOfRoleTitles($role_titles) {
        $this->needLogin();

        if (!is_array($role_titles)) {
            $role_titles = array($role_titles);
        }

        foreach ($role_titles as $role_title) {
            if ($this->isVisitorHasRole($role_title)) {
                return true;
            }
        }

        $this->f3->reroute('/errors/forbidden');
    }

    protected function needOneOfRoles($role_titles) {
        $this->needOneOfRoleTitles($role_titles);
    }

    protected function updateSession($user = null) {
        $user_model = new UserModel();
        if (!$user) {
            $user = $user_model->getById($user_id);
        }

        $this->f3->set('SESSION.user_id', $user['id']);
        $this->f3->set('SESSION.last_seen', time());

        $user_role_model = new UserRoleModel();
        $user['role_titles'] = $user_role_model->getRoleTitlesByUserId($user['id']);

        $this->f3->set('ACTIVE_VISITOR', $user);

        $this->f3->set('ACTIVE_VISITOR_IS_ADMIN', in_array('admin', $user['role_titles']));
        $this->f3->set('ACTIVE_VISITOR_IS_OPERATOR', in_array('operator', $user['role_titles']));
    }

    protected function isVisitorHasRole($role_title) {
        if (!is_array($this->f3->get('ACTIVE_VISITOR.role_titles'))) {
            return false;
        }

        return (in_array($role_title, $this->f3->get('ACTIVE_VISITOR.role_titles')));
    }
}