MVC компонент

Меню

Компонент меню входит в состав 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 определяет порядок элементов в возвращаемом массиве. Также могут быть указаны произвольные свойства. Эти свойства напрямую войдут в исходящий массив. Примером могут быть свойства отображения элементов меню, или ограничение по ролям

Рекомендуется вызывать меню в шаблоне на месте пробежки по элементам меню. В этом случае все активные страницы будут обозначены, т.к. на уровне логики - программа ещё не знает своё дальнейшее поведение

Пример отображения меню через bootstrap

<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