Skip to content

Commit d9a5aea

Browse files
authored
[Task]: Overwrite UserPerspectiveListener to store perspective in session (#606)
1 parent 026442f commit d9a5aea

File tree

2 files changed

+91
-1
lines changed

2 files changed

+91
-1
lines changed

config/services.yaml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,13 @@ services:
204204
tags:
205205
- { name: 'kernel.event_subscriber', dispatcher: 'security.event_dispatcher.pimcore_admin' }
206206

207-
207+
Pimcore\Bundle\AdminBundle\EventListener\UserPerspectiveListener:
208+
class: App\EventListener\UserSessionPerspectiveListener
209+
calls:
210+
- [ setLogger, [ '@logger' ] ]
211+
tags:
212+
- { name: kernel.event_subscriber }
213+
- { name: monolog.logger, channel: admin }
208214

209215

210216
# ---------------------------------------------------------
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
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

Comments
 (0)