imagecms/ImageCMS

View on GitHub
application/models/dx_auth/permissions.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

class Permissions Extends CI_Model
{

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

        // Other stuff
        $this->_prefix = $this->config->item('DX_table_prefix');
        $this->_table = $this->_prefix . $this->config->item('DX_permissions_table');
        $this->_roles_table = $this->_prefix . $this->config->item('DX_roles_table');
    }

    /**
     * Serialize an array
     *
     * This function first converts any slashes found in the array to a temporary
     * marker, so when it gets unserialized the slashes will be preserved
     *
     * @access    private
     * @param    array
     * @return    string
     */
    public function _serialize($data) {
        if (is_array($data)) {
            foreach ($data as $key => $val) {
                $data[$key] = str_replace('\\', '{{slash}}', $val);
            }
        } else {
            $data = str_replace('\\', '{{slash}}', $data);
        }

        return serialize($data);
    }

    /**
     * Unserialize
     *
     * This function unserializes a data string, then converts any
     * temporary slash markers back to actual slashes
     *
     * @access    private
     * @param    array
     * @return    string
     */
    public function _unserialize($data) {
        $data = unserialize(stripslashes($data));

        if (is_array($data)) {
            foreach ($data as $key => $val) {
                $data[$key] = str_replace('{{slash}}', '\\', $val);
            }

            return $data;
        }

        return str_replace('{{slash}}', '\\', $data);
    }

    // Get permissions from array of role_id

    public function get_permissions($roles_id) {
        $this->db->where_in('role_id', $roles_id);
        return $this->db->get($this->_table);
    }

    // Get permissions from array of role_id
    // Returning array(roles_id) of array(permissions).
    // Dont be confused,
    // role_id permission data is saved as array in 'data' field in the table.
    // Since we want to get permission from many role_id,
    // hence it will returning array(roles_id) of array(permissions).

    public function get_permissions_data($roles_id, $array_key = 'role_id', $unserialize = TRUE) {
        $result = [];

        $query = $this->get_permissions($roles_id);

        foreach ($query->result() as $row) {
            $result[$row->id] = $row->data;

            if ($unserialize) {
                $result[$row->id] = $this->_unserialize($result[$row->id]);
            }
        }

        return $result;
    }

    // Get permission query

    public function get_permission($role_id) {
        $this->db->where('role_id', $role_id);
        return $this->db->get($this->_table);
    }

    // Get permission data
    // Returning array from 'data' field.

    public function get_permission_data($role_id, $unserialize = TRUE) {
        $result = [];

        $query = $this->get_permission($role_id);

        if ($query->num_rows() > 0) {
            $result = $query->result();
        }
        return $result;
    }

    // Get permission data value
    // Returning value from 'data' field array.

    public function get_permission_value($role_id, $key) {
        $result = NULL;

        $data = $this->get_permission_data($role_id);

        if (!empty($data)) {
            if (array_key_exists($key, $data)) {
                $result = $data[$key];
            }
        }

        return $result;
    }

    // Create permission record

    public function create_permission($role_id, $data) {
        $data['role_id'] = $role_id;
        return $this->db->insert($this->_table, $data);
    }

    // Set permission record

    public function set_permission($role_id, $data, $auto_create = TRUE) {
        if ($auto_create) {
            $this->db->select('1', FALSE);
            $this->db->where('role_id', $role_id);
            $query = $this->db->get($this->_table);

            // Check if role_id exist
            if ($query->num_rows() == 0) {
                // Create permission
                $query = $this->create_permission($role_id, $data);
            } else {
                // Update permission
                $this->db->where('role_id', $role_id);
                $query = $this->db->update($this->_table, $data);
            }
        } else {
            // Update permission
            $this->db->where('role_id', $role_id);
            $query = $this->db->update($this->_table, $data);
        }

            return $query;
    }

    // Set permission data
    // $permission_data is an array that will be set into 'data' field in permissions table

    public function set_permission_data($role_id, $permission_data, $serialize = TRUE) {
        if ($serialize) {
            $permission_data = $this->_serialize($permission_data);
        }

        $data['data'] = $permission_data;

        return $this->set_permission($role_id, $data);
    }

    public function set_permission_value($role_id, $key, $value) {
        // Get role_id permission data first.
        // So the previously set permission array key won't be overwritten with new array with key $key only,
        // when calling set_permission_data later.
        $permission_data = $this->get_permission_data($role_id);

        // Set value in permission data array
        $permission_data[$key] = $value;

        // Set permission data for role_id
        return $this->set_permission_data($role_id, $permission_data);
    }

    public function check_permission($role_id) {
        $this->db->select('1', FALSE);
        $this->db->where('role_id', $role_id);

        return $this->db->get($this->_table);
    }

}