Seditio Source
Root |
./othercms/croogo-4.0.7/vendor/croogo/croogo/Acl/src/Model/Table/AcosTable.php
<?php

namespace Croogo\Acl\Model\Table;

use
Cake\ORM\TableRegistry;
use
Cake\Utility\Hash;

/**
 * AclAco Model
 *
 * @category Model
 * @package  Croogo.Acl.Model
 * @version  1.0
 * @author   Fahad Ibnay Heylaal <contact@fahad19.com>
 * @license  http://www.opensource.org/licenses/mit-license.php The MIT License
 * @link     http://www.croogo.org
 */
class AcosTable extends \Acl\Model\Table\AcosTable
{

   
/**
     * getChildren
     *
     * @param integer aco id
     */
   
public function getChildren($acoId, $fields = [])
    {
       
$fields = Hash::merge(['id', 'parent_id', 'alias'], $fields);
       
$acos = $this->find('children', ['for' => $acoId])
            ->
find('threaded');

        return
$acos;
    }

   
/**
     * Create ACO tree
     */
   
public function createFromPath($path)
    {
       
$pathE = explode('/', $path);
       
$parent = $current = null;
        foreach (
$pathE as $alias) {
           
$current[] = $alias;
           
$node = $this->node(join('/', $current));
            if (
$node) {
               
$node = $node->toArray();
               
$parent = $node[0];
            } else {
                if (!
$parent) {
                   
$parent = $this->find()
                        ->
where([
                           
$this->aliasField('alias') => 'controllers',
                        ])
                        ->
first();

                    if (!
$parent) {
                       
$rootNode = $this->newEntity([
                           
'alias' => 'controllers',
                        ]);
                       
$parent = $this->save($rootNode);
                    }
                }
               
$aco = $this->newEntity([
                   
'parent_id' => $parent->id,
                   
'alias' => $alias,
                ]);
               
$parent = $this->save($aco);
            }
        }

        return
$parent;
    }

   
/**
     * ACL: add ACO
     *
     * Creates ACOs with permissions for roles.
     *
     * @param string $action possible values: Controller, Controller/action,
     *                                        Plugin/Controller/action
     * @param array $allowRoles Role aliases
     * @return void
     */
   
public function addAco($action, $allowRoles = [])
    {
       
// AROs
       
$roles = [];
        if (
count($allowRoles) > 0) {
           
$roles = TableRegistry::get('Croogo/Users.Roles')->find('list', [
               
'conditions' => [
                   
'Roles.alias IN' => $allowRoles,
                ],
               
'fields' => [
                   
'Roles.id',
                   
'Roles.alias',
                ],
            ])->
toArray();
        }

       
$this->createFromPath($action);
       
$Permission = TableRegistry::get('Croogo/Acl.Permissions');
        foreach (
$roles as $roleId => $roleAlias) {
           
$Permission->allow(['model' => 'Roles', 'foreign_key' => $roleId], $action);
        }
    }

   
/**
     * ACL: remove ACO
     *
     * Removes ACOs and their Permissions
     *
     * @param string $action possible values: ControllerName, ControllerName/method_name
     * @return void
     */
   
public function removeAco($action)
    {
       
$acoNodes = $this->node($action);
        if (
$acoNodes) {
           
$acoNode = $acoNodes->first();
           
$this->delete($acoNode);
        }
    }

   
/**
     * Get valid permission roots
     *
     * @return array Array of valid permission roots
     */
   
public function getPermissionRoots()
    {
       
$roots = $this->find('all', [
           
'fields' => ['id', 'alias'],
           
'conditions' => [
               
'parent_id IS' => null,
               
'alias IN' => ['controllers', 'api'],
            ],
        ])->
toArray();

       
$apiRoot = -1;
        foreach (
$roots as $i => &$root) {
            if (
$root->alias === 'api') {
               
$apiRoot = $root->id;
               
$apiIndex = $i;
            }
           
$root->title = ucfirst($root->alias);
        }
        if (isset(
$apiIndex)) {
            unset(
$roots[$apiIndex]);
        }

       
$versionRoots = $this->find('all', [
           
'fields' => ['id', 'alias'],
           
'conditions' => [
               
'parent_id' => $apiRoot,
            ],
        ])->
toArray();

       
$apiCount = count($versionRoots);

       
$api = __d('croogo', 'API');
        foreach (
$versionRoots as &$versionRoot) {
           
$alias = strtolower(str_replace('_', '.', $versionRoot->alias));
           
$versionRoot->alias = $alias;
           
$versionRoot->title = $apiCount == 1 ? $api : $api . ' ' . $alias;
        }

        return
array_merge($roots, $versionRoots);
    }
}