Completed
Push — master ( 6c1fd7...c06421 )
by Craig
06:11 queued 49s
created

ExtensionMenu::getAccount()   B

Complexity

Conditions 6
Paths 10

Size

Total Lines 30
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 23
nc 10
nop 0
dl 0
loc 30
rs 8.9297
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\Menu;
15
16
use Knp\Menu\FactoryInterface;
17
use Knp\Menu\ItemInterface;
18
use Zikula\ExtensionsModule\Api\ApiInterface\VariableApiInterface;
19
use Zikula\MenuModule\ExtensionMenu\ExtensionMenuInterface;
20
use Zikula\PermissionsModule\Api\ApiInterface\PermissionApiInterface;
21
use Zikula\SettingsModule\Api\ApiInterface\LocaleApiInterface;
22
use Zikula\UsersModule\Api\ApiInterface\CurrentUserApiInterface;
23
use Zikula\UsersModule\Constant as UsersConstant;
24
25
class ExtensionMenu implements ExtensionMenuInterface
26
{
27
    /**
28
     * @var FactoryInterface
29
     */
30
    private $factory;
31
32
    /**
33
     * @var PermissionApiInterface
34
     */
35
    private $permissionApi;
36
37
    /**
38
     * @var VariableApiInterface
39
     */
40
    private $variableApi;
41
42
    /**
43
     * @var CurrentUserApiInterface
44
     */
45
    private $currentUser;
46
47
    /**
48
     * @var LocaleApiInterface
49
     */
50
    private $localeApi;
51
52
    public function __construct(
53
        FactoryInterface $factory,
54
        PermissionApiInterface $permissionApi,
55
        VariableApiInterface $variableApi,
56
        CurrentUserApiInterface $currentUserApi,
57
        LocaleApiInterface $localeApi
58
    ) {
59
        $this->factory = $factory;
60
        $this->permissionApi = $permissionApi;
61
        $this->variableApi = $variableApi;
62
        $this->currentUser = $currentUserApi;
63
        $this->localeApi = $localeApi;
64
    }
65
66
    public function get(string $type = self::TYPE_ADMIN): ?ItemInterface
67
    {
68
        if (self::TYPE_ADMIN === $type) {
69
            return $this->getAdmin();
70
        }
71
        if (self::TYPE_ACCOUNT === $type) {
72
            return $this->getAccount();
73
        }
74
        if (self::TYPE_USER === $type) {
75
            return $this->getUser();
76
        }
77
78
        return null;
79
    }
80
81
    private function getAdmin(): ?ItemInterface
82
    {
83
        $menu = $this->factory->createItem('usersAdminMenu');
84
        if ($this->permissionApi->hasPermission($this->getBundleName() . '::', '::', ACCESS_MODERATE)) {
85
            $menu->addChild('Users list', [
86
                'route' => 'zikulausersmodule_useradministration_list',
87
            ])->setAttribute('icon', 'fas fa-list');
88
        }
89
        if ($this->permissionApi->hasPermission($this->getBundleName() . '::', '::', ACCESS_ADMIN)) {
90
            $menu->addChild('Settings', [
91
                'route' => 'zikulausersmodule_config_config',
92
            ])->setAttribute('icon', 'fas fa-wrench');
93
            $menu->addChild('Authentication methods', [
94
                'route' => 'zikulausersmodule_config_authenticationmethods',
95
            ])->setAttribute('icon', 'fas fa-lock');
96
        }
97
        if ($this->permissionApi->hasPermission($this->getBundleName() . '::', '::', ACCESS_MODERATE)) {
98
            $menu->addChild('Export users', [
99
                'route' => 'zikulausersmodule_fileio_export',
100
            ])->setAttribute('icon', 'fas fa-download');
101
            $menu->addChild('Find & Mail|Delete users', [
102
                'route' => 'zikulausersmodule_useradministration_search',
103
            ])->setAttribute('icon', 'fas fa-search');
104
        }
105
106
        return 0 === $menu->count() ? null : $menu;
107
    }
108
109
    private function getAccount(): ?ItemInterface
110
    {
111
        $menu = $this->factory->createItem('usersAccountMenu');
112
        if (!$this->currentUser->isLoggedIn()) {
113
            $menu->addChild('Login', [
114
                'label' => 'I would like to login',
115
                'route' => 'zikulausersmodule_access_login',
116
            ])->setAttribute('icon', 'fas fa-sign-in-alt');
117
            if ($this->variableApi->get($this->getBundleName(), UsersConstant::MODVAR_REGISTRATION_ENABLED, UsersConstant::DEFAULT_REGISTRATION_ENABLED)) {
118
                $menu->addChild('New account', [
119
                    'label' => 'I would like to create a new account',
120
                    'route' => 'zikulausersmodule_registration_register',
121
                ])->setAttribute('icon', 'fas fa-plus');
122
            }
123
        } else {
124
            if ($this->variableApi->getSystemVar('multilingual')) {
125
                $locales = $this->localeApi->getSupportedLocales();
126
                if (count($locales) > 1) {
127
                    $menu->addChild('Language switcher', [
128
                        'route' => 'zikulausersmodule_account_changelanguage',
129
                    ])->setAttribute('icon', 'fas fa-language');
130
                }
131
            }
132
            $menu->addChild('Log out', [
133
                'route' => 'zikulausersmodule_access_logout',
134
            ])->setAttribute('icon', 'fas fa-power-off')
135
                ->setLinkAttribute('class', 'text-danger');
136
        }
137
138
        return 0 === $menu->count() ? null : $menu;
139
    }
140
141
    private function getUser(): ?ItemInterface
142
    {
143
        $menu = $this->factory->createItem('usersUserMenu');
144
145
        if (!$this->currentUser->isLoggedIn()) {
146
            $menu->addChild('Help', [
147
                'route' => 'zikulausersmodule_account_menu',
148
            ])->setAttribute('icon', 'text-danger fas fa-ambulance');
149
            if ($this->variableApi->get($this->getBundleName(), UsersConstant::MODVAR_REGISTRATION_ENABLED)) {
150
                $menu->addChild('New account', [
151
                    'route' => 'zikulausersmodule_registration_register',
152
                ])->setAttribute('icon', 'fas fa-plus');
153
            }
154
        } else {
155
            $menu->addChild('Account menu', [
156
                'route' => 'zikulausersmodule_account_menu',
157
            ])->setAttribute('icon', 'fas fa-user-circle');
158
        }
159
160
        return 0 === $menu->count() ? null : $menu;
161
    }
162
163
    public function getBundleName(): string
164
    {
165
        return 'ZikulaUsersModule';
166
    }
167
}
168