|
| 1 | +<?php |
| 2 | +declare(strict_types=1); |
| 3 | + |
| 4 | +/** |
| 5 | + * Pimcore |
| 6 | + * |
| 7 | + * This source file is available under two different licenses: |
| 8 | + * - GNU General Public License version 3 (GPLv3) |
| 9 | + * - Pimcore Commercial License (PCL) |
| 10 | + * Full copyright and license information is available in |
| 11 | + * LICENSE.md which is distributed with this source code. |
| 12 | + * |
| 13 | + * @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org) |
| 14 | + * @license http://www.pimcore.org/license GPLv3 and PCL |
| 15 | + */ |
| 16 | + |
| 17 | +namespace App\EventListener; |
| 18 | + |
| 19 | +use Pimcore\Bundle\AdminBundle\EventListener\UserPerspectiveListener; |
| 20 | +use Pimcore\Model\User; |
| 21 | +use Symfony\Component\HttpFoundation\Request; |
| 22 | + |
| 23 | +/** |
| 24 | + * @internal |
| 25 | + */ |
| 26 | +class UserSessionPerspectiveListener extends UserPerspectiveListener |
| 27 | +{ |
| 28 | + protected function setRequestedPerspective(User $user, Request $request): void |
| 29 | + { |
| 30 | + // update perspective settings |
| 31 | + $requestedPerspective = $request->get('perspective'); |
| 32 | + $sessionPerspective = $request->getSession()->get('sessionPerspective'); |
| 33 | + |
| 34 | + if ($requestedPerspective) { |
| 35 | + if ($requestedPerspective !== $sessionPerspective) { |
| 36 | + $existingPerspectives = array_keys(\Pimcore\Bundle\AdminBundle\Perspective\Config::get()); |
| 37 | + if (!in_array($requestedPerspective, $existingPerspectives)) { |
| 38 | + $this->logger->warning('Requested perspective {perspective} for {user} does not exist.', [ |
| 39 | + 'user' => $user->getName(), |
| 40 | + 'perspective' => $requestedPerspective, |
| 41 | + ]); |
| 42 | + |
| 43 | + $requestedPerspective = null; |
| 44 | + } |
| 45 | + } |
| 46 | + } |
| 47 | + |
| 48 | + if (!$requestedPerspective || !$user->isAllowed($requestedPerspective, 'perspective')) { |
| 49 | + $previouslyRequested = $requestedPerspective; |
| 50 | + |
| 51 | + // if the session perspective is not allowed anymore, set the first available |
| 52 | + if ($sessionPerspective) { |
| 53 | + $requestedPerspective = $user->isAllowed($sessionPerspective, 'perspective') |
| 54 | + ? $sessionPerspective |
| 55 | + : $user->getFirstAllowedPerspective(); |
| 56 | + } else { |
| 57 | + $requestedPerspective = 'default'; |
| 58 | + } |
| 59 | + |
| 60 | + if ($previouslyRequested) { |
| 61 | + $this->logger->warning('User {user} is not allowed requested perspective {requestedPerspective}. Falling back to {perspective}.', [ |
| 62 | + 'user' => $user->getName(), |
| 63 | + 'requestedPerspective' => $previouslyRequested, |
| 64 | + 'perspective' => $requestedPerspective, |
| 65 | + ]); |
| 66 | + } else { |
| 67 | + $this->logger->debug('Perspective for user {user} was not requested. Falling back to {perspective}.', [ |
| 68 | + 'user' => $user->getName(), |
| 69 | + 'perspective' => $requestedPerspective, |
| 70 | + ]); |
| 71 | + } |
| 72 | + } |
| 73 | + |
| 74 | + if ($requestedPerspective !== $sessionPerspective) { |
| 75 | + $request->getSession()->set('sessionPerspective', $requestedPerspective); |
| 76 | + |
| 77 | + $user->setActivePerspective($requestedPerspective); |
| 78 | + $user->save(); |
| 79 | + } elseif ($sessionPerspective) { |
| 80 | + $user->setActivePerspective($sessionPerspective); |
| 81 | + $user->save(); |
| 82 | + } |
| 83 | + } |
| 84 | +} |
0 commit comments