Chamilo is a learning management system focused on ease of use and accessibility
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
chamilo-lms/src/CoreBundle/Menu/NavBuilder.php

498 lines
18 KiB

<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle\Menu;
use Chamilo\FaqBundle\Entity\Category;
use Chamilo\PageBundle\Entity\Page;
use Chamilo\PageBundle\Entity\Site;
use Knp\Menu\FactoryInterface;
use Knp\Menu\ItemInterface;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerAwareTrait;
use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
/**
* Class NavBuilder.
*/
class NavBuilder implements ContainerAwareInterface
{
use ContainerAwareTrait;
private $factory;
private $checker;
public function __construct(FactoryInterface $factory, AuthorizationChecker $checker)
{
$this->factory = $factory;
$this->checker = $checker;
}
/**
* @param array $itemOptions The options given to the created menuItem
* @param string $currentUri The current URI
*
* @return ItemInterface
*/
public function createCategoryMenu(array $itemOptions = [], $currentUri = null)
{
$factory = $this->container->get('knp_menu.factory');
$menu = $factory->createItem('categories', $itemOptions);
$this->buildCategoryMenu($menu, $itemOptions, $currentUri);
return $menu;
}
/**
* @param ItemInterface $menu The item to fill with $routes
* @param array $options The item options
* @param string $currentUri The current URI
*/
public function buildCategoryMenu(ItemInterface $menu, array $options = [], $currentUri = null)
{
//$categories = $this->categoryManager->getCategoryTree();
//$this->fillMenu($menu, $categories, $options, $currentUri);
$menu->addChild('home', ['route' => 'home']);
}
/**
* Top menu left.
*/
public function menuApp(array $options): ItemInterface
{
$container = $this->container;
$checker = $this->checker;
$translator = $container->get('translator');
$router = $container->get('router');
$factory = $this->factory;
$menu = $factory->createItem('root', ['childrenAttributes' => ['class' => 'navbar-nav']]);
$settingsManager = $container->get('chamilo.settings.manager');
$rootWeb = $router->generate('home');
$menu->addChild(
'home',
[
'label' => $translator->trans('Home'),
'route' => 'home',
'icon' => 'home',
]
);
if ($checker && $checker->isGranted('IS_AUTHENTICATED_FULLY')) {
$menu->addChild(
'courses',
[
'label' => $translator->trans('Courses'),
'route' => 'legacy_main',
'routeParameters' => ['name' => 'index/user_portal.php'],
'icon' => 'book',
]
)->setLinkAttribute('class', 'jui');
$menu['courses']->addChild(
'courses',
[
'label' => $translator->trans('My courses'),
'route' => 'legacy_main',
'routeParameters' => ['name' => 'index/user_portal.php'],
]
);
$browse = $settingsManager->getSetting('display.allow_students_to_browse_courses');
if ('true' === $browse) {
if ($checker->isGranted('ROLE_STUDENT') && !api_is_drh() && !api_is_session_admin()) {
$menu['courses']->addChild(
'catalog',
[
'label' => $translator->trans('Course catalog'),
'route' => 'legacy_main',
'routeParameters' => ['name' => 'auth/courses.php'],
]
);
}
}
/*$menu['courses']->addChild(
$translator->trans('Course history'),
[
'route' => 'legacy_main',
'routeParameters' => ['name' => '../user_portal.php'],
]
);*/
if (api_is_allowed_to_create_course()) {
$lang = $translator->trans('Create course');
if ('true' === $settingsManager->getSetting('course.course_validation')) {
$lang = $translator->trans('Create course request');
}
$menu['courses']->addChild(
'create-course',
[
'label' => $lang,
'route' => 'legacy_main',
'routeParameters' => ['name' => 'create_course/add_course.php'],
]
);
}
if ($checker->isGranted('ROLE_ADMIN')) {
$menu['courses']->addChild(
$translator->trans('Create session'),
[
'route' => 'legacy_main',
'routeParameters' => ['name' => 'session/session_add.php'],
]
);
}
$menu->addChild(
'calendar',
[
'label' => $translator->trans('Calendar'),
'route' => 'legacy_main',
'routeParameters' => ['name' => 'calendar/agenda_js.php'],
'icon' => 'calendar-alt',
]
);
$menu->addChild(
'reports',
[
'label' => $translator->trans('Reporting'),
'route' => 'legacy_main',
'routeParameters' => ['name' => 'mySpace/index.php'],
'icon' => 'chart-bar',
]
);
if ('true' === $settingsManager->getSetting('social.allow_social_tool')) {
$menu->addChild(
'social',
[
'label' => $translator->trans('Social'),
'route' => 'legacy_main',
'routeParameters' => ['name' => 'social/home.php'],
'icon' => 'heart',
]
);
/*$menu['social']->addChild(
$translator->trans('My profile'),
[
'route' => 'legacy_main',
'routeParameters' => ['name' => 'social/home.php'],
]
);
$menu['social']->addChild(
$translator->trans('My shared profile'),
[
'route' => 'legacy_main',
'routeParameters' => ['name' => 'social/profile.php'],
]
);*/
$menu['social']->addChild(
$translator->trans('Friends'),
[
'route' => 'legacy_main',
'routeParameters' => ['name' => 'social/friends.php'],
]
);
$menu['social']->addChild(
$translator->trans('Groups'),
[
'route' => 'legacy_main',
'routeParameters' => ['name' => 'social/groups.php'],
]
);
/*$menu['social']->addChild(
$translator->trans('My Files'),
[
'route' => 'legacy_main',
'routeParameters' => ['name' => 'social/myfiles.php'],
]
);*/
}
if ($checker->isGranted('ROLE_ADMIN')) {
$menu->addChild(
'administrator',
[
'label' => $translator->trans('Administration'),
'route' => 'legacy_main',
'routeParameters' => ['name' => 'admin/index.php'],
'icon' => 'cogs',
]
);
$menu['administrator']->addChild(
'options',
[
'label' => $translator->trans('All options'),
'route' => 'legacy_main',
'routeParameters' => ['name' => 'admin/index.php'],
]
);
$menu['administrator']->addChild(
'userlist',
[
'label' => $translator->trans('Users'),
'route' => 'legacy_main',
'routeParameters' => ['name' => 'admin/user_list.php'],
]
);
$menu['administrator']->addChild(
'courselist',
[
'label' => $translator->trans('Courses'),
'route' => 'legacy_main',
'routeParameters' => ['name' => 'admin/course_list.php'],
]
);
$menu['administrator']->addChild(
'sessionlist',
[
'label' => $translator->trans('Sessions'),
'route' => 'legacy_main',
'routeParameters' => ['name' => 'session/session_list.php'],
]
);
/*$menu['administrator']->addChild(
'languages',
[
'label' => $translator->trans('Languages'),
'route' => 'legacy_main',
'routeParameters' => ['name' => 'admin/languages.php'],
]
);*/
$menu['administrator']->addChild(
'plugins',
[
'label' => $translator->trans('Plugins'),
'route' => 'legacy_main',
'routeParameters' => ['name' => 'admin/settings.php', 'category' => 'Plugins'],
]
);
$menu['administrator']->addChild(
'settings',
[
'label' => $translator->trans('Settings'),
'uri' => $rootWeb.'admin/settings/platform',
]
);
}
}
$categories = $container->get('doctrine')->getRepository('ChamiloFaqBundle:Category')->retrieveActive();
if ($categories) {
$faq = $menu->addChild('FAQ', ['route' => 'faq_index']);
/** @var Category $category */
foreach ($categories as $category) {
$faq->addChild(
$category->getHeadline(),
[
'route' => 'faq',
'routeParameters' => [
'categorySlug' => $category->getSlug(),
'questionSlug' => '',
],
]
)->setAttribute('divider_append', true);
}
}
// Getting site information
$site = $container->get('sonata.page.site.selector');
$host = $site->getRequestContext()->getHost();
$siteManager = $container->get('sonata.page.manager.site');
/** @var Site $site */
$site = $siteManager->findOneBy([
'host' => [$host, 'localhost'],
'enabled' => true,
]);
// Needed when loading legacy pages (inside main)
//$isLegacy = $container->get('request_stack')->getCurrentRequest()->get('load_legacy');
$legacyIndex = '';
if ($site) {
$pageManager = $container->get('sonata.page.manager.page');
// Parents only of homepage
$criteria = ['site' => $site, 'enabled' => true, 'parent' => 1];
$pages = $pageManager->findBy($criteria);
//$pages = $pageManager->loadPages($site);
/** @var Page $page */
foreach ($pages as $page) {
/*if ($page->getRouteName() !== 'page_slug') {
continue;
}*/
// Avoid home
if ('/' === $page->getUrl()) {
continue;
}
if (!$page->isCms()) {
continue;
}
$url = $legacyIndex.$page->getUrl();
$subMenu = $menu->addChild(
$page->getName(),
[
'route' => $page->getRouteName(),
'routeParameters' => [
'path' => $url,
],
]
);
/** @var Page $child */
foreach ($page->getChildren() as $child) {
$url = $legacyIndex.$child->getUrl();
$subMenu->addChild(
$child->getName(),
[
'route' => $page->getRouteName(),
'routeParameters' => [
'path' => $url,
],
]
)->setAttribute('divider_append', true);
}
}
}
//$menu->setLinkAttribute('ancestorClass', 'julio');
// Set CSS classes for the items
foreach ($menu->getChildren() as $child) {
$childClass = '';
$hasChildren = $child->hasChildren();
if ($hasChildren) {
$childClass = 'nav-dropdown';
$child->setChildrenAttribute('class', 'nav-dropdown-items');
if ($child->isCurrent()) {
$child->setChildrenAttribute('style', 'display:block');
}
}
$child
->setLinkAttribute('class', 'nav-link')
->setAttribute('class', 'nav-item '.$childClass)
;
if ($child->isCurrent()) {
$child->setAttribute('class', 'nav-item '.$childClass);
}
if ($hasChildren) {
$child
->setLinkAttribute('class', 'nav-link nav-dropdown-toggle ') //dropdown-toggle
//->setLinkAttribute('data-toggle', 'dropdown')
//->setLinkAttribute('role', 'button')
//->setLinkAttribute('aria-haspopup', 'true')
//->setLinkAttribute('aria-expanded', 'false')
;
$children = $child->getChildren();
foreach ($children as $subChild) {
$subChild
->setLinkAttribute('class', 'nav-link ')
->setAttribute('class', 'nav-item ');
}
}
}
return $menu;
}
/**
* Course menu.
*
* @return ItemInterface
*/
public function courseMenu(FactoryInterface $factory, array $options)
{
$checker = $this->container->get('security.authorization_checker');
$menu = $factory->createItem('root');
$translator = $this->container->get('translator');
$checked = $this->container->get('session')->get('IS_AUTHENTICATED_FULLY');
$settingsManager = $this->container->get('chamilo.settings.manager');
if ($checked) {
$menu->setChildrenAttribute('class', 'nav nav-pills nav-stacked');
$menu->addChild(
$translator->trans('MyCourses'),
[
'route' => 'userportal',
'routeParameters' => ['type' => 'courses'],
]
);
return $menu;
if (api_is_allowed_to_create_course()) {
$lang = $translator->trans('CreateCourse');
if ('true' == $settingsManager->getSetting('course.course_validation')) {
$lang = $translator->trans('CreateCourseRequest');
}
$menu->addChild(
$lang,
['route' => 'add_course']
);
}
$link = $this->container->get('router')->generate('web.main');
$menu->addChild(
$translator->trans('ManageCourses'),
[
'uri' => $link.'auth/courses.php?action=sortmycourses',
]
);
$browse = $settingsManager->getSetting('display.allow_students_to_browse_courses');
if ('true' == $browse) {
if ($checker->isGranted('ROLE_STUDENT') && !api_is_drh() && !api_is_session_admin()
) {
$menu->addChild(
$translator->trans('CourseCatalog'),
[
'uri' => $link.'auth/courses.php',
]
);
} else {
$menu->addChild(
$translator->trans('Dashboard'),
[
'uri' => $link.'dashboard/index.php',
]
);
}
}
/** @var \Knp\Menu\MenuItem $menu */
$menu->addChild(
$translator->trans('History'),
[
'route' => 'userportal',
'routeParameters' => [
'type' => 'sessions',
'filter' => 'history',
],
]
);
}
return $menu;
}
}