Seditio Source
Root |
./othercms/croogo-4.0.7/vendor/croogo/croogo/Menus/src/Controller/Component/MenuComponent.php
<?php

namespace Croogo\Menus\Controller\Component;

use
Cake\Controller\Component;
use
Cake\Core\Configure;
use
Cake\Event\Event;
use
Cake\ORM\TableRegistry;
use
Cake\Utility\Hash;
use
Croogo\Core\Controller\Component\CroogoComponent;
use
Croogo\Extensions\CroogoTheme;

/**
 * Menus Component
 *
 * @property CroogoComponent Croogo
 * @package Croogo.Menus.Controller.Component
 */
class MenuComponent extends Component
{

   
/**
     * Other components used by this component
     *
     * @var array
     * @access public
     */
   
public $components = [
       
'Croogo.Croogo',
    ];

   
/**
     * Menus for layout
     *
     * @var string
     * @access public
     */
   
public $menusForLayout = [];

   
/**
     * Startup
     *
     * @param object $event instance of controller
     * @return void
     */
   
public function startup(Event $event)
    {
       
$this->controller = $event->getSubject();
        if (isset(
$this->controller->Link)) {
           
$this->Links = $this->controller->Links;
        } else {
           
$this->Links = TableRegistry::get('Croogo/Menus.Links');
        }

       
$controller = $event->getSubject();
        if ((
$controller->request->getParam('prefix') !== 'admin') && !$controller->request->getParam('requested')) {
           
$this->menus();
        } else {
           
$this->_adminData();
        }
    }

    protected function
_adminData()
    {
       
// menus
       
$menus = $this->Links->Menus
           
->find('all')
            ->
order([
               
$this->Links->Menus->aliasField('id') => 'ASC',
            ]);
       
$this->controller->set('menus_for_admin_layout', $menus);
    }

   
/**
     * beforeRender
     *
     * @param Event $event
     */
   
public function beforeRender(Event $event)
    {
       
$event->getSubject()->set('menusForLayout', $this->menusForLayout);
    }

   
/**
     * Menus
     *
     * Menus will be available in this variable in views: $menusForLayout
     *
     * @return void
     */
   
public function menus()
    {
       
$menus = ['main'];

        if (
Configure::read('Site.theme')) {
           
$themeData = (new CroogoTheme)->getData(Configure::read('Site.theme'));
            if (isset(
$themeData['menus']) && is_array($themeData['menus'])) {
               
$menus = Hash::merge($menus, $themeData['menus']);
            }
        }

       
$menus = Hash::merge($menus, array_keys($this->controller->BlocksHook->blocksData['menus']));

       
$roleId = $this->controller->Croogo->roleId();
       
$status = $this->Links->status();
        foreach (
$menus as $menuAlias) {
           
$menu = $this->Links->Menus->find('all', [
               
'cache' => [
                   
'name' => $menuAlias,
                   
'config' => 'croogo_menus',
                ],
            ])->
where([
               
'Menus.status IN' => $status,
               
'Menus.alias' => $menuAlias,
               
'Menus.link_count >' => 0,
            ])->
first();
            if (
$menu) {
               
$this->menusForLayout[$menuAlias] = $menu;
               
$links = $this->Links->find('threaded', [
                   
'cache' => [
                       
'name' => $menu->alias . '_links_' . $roleId,
                       
'config' => 'croogo_menus',
                    ]
                ])->
find('byAccess', ['roleId' => $roleId])->where([
                   
'Links.menu_id' => $menu->id,
                   
'Links.status IN' => $status,
                ])->
order([
                   
'Links.lft' => 'ASC',
                ]);
               
$this->menusForLayout[$menuAlias]['threaded'] = $links;
            }
        }
    }
}