Компонент меню входит в состав mvc компонента и автоматически формирует массив вложеных папок.
c\mvc::getMenu(__DIR__,$additionMenu=null,$level=1);
Команда возвращает массив полученных разделов относительно текущей директории. В качестве $addition_menu можно указать произвольный массив, который будет дополнительно смешан с основным меню. Таким образом можно добавлять произвольные элементы меню. В качестве параметра $level передается число уровней меню.
Возвращается Массив вида
array(
'name'=>'Название страницы',
'link'=>'link-to-page-from-basedir',
'href'=>'link-to-page-from-basedir',
'__DIR__'=>'__DIR__-of-file',
'active'=>true,
'submenu'=>array(...submenu if it multilevel menu...)
)
Соответственно, команда ищет все открытые папки (без префикса _ в начале), в которых существует файл index.php или config.php (с приоритетом config.php), в которых в начале файла указана аннотации
<?php
//name: Название файла
//position: 5
//custom_property: some custom property value
код
Рекомендуется отделять структурные элементы от кода при помощи пустой строки. Разделителем является двоеточие ":. Чтобы элемент попал в меню - в нем обязательно должен быть указан признак названия name
Свойство position определяет порядок элементов в возвращаемом массиве. Также могут быть указаны произвольные свойства. Эти свойства напрямую войдут в исходящий массив. Примером могут быть свойства отображения элементов меню, или ограничение по ролям
Рекомендуется вызывать меню в шаблоне на месте пробежки по элементам меню. В этом случае все активные страницы будут обозначены, т.к. на уровне логики - программа ещё не знает своё дальнейшее поведение
<nav class="navbar navbar-inverse navbar-static-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#core-navbar" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">Brand name</a>
</div>
<div class="collapse navbar-collapse" id="core-navbar">
<ul class="nav navbar-nav">
<?foreach($mainmenu as $item){?>
<?if ($item['rights'] && !$rights[$item['rights']]) continue;?>
<li <?if ($item['active']){?>class="active"<? }?>><a href="<?=$item['link']?>"><?=$item['name']?></a></li>
<? }?>
</ul>
</div><!-- /.navbar-collapse -->
</div>
</nav>
В примере указаны вариации с выводом меню относительно ролей. При наличии свойства роли - происходит сравнение с существующей ролью
С помощью разных свойств можно также разделять одно меню от другого при помощи конструкции внутри цикла
if ($item['menu']!='left')continue; // for left menu
if ($item['menu']!='top')continue; // for top menu
помимо получения параметров вложеных файлов - можно завязаться на аннотации в самом файле. Для чтения аннотаций в одномерный массив - служит функция
c\mvc::getFileProp($__FILE__);
Функция возвращает все аннотации в указаном файле.
Таким образом можно легко сочетать проверку прав на доступ к разделу как в меню, так и в самом файле универсально. Можно управлять Title страницы через аннотации и завязывать любые конфигурационные параметры, чтобы каждый кто захочет ими управлять не лез в дебри кода
$filedata=c\mvc::getFileProp(__FILE__);
if (isset($filedata['rights']) && !$rights[$filedata['rights']])c\error::addError('Нет прав')->redirect('..',__DIR__);
c\mvc::addTitle($filedata['name']);
Создано при помощи сервиса Core CMS