Test Setup Failed
Pull Request — master (#4274)
by Craig
05:52
created

AccountController::changeLanguageAction()   B

Complexity

Conditions 8
Paths 8

Size

Total Lines 36
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
eloc 23
nc 8
nop 3
dl 0
loc 36
rs 8.4444
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Zikula package.
7
 *
8
 * Copyright Zikula - https://ziku.la/
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Zikula\UsersModule\Controller;
15
16
use Locale;
17
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
18
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
19
use Symfony\Component\HttpFoundation\RedirectResponse;
20
use Symfony\Component\HttpFoundation\Request;
21
use Symfony\Component\Intl\Languages;
22
use Symfony\Component\Routing\Annotation\Route;
23
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
24
use Zikula\Bundle\CoreBundle\Controller\AbstractController;
25
use Zikula\Bundle\FormExtensionBundle\Form\Type\DeletionType;
26
use Zikula\Bundle\HookBundle\Dispatcher\HookDispatcherInterface;
27
use Zikula\Bundle\HookBundle\Hook\ValidationHook;
28
use Zikula\ExtensionsModule\Api\ApiInterface\VariableApiInterface;
29
use Zikula\MenuModule\ExtensionMenu\ExtensionMenuCollector;
30
use Zikula\MenuModule\ExtensionMenu\ExtensionMenuInterface;
31
use Zikula\PermissionsModule\Annotation\PermissionCheck;
32
use Zikula\UsersModule\Api\ApiInterface\CurrentUserApiInterface;
33
use Zikula\UsersModule\Constant;
34
use Zikula\UsersModule\Constant as UsersConstant;
35
use Zikula\UsersModule\Entity\RepositoryInterface\UserRepositoryInterface;
36
use Zikula\UsersModule\Entity\UserEntity;
37
use Zikula\UsersModule\Event\DeleteUserFormPostCreatedEvent;
38
use Zikula\UsersModule\Event\DeleteUserFormPostValidatedEvent;
39
use Zikula\UsersModule\Form\Type\ChangeLanguageType;
40
use Zikula\UsersModule\Helper\DeleteHelper;
41
use Zikula\UsersModule\HookSubscriber\UserManagementUiHooksSubscriber;
42
43
/**
44
 * @Route("/account")
45
 * @PermissionCheck("read")
46
 */
47
class AccountController extends AbstractController
48
{
49
    /**
50
     * @Route("")
51
     * @Template("@ZikulaUsersModule/Account/menu.html.twig")
52
     *
53
     * @throws AccessDeniedException Thrown if the user isn't logged in
54
     */
55
    public function menuAction(
56
        ExtensionMenuCollector $extensionMenuCollector,
57
        VariableApiInterface $variableApi
58
    ): array {
59
        $extensionMenuCollector->getAllByType(ExtensionMenuInterface::TYPE_ACCOUNT);
60
        $accountMenus = $extensionMenuCollector->getAllByType(ExtensionMenuInterface::TYPE_ACCOUNT);
61
        $displayIcon = $variableApi->get('ZikulaUsersModule', Constant::MODVAR_ACCOUNT_DISPLAY_GRAPHICS, Constant::DEFAULT_ACCOUNT_DISPLAY_GRAPHICS);
62
63
        foreach ($accountMenus as $accountMenu) {
64
            /** @var \Knp\Menu\ItemInterface $accountMenu */
65
            $accountMenu->setChildrenAttribute('class', 'list-group');
66
            foreach ($accountMenu->getChildren() as $child) {
67
                $child->setAttribute('class', 'list-group-item');
68
                $icon = $child->getAttribute('icon');
69
                $icon = $displayIcon ? $icon . ' fa-fw fa-2x' : null;
70
                $child->setAttribute('icon', $icon);
71
            }
72
        }
73
74
        return ['accountMenus' => $accountMenus];
75
    }
76
77
    /**
78
     * @Route("/change-language")
79
     * @Template("@ZikulaUsersModule/Account/changeLanguage.html.twig")
80
     *
81
     * @return array|RedirectResponse
82
     *
83
     * @throws AccessDeniedException Thrown if the user isn't logged in
84
     */
85
    public function changeLanguageAction(
86
        Request $request,
87
        CurrentUserApiInterface $currentUserApi,
88
        UserRepositoryInterface $userRepository
89
    ) {
90
        if (!$currentUserApi->isLoggedIn()) {
91
            throw new AccessDeniedException();
92
        }
93
        $form = $this->createForm(ChangeLanguageType::class, [
94
            'locale' => $currentUserApi->get('locale')
95
        ]);
96
        $form->handleRequest($request);
97
        if ($form->isSubmitted()) {
98
            $locale = $this->getParameter('locale');
99
            if ($form->get('submit')->isClicked()) {
0 ignored issues
show
Bug introduced by
The method isClicked() does not exist on Symfony\Component\Form\FormInterface. It seems like you code against a sub-type of Symfony\Component\Form\FormInterface such as Symfony\Component\Form\SubmitButton. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

99
            if ($form->get('submit')->/** @scrutinizer ignore-call */ isClicked()) {
Loading history...
100
                $data = $form->getData();
101
                $locale = !empty($data['locale']) ? $data['locale'] : $locale;
102
                /** @var UserEntity $userEntity */
103
                $userEntity = $userRepository->find($currentUserApi->get('uid'));
104
                $userEntity->setLocale($locale);
105
                $userRepository->persistAndFlush($userEntity);
106
                if ($request->hasSession() && ($session = $request->getSession())) {
107
                    $session->set('_locale', $locale);
108
                }
109
                Locale::setDefault($locale);
110
                $langText = Languages::getName($locale);
111
                $this->addFlash('success', $this->trans('Language changed to %lang%', ['%lang%' => $langText], 'messages', $locale));
112
            } elseif ($form->get('cancel')->isClicked()) {
113
                $this->addFlash('status', 'Operation cancelled.');
114
            }
115
116
            return $this->redirectToRoute('zikulausersmodule_account_menu', ['_locale' => $locale]);
117
        }
118
119
        return [
120
            'form' => $form->createView()
121
        ];
122
    }
123
124
    /**
125
     * @Route("/delete")
126
     * @Template("@ZikulaUsersModule/Account/delete.html.twig")
127
     *
128
     * @return array|RedirectResponse
129
     *
130
     * @throws AccessDeniedException Thrown if the user isn't logged in
131
     */
132
    public function deleteMyAccountAction(
133
        Request $request,
134
        CurrentUserApiInterface $currentUserApi,
135
        UserRepositoryInterface $userRepository,
136
        EventDispatcherInterface $eventDispatcher,
137
        HookDispatcherInterface $hookDispatcher,
138
        DeleteHelper $deleteHelper
139
    ) {
140
        if (!$currentUserApi->isLoggedIn()) {
141
            throw new AccessDeniedException();
142
        }
143
        if (!$this->getVar(UsersConstant::MODVAR_ALLOW_USER_SELF_DELETE, UsersConstant::DEFAULT_ALLOW_USER_SELF_DELETE)) {
144
            $this->addFlash('error', 'Self deletion is disabled by the site administrator.');
145
146
            return $this->redirectToRoute('zikulausersmodule_account_menu');
147
        }
148
        if (UsersConstant::USER_ID_ADMIN === $currentUserApi->get('uid')) {
149
            $this->addFlash('error', 'Self deletion is not possible for main administrator.');
150
151
            return $this->redirectToRoute('zikulausersmodule_account_menu');
152
        }
153
        $form = $this->createForm(DeletionType::class);
154
        $deleteUserFormPostCreatedEvent = new DeleteUserFormPostCreatedEvent($form);
155
        $eventDispatcher->dispatch($deleteUserFormPostCreatedEvent);
156
        $form->handleRequest($request);
157
        if ($form->isSubmitted()) {
158
            if ($form->get('cancel')->isClicked()) {
159
                $this->addFlash('status', 'Operation cancelled.');
160
161
                return $this->redirectToRoute('zikulausersmodule_account_menu');
162
            }
163
            if ($form->get('delete')->isClicked()) {
164
                $hookDispatcher->dispatch(UserManagementUiHooksSubscriber::DELETE_VALIDATE, $hook = new ValidationHook());
165
                $validHooks = true;
166
                if ($hook->getValidators()->hasErrors()) {
167
                    $message = implode('<br>', $hook->getValidators()->getErrors());
168
                    $this->addFlash('error', $message);
169
                    $validHooks = false;
170
                }
171
                if ($validHooks && $form->isValid()) {
172
                    $deletedUser = $userRepository->find($currentUserApi->get('uid'));
173
                    $deleteHelper->deleteUser($deletedUser);
0 ignored issues
show
Bug introduced by
It seems like $deletedUser can also be of type null; however, parameter $user of Zikula\UsersModule\Helpe...eteHelper::deleteUser() does only seem to accept Zikula\UsersModule\Entity\UserEntity, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

173
                    $deleteHelper->deleteUser(/** @scrutinizer ignore-type */ $deletedUser);
Loading history...
174
                    $eventDispatcher->dispatch(new DeleteUserFormPostValidatedEvent($form, $deletedUser));
0 ignored issues
show
Bug introduced by
It seems like $deletedUser can also be of type null; however, parameter $user of Zikula\UsersModule\Event...tedEvent::__construct() does only seem to accept Zikula\UsersModule\Entity\UserEntity, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

174
                    $eventDispatcher->dispatch(new DeleteUserFormPostValidatedEvent($form, /** @scrutinizer ignore-type */ $deletedUser));
Loading history...
175
                    $request->getSession()->invalidate(); // logout
176
                    $this->addFlash('success', 'Success. Account deleted!');
177
178
                    return $this->redirectToRoute('home');
179
                }
180
            }
181
        }
182
183
        return [
184
            'form' => $form->createView(),
185
            'additionalTemplates' => isset($deleteUserFormPostCreatedEvent) ? $deleteUserFormPostCreatedEvent->getTemplates() : []
186
        ];
187
    }
188
}
189