parent
ba300d0421
commit
c5033bd6b1
@ -1,440 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
/* For licensing terms, see /license.txt */ |
|
||||||
|
|
||||||
namespace Chamilo\CoreBundle\Menu; |
|
||||||
|
|
||||||
use Knp\Menu\FactoryInterface; |
|
||||||
use Knp\Menu\ItemInterface; |
|
||||||
use Symfony\Component\DependencyInjection\ContainerAwareInterface; |
|
||||||
use Symfony\Component\DependencyInjection\ContainerAwareTrait; |
|
||||||
|
|
||||||
/** |
|
||||||
* Class LeftMenuBuilder. |
|
||||||
*/ |
|
||||||
class LeftMenuBuilder implements ContainerAwareInterface |
|
||||||
{ |
|
||||||
use ContainerAwareTrait; |
|
||||||
|
|
||||||
/** |
|
||||||
* Course menu. |
|
||||||
* |
|
||||||
* @return ItemInterface |
|
||||||
*/ |
|
||||||
public function courseMenu(FactoryInterface $factory, array $options) |
|
||||||
{ |
|
||||||
$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('My courses'), |
|
||||||
[ |
|
||||||
'route' => 'userportal', |
|
||||||
'routeParameters' => ['type' => 'courses'], |
|
||||||
] |
|
||||||
); |
|
||||||
|
|
||||||
return $menu; |
|
||||||
|
|
||||||
if (api_is_allowed_to_create_course()) { |
|
||||||
$lang = $translator->trans('Create course'); |
|
||||||
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; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Course menu. |
|
||||||
* |
|
||||||
* @return ItemInterface |
|
||||||
*/ |
|
||||||
public function sessionMenu(FactoryInterface $factory, array $options) |
|
||||||
{ |
|
||||||
$checker = $this->container->get('security.authorization_checker'); |
|
||||||
$menu = $factory->createItem('root'); |
|
||||||
$translator = $this->container->get('translator'); |
|
||||||
//$settingsManager = $this->container->get('chamilo.settings.manager'); |
|
||||||
|
|
||||||
if ($checker->isGranted('IS_AUTHENTICATED_FULLY')) { |
|
||||||
$menu->setChildrenAttribute('class', 'nav nav-pills nav-stacked'); |
|
||||||
|
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('My sessions'), |
|
||||||
[ |
|
||||||
'route' => 'userportal', |
|
||||||
'routeParameters' => ['type' => 'sessions'], |
|
||||||
] |
|
||||||
); |
|
||||||
|
|
||||||
if ($checker->isGranted('ROLE_ADMIN')) { |
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('Add a training session'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => ['name' => 'session/session_add.php'], |
|
||||||
] |
|
||||||
); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
return $menu; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* @return ItemInterface |
|
||||||
*/ |
|
||||||
public function profileMenu(FactoryInterface $factory, array $options) |
|
||||||
{ |
|
||||||
$menu = $factory->createItem('root'); |
|
||||||
$security = $this->container->get('security.authorization_checker'); |
|
||||||
$translator = $this->container->get('translator'); |
|
||||||
|
|
||||||
if ($security->isGranted('IS_AUTHENTICATED_FULLY')) { |
|
||||||
$menu->setChildrenAttribute('class', 'navbar-nav'); |
|
||||||
|
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('Inbox'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => [ |
|
||||||
'name' => 'messages/inbox.php', |
|
||||||
], |
|
||||||
] |
|
||||||
); |
|
||||||
|
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('Compose'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => [ |
|
||||||
'name' => 'messages/new_message.php', |
|
||||||
], |
|
||||||
] |
|
||||||
); |
|
||||||
|
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('Pending invitations'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => [ |
|
||||||
'name' => 'social/invitations.php', |
|
||||||
], |
|
||||||
] |
|
||||||
); |
|
||||||
|
|
||||||
/*$menu->addChild( |
|
||||||
$translator->trans('My files'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => [ |
|
||||||
'name' => 'social/myfiles.php', |
|
||||||
], |
|
||||||
] |
|
||||||
);*/ |
|
||||||
|
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('Edit profile'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => [ |
|
||||||
'name' => 'messages/inbox.php', |
|
||||||
], |
|
||||||
] |
|
||||||
); |
|
||||||
|
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('Inbox'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => [ |
|
||||||
'name' => 'messages/inbox.php', |
|
||||||
], |
|
||||||
] |
|
||||||
); |
|
||||||
} |
|
||||||
|
|
||||||
// Set CSS classes for the items |
|
||||||
foreach ($menu->getChildren() as $child) { |
|
||||||
$child |
|
||||||
->setLinkAttribute('class', 'nav-link') |
|
||||||
->setAttribute('class', 'nav-item'); |
|
||||||
} |
|
||||||
|
|
||||||
return $menu; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* @todo add validations |
|
||||||
* |
|
||||||
* @return ItemInterface |
|
||||||
*/ |
|
||||||
public function socialMenu(FactoryInterface $factory, array $options) |
|
||||||
{ |
|
||||||
$menu = $factory->createItem('root'); |
|
||||||
$security = $this->container->get('security.authorization_checker'); |
|
||||||
$translator = $this->container->get('translator'); |
|
||||||
|
|
||||||
if ($security->isGranted('IS_AUTHENTICATED_FULLY')) { |
|
||||||
$menu->setChildrenAttribute('class', 'nav nav-pills nav-stacked'); |
|
||||||
|
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('Home'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => [ |
|
||||||
'name' => 'social/home.php', |
|
||||||
], |
|
||||||
] |
|
||||||
); |
|
||||||
|
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('Messages'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => [ |
|
||||||
'name' => 'messages/inbox.php', |
|
||||||
], |
|
||||||
] |
|
||||||
); |
|
||||||
|
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('Invitations'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => [ |
|
||||||
'name' => 'social/invitations.php', |
|
||||||
], |
|
||||||
] |
|
||||||
); |
|
||||||
|
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('My shared profile'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => [ |
|
||||||
'name' => 'social/profile.php', |
|
||||||
], |
|
||||||
] |
|
||||||
); |
|
||||||
|
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('Friends'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => [ |
|
||||||
'name' => 'social/friends.php', |
|
||||||
], |
|
||||||
] |
|
||||||
); |
|
||||||
|
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('Social groups'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => [ |
|
||||||
'name' => 'social/groups.php', |
|
||||||
], |
|
||||||
] |
|
||||||
); |
|
||||||
|
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('Search'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => [ |
|
||||||
'name' => 'social/search.php', |
|
||||||
], |
|
||||||
] |
|
||||||
); |
|
||||||
|
|
||||||
/*$menu->addChild( |
|
||||||
$translator->trans('My files'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => [ |
|
||||||
'name' => 'social/myfiles.php', |
|
||||||
], |
|
||||||
] |
|
||||||
);*/ |
|
||||||
} |
|
||||||
|
|
||||||
return $menu; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Skills menu. |
|
||||||
* |
|
||||||
* @return ItemInterface |
|
||||||
*/ |
|
||||||
public function skillsMenu(FactoryInterface $factory, array $options) |
|
||||||
{ |
|
||||||
$checker = $this->container->get('security.authorization_checker'); |
|
||||||
$translator = $this->container->get('translator'); |
|
||||||
$settingsManager = $this->container->get('chamilo.settings.manager'); |
|
||||||
$allow = $settingsManager->getSetting('certificate.hide_my_certificate_link'); |
|
||||||
$menu = $factory->createItem('root'); |
|
||||||
|
|
||||||
if ($checker->isGranted('IS_AUTHENTICATED_FULLY')) { |
|
||||||
$menu->setChildrenAttribute('class', 'nav nav-pills nav-stacked'); |
|
||||||
|
|
||||||
if ('false' === $allow) { |
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('My certificates'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => ['name' => 'gradebook/my_certificates.php'], |
|
||||||
] |
|
||||||
); |
|
||||||
} |
|
||||||
|
|
||||||
if ('true' === $settingsManager->getSetting('allow_public_certificates')) { |
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('Search'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => ['name' => 'gradebook/search.php'], |
|
||||||
] |
|
||||||
); |
|
||||||
} |
|
||||||
|
|
||||||
if ('true' === $settingsManager->getSetting('allow_skills_tool')) { |
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('MySkills'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => ['name' => 'social/my_skills_report.php'], |
|
||||||
] |
|
||||||
); |
|
||||||
|
|
||||||
if ($checker->isGranted('ROLE_TEACHER')) { |
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('ManageSkills'), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => ['name' => 'admin/skills_wheel.php'], |
|
||||||
] |
|
||||||
); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
return $menu; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Register/reset password menu. |
|
||||||
* |
|
||||||
* @return ItemInterface |
|
||||||
*/ |
|
||||||
public function loginMenu(FactoryInterface $factory, array $options) |
|
||||||
{ |
|
||||||
$menu = $factory->createItem('legacy_main'); |
|
||||||
$translator = $this->container->get('translator'); |
|
||||||
$settingManager = $this->container->get('chamilo.settings.manager'); |
|
||||||
|
|
||||||
if ('true' === $settingManager->getSetting('allow_registration')) { |
|
||||||
$menu->addChild( |
|
||||||
$translator->trans( |
|
||||||
'registration.submit', |
|
||||||
[], |
|
||||||
'FOSUserBundle' |
|
||||||
), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => ['name' => 'auth/inscription.php'], |
|
||||||
['attributes' => ['id' => 'nav']], |
|
||||||
] |
|
||||||
); |
|
||||||
} |
|
||||||
|
|
||||||
if ('true' === $settingManager->getSetting('allow_lostpassword')) { |
|
||||||
$menu->addChild( |
|
||||||
$translator->trans( |
|
||||||
'resetting.request.submit', |
|
||||||
[], |
|
||||||
'FOSUserBundle' |
|
||||||
), |
|
||||||
[ |
|
||||||
'route' => 'legacy_main', |
|
||||||
'routeParameters' => ['name' => 'auth/lostPassword.php'], |
|
||||||
['attributes' => ['id' => 'nav']], |
|
||||||
] |
|
||||||
); |
|
||||||
} |
|
||||||
|
|
||||||
return $menu; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* @return ItemInterface |
|
||||||
*/ |
|
||||||
public function helpMenu(FactoryInterface $factory, array $options) |
|
||||||
{ |
|
||||||
$translator = $this->container->get('translator'); |
|
||||||
$menu = $factory->createItem('legacy_main'); |
|
||||||
$menu->addChild( |
|
||||||
$translator->trans('Forum'), |
|
||||||
[ |
|
||||||
'uri' => 'https://chamilo.org/forum/', |
|
||||||
['attributes' => ['id' => 'nav']], |
|
||||||
] |
|
||||||
); |
|
||||||
|
|
||||||
return $menu; |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,60 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
/* For licensing terms, see /license.txt */ |
|
||||||
|
|
||||||
namespace Chamilo\CoreBundle\Menu; |
|
||||||
|
|
||||||
use Knp\Menu\ItemInterface; |
|
||||||
use Knp\Menu\Matcher\Voter\VoterInterface; |
|
||||||
use Symfony\Component\HttpFoundation\RequestStack; |
|
||||||
|
|
||||||
/** |
|
||||||
* Class NavBuilder. |
|
||||||
*/ |
|
||||||
class MenuVoter implements VoterInterface |
|
||||||
{ |
|
||||||
/** |
|
||||||
* @var RequestStack |
|
||||||
*/ |
|
||||||
private $requestStack; |
|
||||||
|
|
||||||
public function __construct(RequestStack $requestStack) |
|
||||||
{ |
|
||||||
$this->requestStack = $requestStack; |
|
||||||
} |
|
||||||
|
|
||||||
public function matchItem(ItemInterface $item): ?bool |
|
||||||
{ |
|
||||||
$request = $this->requestStack->getCurrentRequest(); |
|
||||||
$currentUri = $item->getUri(); |
|
||||||
$currentUrl = $request->getUri(); |
|
||||||
|
|
||||||
if (null !== $item->getExtra('routes') && |
|
||||||
in_array($request->attributes->get('_route'), $item->getExtra('routes')) |
|
||||||
) { |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
if (false !== strpos($currentUri, 'user_portal.php') && |
|
||||||
false !== strpos($currentUrl, 'user_portal.php') |
|
||||||
) { |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
if (false !== strpos($currentUri, '/main/')) { |
|
||||||
$pos = strpos($currentUri, '/main/'); |
|
||||||
$partSelected = substr($currentUri, $pos); |
|
||||||
$partSelected = str_replace('/%2E%2E/', '', $partSelected); |
|
||||||
|
|
||||||
$pos = strpos($currentUrl, '/main/'); |
|
||||||
$partCurrent = substr($currentUrl, $pos); |
|
||||||
$partCurrent = rtrim($partCurrent, '/'); |
|
||||||
|
|
||||||
if ($partSelected === $partCurrent) { |
|
||||||
return true; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
return false; |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,498 +0,0 @@ |
|||||||
<?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; |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,46 +0,0 @@ |
|||||||
<!-- @todo add permissions for each menu sidebar menu: : style can be found in sidebar.less --> |
|
||||||
{% import '@ChamiloCore/Macros/box.html.twig' as macro %} |
|
||||||
|
|
||||||
{% autoescape false %} |
|
||||||
|
|
||||||
{% if is_granted('IS_AUTHENTICATED_FULLY') %} |
|
||||||
{# {{ macro.panel(#} |
|
||||||
{# 'Profile' | trans,#} |
|
||||||
{# mopa_bootstrap_menu('ChamiloCoreBundle:LeftMenuBuilder:profileMenu', {'automenu': 'navbar', 'stacked':false})#} |
|
||||||
{# ) }}#} |
|
||||||
|
|
||||||
{# {{ macro.panel(#} |
|
||||||
{# 'Courses' | trans,#} |
|
||||||
{# mopa_bootstrap_menu('ChamiloCoreBundle:LeftMenuBuilder:courseMenu', {'automenu': 'navbar', 'stacked':false})#} |
|
||||||
{# ) }}#} |
|
||||||
|
|
||||||
{# {{ macro.panel(#} |
|
||||||
{# 'Sessions' | trans,#} |
|
||||||
{# mopa_bootstrap_menu('ChamiloCoreBundle:LeftMenuBuilder:sessionMenu', {'automenu': 'navbar', 'stacked':false})#} |
|
||||||
{# ) }}#} |
|
||||||
|
|
||||||
{# {{ macro.panel(#} |
|
||||||
{# 'Skills' | trans,#} |
|
||||||
{# mopa_bootstrap_menu('ChamiloCoreBundle:LeftMenuBuilder:skillsMenu', {'automenu': 'navbar', 'stacked':false})#} |
|
||||||
{# ) }}#} |
|
||||||
{% else %} |
|
||||||
{# Plugin login before/after tpls #} |
|
||||||
{% if plugin_login_top is not null %} |
|
||||||
<div id="plugin_login_top"> |
|
||||||
{{ plugin_login_top }} |
|
||||||
</div> |
|
||||||
{% endif %} |
|
||||||
|
|
||||||
{% include '@ChamiloCore/Sidebar/login.html.twig' %} |
|
||||||
|
|
||||||
{% if plugin_login_bottom is not null %} |
|
||||||
<div id="plugin_login_bottom"> |
|
||||||
{{ plugin_login_bottom }} |
|
||||||
</div> |
|
||||||
{% endif %} |
|
||||||
{% endif %} |
|
||||||
{{ macro.panel( |
|
||||||
'Help' | trans, |
|
||||||
mopa_bootstrap_menu('ChamiloCoreBundle:LeftMenuBuilder:helpMenu', {'automenu': 'pills', 'stacked':true}) |
|
||||||
) }} |
|
||||||
{% endautoescape %} |
|
||||||
@ -1,35 +0,0 @@ |
|||||||
{#<!-- sidebar menu: : style can be found in sidebar.less -->#} |
|
||||||
{#{% import '@ChamiloCore/Macros/box.html.twig' as macro %}#} |
|
||||||
|
|
||||||
{#{% autoescape false %}#} |
|
||||||
{#{% if is_granted('IS_AUTHENTICATED_FULLY') %}#} |
|
||||||
{# #}{#'Profile' | trans,#} |
|
||||||
{# #}{#mopa_bootstrap_menu('ChamiloCoreBundle:SimpleMenuBuilder:mainMenu', {'automenu': 'pills', 'stacked':true})) }}#} |
|
||||||
|
|
||||||
{# {{ macro.panel(#} |
|
||||||
{# 'Courses' | trans,#} |
|
||||||
{# mopa_bootstrap_menu('ChamiloCoreBundle:CourseMenuBuilder:courseMenu', {'automenu': 'pills', 'stacked':true})) }}#} |
|
||||||
|
|
||||||
{# {{ macro.panel(#} |
|
||||||
{# 'Skills' | trans,#} |
|
||||||
{# mopa_bootstrap_menu('ChamiloCoreBundle:CourseMenuBuilder:skillsMenu', {'automenu': 'pills', 'stacked':true})) }}#} |
|
||||||
|
|
||||||
{#{% else %}#} |
|
||||||
{# <div class="user-panel">switcher#} |
|
||||||
{# </div>#} |
|
||||||
{# <form action="{{ path("fos_user_security_check") }}" method="post" role="form" class="sidebar-form">#} |
|
||||||
{# <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}"/>#} |
|
||||||
{# <div class="form-group">#} |
|
||||||
{# <label for="username">{{ 'security.login.username' | trans({}, 'FOSUserBundle') }}</label>#} |
|
||||||
{# <input type="text" class="form-control" id="username" name="_username" >#} |
|
||||||
{# </div>#} |
|
||||||
{# <div class="form-group">#} |
|
||||||
{# <label for="password">{{ 'security.login.password' | trans({}, 'FOSUserBundle') }}</label>#} |
|
||||||
{# <input type="password" class="form-control" id="password" name="_password">#} |
|
||||||
{# </div>#} |
|
||||||
{# <button type="submit" class="btn btn-default">{{ 'security.login.submit' | trans({}, 'FOSUserBundle') }}</button>#} |
|
||||||
{# </form>#} |
|
||||||
{# {{ mopa_bootstrap_menu('ChamiloCoreBundle:SimpleMenuBuilder:notLoginMenu', {'automenu': 'pills', 'stacked':true}) }}#} |
|
||||||
{#{% endif %}#} |
|
||||||
|
|
||||||
{#{% endautoescape %}#} |
|
||||||
@ -1,12 +0,0 @@ |
|||||||
<!-- @todo search form --> |
|
||||||
<form action="#" method="get" class="sidebar-form"> |
|
||||||
<div class="input-group"> |
|
||||||
<input type="text" name="q" class="form-control" placeholder="Search..."/> |
|
||||||
<span class="input-group-btn"> |
|
||||||
<button type='submit' name='seach' id='search-btn' class="btn btn-flat"> |
|
||||||
<i class="fa fa-search"></i> |
|
||||||
</button> |
|
||||||
</span> |
|
||||||
</div> |
|
||||||
</form> |
|
||||||
<!-- /.search form --> |
|
||||||
@ -1,11 +0,0 @@ |
|||||||
{% set pathInfo = path( |
|
||||||
app.request.attributes.get('_route'), |
|
||||||
app.request.attributes.get('_route_params')) |
|
||||||
%} |
|
||||||
|
|
||||||
{# Profile block #} |
|
||||||
{% if is_granted('IS_AUTHENTICATED_FULLY') %} |
|
||||||
{{ render(controller('ChamiloCoreBundle:Sidebar:userPanel', {'pathInfo': pathInfo })) }} |
|
||||||
{#{{ render(controller('ChamiloCoreBundle:Sidebar:searchForm')) }}#} |
|
||||||
{{ render(controller('ChamiloCoreBundle:Sidebar:socialPanel', {'pathInfo': pathInfo })) }} |
|
||||||
{% endif %} |
|
||||||
@ -1,9 +0,0 @@ |
|||||||
{% import '@ChamiloCore/Macros/box.html.twig' as macro %} |
|
||||||
{% import '@ChamiloCore/Macros/image.html.twig' as macro_image %} |
|
||||||
|
|
||||||
{{ |
|
||||||
macro.panel( |
|
||||||
'SocialNetwork' | trans, |
|
||||||
mopa_bootstrap_menu('ChamiloCoreBundle:LeftMenuBuilder:socialMenu', {'automenu': 'pills', 'stacked':true}) |
|
||||||
) |
|
||||||
}} |
|
||||||
@ -1,24 +0,0 @@ |
|||||||
{% import '@ChamiloCore/Macros/box.html.twig' as macro %} |
|
||||||
{% import '@ChamiloCore/Macros/image.html.twig' as macro_image %} |
|
||||||
|
|
||||||
<!-- Sidebar user panel --> |
|
||||||
<div style="text-align:center;" id="user_image_block" class="panel panel-default"> |
|
||||||
<div class="panel-body"> |
|
||||||
{% if user.avatar %} |
|
||||||
{{ macro_image.avatar_from_media(user.avatar, user.username) }} |
|
||||||
{% else %} |
|
||||||
{{ macro_image.avatar('img/icons/128/unknown.png', user.username) }} |
|
||||||
{% endif %} |
|
||||||
|
|
||||||
<p>{{ 'Hello, %user%'| trans( {'%user%': user.username }, 'ChamiloCoreBundle') }}</p> |
|
||||||
<a href="#"> |
|
||||||
<i class="fa fa-circle text-success"></i> {{ 'Online' | trans }} |
|
||||||
</a> |
|
||||||
|
|
||||||
{% if is_granted('ROLE_PREVIOUS_ADMIN') %} |
|
||||||
<a href="{{ path('home', {'_switch_user': '_exit'}) }}"> |
|
||||||
{{ 'Exit impersonation' | trans }} |
|
||||||
</a> |
|
||||||
{% endif %} |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
Loading…
Reference in new issue