Начиная с версии 5.4 в системе возможно использование класса навигации, методы которого повторяют уже имеющиеся функции.
Получить доступ к объекту:
<?php $nav = $nc_core->nav; // или $nav = nc_nav::get_instance(); ?>
В настоящее время класс не имеет аналогов некоторым функциям, которые формируют: навигацию по сайтам (список сайтов), постраничную навигацию и навигацию по инфоблокам.
Класс навигации и его функции можно использовать в дополнительных шаблонах. Функционал работы с дополнительными шаблонами описан в соответствующем разделе.
аналог nc_browse_sub()
Примеры использования:
<?php // корневые разделы $menu = $nav->get_sub(); // подразделы раздела ID = 7 $menu = $nav->get_sub(7); // Альтернативный способ $menu = $nav->sub(7)->get(); ?>
Пример вывода меню:
<ul class='main-menu'> <? foreach ($nc_core->nav->get_sub() as $sd): ?> <? if ($sd->active): ?> <li><b><?= $sd->name ?></b></li> <? else: ?> <li><a href='<?= $sd->url ?>'><?= $sd->name ?></a></li> <? endif ?> <? endforeach ?> </ul>
аналог nc_browse_level()
<?php $menu = $nc_core->nav->get_by_level(0); $menu = $nc_core->nav->level(0)->get(); ?>
Пример вывода меню первого уровня:
<ul class='sub-menu'> <? foreach ($nc_core->nav->get_by_level(1) as $sd): ?> <? if ($sd->active): ?> <li><b><?= $sd->name ?></b></li> <? else: ?> <li><a href='<?= $sd->url ?>'><?= $sd->name ?></a></li> <? endif ?> <? endforeach ?> </ul>
аналог nc_browse_path() и nc_browse_path_range()
Примеры использования:
<? foreach ($nc_core->nav->get_path() as $sd): ?> <? if ($sd->current): ?> <?=$sd->name ?> <? else: ?> <a href='<?=$sd->url ?>'><?=$sd->name ?></a> / <? endif ?> <? endforeach ?>
Возвращает только часть пути (“хлебных крошек”). Аргументы работают точно так же как и php-функции array_slice
<?php // Вернет путь без первого элемента $nc_core->nav->get_path(1); // Вернет путь от корня сайта до 3 кровня вложенности максимум $nc_core->nav->get_path(0, 3); // Вернет весь путь но без последнего раздела $nc_core->nav->get_path(0, -1); ?>
В функциях и модификаторах возможно использование следующих значений:
$menu = $nav->sub(7)->get();
$menu = $nc_core->nav->level(0)->get();
<?php $all_subs = $nav->ignore_check()->get_sub(); // или $all_subs = $nav->ignore_check()->sub()->get(); ?>
<?php // Сортирует по названию раздела $nav->order_by('name')->get_sub(); // В обратном порядке $nav->order_by('name', 'desc')->get_sub(); ?>
Использование нескольких параметров сортировки
<?php $nav->order_by('Favorite')->order_by('name')->get_sub(); ?>
<?php $nav->where('menu', 'main')->order_by('name')->get_sub(); // Вернет тот же результат $nav->where('menu', 'main')->order_by('name')->level(0)->get(); ?>
Примеры работы модификатора where()
<?php // ... WHERE `menu` = 'main' ... $nav->where('menu', 'main'); // ... WHERE `menu` != 'main' ... $nav->where('menu', '!=', 'main'); // ... WHERE `menu` = 'main' AND `Checked` = 1 ... $nav->where('menu', 'main')->where('Checked', 1); // ... WHERE `menu` = 'main' OR `menu` = 'all' ... $nav->where('menu', 'main')->or_where('menu', 'all'); ?>
<?php $nav->where_in('id', array(100, 101, 103))->order_by('name')->get(); ?>
Вывод меню в котором отображаются только разделы с id = 3 и 5
<ul class='main-menu'> <? foreach ($nc_core->nav->where_in("id", array(3,5))->get_sub() as $sd): ?> <? if ($sd->active): ?> <li><b><?= $sd->name ?></b></li> <? else: ?> <li><a href='<?= $sd->url ?>'><?= $sd->name ?></a></li> <? endif ?> <? endforeach ?> </ul>
Вывод меню в котором отображаются все разделы, включая выключенные
<ul class='main-menu'> <? foreach ($nc_core->nav->ignore_check()->get_sub() as $sd): ?> <? if ($sd->active): ?> <li><b><?= $sd->name ?></b></li> <? else: ?> <li><a href='<?= $sd->url ?>'><?= $sd->name ?></a></li> <? endif ?> <? endforeach ?> </ul>
Комментарии 23
Например, есть у вас меню, которое вы выводите через стандартную функцию nc_browse_sub, а вам вдруг понадобилось при отображении каждого пункта меню выполнять некую php-функцию. Функция nc_browse_sub не позволяет в шаблон вывода вставлять запуск функций, а с помощью класса навигации Вы бы смогли это сделать.
Разумеется, для стандартных вариантов навигации проще использовать привычные функции, а не этот сложный класс навигации.
Старый код отрабатывал вложенные разделы и отображение объекта из списка на одной странице. Новый, см. ниже, не отрабатывает. Выходит, что новое сделали, а типовой функционал сразу стал проблемой.
[CODE] <div class="column-right">
<? foreach ($nc_core->nav->where_in('id', array(630, 631))->order_by('id')->get() as $sd): ?>
<? if ($sd->current): ?><div class="selected"><strong><?= $sd->name ?></strong></div>
<? elseif ($sd->active): ?><div class="selected"><a href='<?= $sd->url ?>'><?= $sd->name ?></a></div>
<? else: ?><div><a href='<?= $sd->url ?>'><?= $sd->name ?></a></div><? endif ?>
<? endforeach ?>
</div>[/CODE]
active и current всегда вместе идут.
И поэтому даже на странице объекта оба значения остаются активными. Это баг.
Получается, что нельзя убрать ссылку на раздел на странице списка и поставить её на странице объекта.
На помощь приходит [B]$action[/B].
[B]if ($sd1->active && $action == 'index')[/B] - значит страница списка
[B]if ($sd1->active && $action == 'full')[/B] - значит страница объекта
[CODE]<ul class='main-menu'>
<? foreach ($nc_core->nav->where_in("id", array(3,5))->get_sub() as $sd): ?>
<? if ($sd->active): ?>
<li><b><?= $sd->name ?></b></li>
<? else: ?>
<li><a href='<?= $sd->url ?>'><?= $sd->name ?></a></li>
<? endif ?>
<? endforeach ?>
<ul>[/CODE]
тут прописан вывод только одноуровневого меню.
Ошибка исправлена.
<? foreach ($nc_core->nav->where_in("id", array(18,6,3,9,44,14,7))->ignore_check()->get_sub() as $sd): ?>
Вывод был в порядке следование идентификаторов в массиве, а после обновления они стали выводиться по приоритету раздела. А было удобно, что можно как угодно выстраивать.
as_array() — вывод в виде массива
как этим пользоваться?
Я вот только начал свое изучение НетКет. Третий месяц в нем работаю. Но для меня это автомобиль с квадраными колесами. Вроде бы и ездит, но очень неудобно. Идеи в ЦМС неплохие заложены, но реализованы в основном через одно место. Зачем люди за НетКет деньги платят, пока не очень понимаю! ))))))
Вот примерно такой код для вывода двухуровнего меню:
<ul class='main-menu'>
<? foreach ($nc_core->nav->get_sub() as $sd): ?>
<li>
<a href='<?= $sd->url ?>'><?= $sd->name ?></a>
<?
if ($nc_core->nav->get_sub($sd->Subdivision_ID)):
foreach ($nc_core->nav->get_sub($sd->Subdivision_ID) as $sd_sub):
?>
<ul>
<li><a href='<?= $sd_sub->url ?>'><?= $sd_sub->name ?></a></li>
</ul>
<?
endforeach;
endif;
?>
</li>
<? endforeach ?>
</ul>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<? foreach ($nc_core->nav->get_sub() as $sd): ?>
<? if ($nc_core->nav->get_sub($sd->Subdivision_ID)): ?>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><?= $sd->name; ?></a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<? foreach ($nc_core->nav->get_sub($sd->Subdivision_ID) as $sd_sub): ?>
<a class="dropdown-item" href="<?= $sd_sub->url; ?>"><?= $sd_sub->name; ?></a>
<? endforeach; ?>
</div>
</li>
<? else: ?>
<? if ($sd->active): ?>
<li class="nav-item active">
<a class="nav-link" href="<?= $sd->url; ?>"><?= $sd->name; ?><span class="sr-only">(current)</span></a>
</li>
<? else: ?>
<li class="nav-item active">
<a class="nav-link" href="<?= $sd->url; ?>"><?= $sd->name; ?></a>
</li>
<? endif; ?>
<? endif; ?>
<? endforeach ?>
</ul>
</div>
</nav>