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.
		
		
		
		
		
			
		
			
				
					
					
						
							498 lines
						
					
					
						
							18 KiB
						
					
					
				
			
		
		
	
	
							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;
 | 
						|
    }
 | 
						|
}
 | 
						|
 |