Code Duplication    Length = 263-263 lines in 2 locations

src/Models/EloquentModel.php 1 location

@@ 7-269 (lines=263) @@
4
5
use Arrilot\BitrixModels\Queries\UserQuery;
6
7
class EloquentModel extends BaseModel
8
{
9
    /**
10
     * Corresponding object class name.
11
     *
12
     * @var string
13
     */
14
    protected static $objectClass = 'CUser';
15
16
    /**
17
     * Have groups been already fetched from DB?
18
     *
19
     * @var bool
20
     */
21
    protected $groupsAreFetched = false;
22
23
    /**
24
     * Instantiate a query object for the model.
25
     *
26
     * @return UserQuery
27
     */
28
    public static function query()
29
    {
30
        return new UserQuery(static::instantiateObject(), get_called_class());
31
    }
32
33
    /**
34
     * Get a new instance for the current user.
35
     *
36
     * @param null $fields
37
     *
38
     * @return static
39
     */
40
    public static function current($fields = null)
41
    {
42
        global $USER;
43
44
        $user = new static($USER->getId());
45
46
        if (!is_null($fields)) {
47
            $user->fill($fields);
48
        }
49
50
        return $user;
51
    }
52
53
    /**
54
     * Fill extra fields when $this->field is called.
55
     *
56
     * @return null
57
     */
58
    protected function afterFill()
59
    {
60
        if (isset($this->fields['GROUP_ID']) && is_array(['GROUP_ID'])) {
61
            $this->groupsAreFetched = true;
62
        }
63
    }
64
65
    /**
66
     * Fill model groups if they are already known.
67
     * Saves DB queries.
68
     *
69
     * @param array $groups
70
     *
71
     * @return null
72
     */
73
    public function fillGroups($groups)
74
    {
75
        $this->fields['GROUP_ID'] = $groups;
76
77
        $this->groupsAreFetched = true;
78
    }
79
80
    /**
81
     * Get all model attributes from cache or database.
82
     *
83
     * @return array
84
     */
85
    public function get()
86
    {
87
        $this->getFields();
88
89
        $this->getGroups();
90
91
        return $this->fields;
92
    }
93
94
    /**
95
     * Get user groups from cache or database.
96
     *
97
     * @return array
98
     */
99
    public function getGroups()
100
    {
101
        if ($this->groupsAreFetched) {
102
            return $this->fields['GROUP_ID'];
103
        }
104
105
        return $this->refreshGroups();
106
    }
107
108
    /**
109
     * Refresh model from database and place data to $this->fields.
110
     *
111
     * @return array
112
     */
113
    public function refresh()
114
    {
115
        $this->refreshFields();
116
117
        $this->refreshGroups();
118
119
        return $this->fields;
120
    }
121
122
    /**
123
     * Refresh user fields and save them to a class field.
124
     *
125
     * @return array
126
     */
127
    public function refreshFields()
128
    {
129
        if ($this->id === null) {
130
            return  $this->fields = [];
131
        }
132
133
        $groupBackup = isset($this->fields['GROUP_ID']) ? $this->fields['GROUP_ID'] : null;
134
135
        $this->fields = static::query()->getById($this->id)->fields;
136
137
        if ($groupBackup) {
138
            $this->fields['GROUP_ID'] = $groupBackup;
139
        }
140
141
        $this->fieldsAreFetched = true;
142
143
        return $this->fields;
144
    }
145
146
    /**
147
     * Refresh user groups and save them to a class field.
148
     *
149
     * @return array
150
     */
151
    public function refreshGroups()
152
    {
153
        if ($this->id === null) {
154
            return [];
155
        }
156
157
        global $USER;
158
159
        $this->fields['GROUP_ID'] = $this->isCurrent()
160
            ? $USER->getUserGroupArray()
161
            : static::$bxObject->getUserGroup($this->id);
162
163
        $this->groupsAreFetched = true;
164
165
        return $this->fields['GROUP_ID'];
166
    }
167
168
    /**
169
     * Check if user is an admin.
170
     */
171
    public function isAdmin()
172
    {
173
        return $this->hasGroupWithId(1);
174
    }
175
176
    /**
177
     * Check if this user is the operating user.
178
     */
179
    public function isCurrent()
180
    {
181
        global $USER;
182
183
        return $USER->getId() && $this->id == $USER->getId();
184
    }
185
186
    /**
187
     * Check if user has role with a given ID.
188
     *
189
     * @param $role_id
190
     *
191
     * @return bool
192
     */
193
    public function hasGroupWithId($role_id)
194
    {
195
        return in_array($role_id, $this->getGroups());
196
    }
197
198
    /**
199
     * Check if user is authorized.
200
     *
201
     * @return bool
202
     */
203
    public function isAuthorized()
204
    {
205
        global $USER;
206
207
        return ($USER->getId() == $this->id) && $USER->isAuthorized();
208
    }
209
210
    /**
211
     * Check if user is guest.
212
     *
213
     * @return bool
214
     */
215
    public function isGuest()
216
    {
217
        return ! $this->isAuthorized();
218
    }
219
220
    /**
221
     * Logout user.
222
     *
223
     * @return void
224
     */
225
    public function logout()
226
    {
227
        global $USER;
228
229
        $USER->logout();
230
    }
231
232
    /**
233
     * Scope to get only users from a given group / groups.
234
     *
235
     * @param UserQuery $query
236
     * @param int|array $id
237
     *
238
     * @return UserQuery
239
     */
240
    public function scopeFromGroup($query, $id)
241
    {
242
        $query->filter['GROUPS_ID'] = $id;
243
244
        return $query;
245
    }
246
247
    /**
248
     * Substitute old group with the new one.
249
     *
250
     * @param int $old
251
     * @param int $new
252
     *
253
     * @return void
254
     */
255
    public function substituteGroup($old, $new)
256
    {
257
        $groups = $this->getGroups();
258
259
        if(($key = array_search($old, $groups)) !== false) {
260
            unset($groups[$key]);
261
        }
262
263
        if (!in_array($new, $groups)) {
264
            $groups[] = $new;
265
        }
266
267
        $this->fields['GROUP_ID'] = $groups;
268
    }
269
}
270

src/Models/UserModel.php 1 location

@@ 7-269 (lines=263) @@
4
5
use Arrilot\BitrixModels\Queries\UserQuery;
6
7
class UserModel extends BaseModel
8
{
9
    /**
10
     * Corresponding object class name.
11
     *
12
     * @var string
13
     */
14
    protected static $objectClass = 'CUser';
15
16
    /**
17
     * Have groups been already fetched from DB?
18
     *
19
     * @var bool
20
     */
21
    protected $groupsAreFetched = false;
22
23
    /**
24
     * Instantiate a query object for the model.
25
     *
26
     * @return UserQuery
27
     */
28
    public static function query()
29
    {
30
        return new UserQuery(static::instantiateObject(), get_called_class());
31
    }
32
33
    /**
34
     * Get a new instance for the current user.
35
     *
36
     * @param null $fields
37
     *
38
     * @return static
39
     */
40
    public static function current($fields = null)
41
    {
42
        global $USER;
43
44
        $user = new static($USER->getId());
45
46
        if (!is_null($fields)) {
47
            $user->fill($fields);
48
        }
49
50
        return $user;
51
    }
52
53
    /**
54
     * Fill extra fields when $this->field is called.
55
     *
56
     * @return null
57
     */
58
    protected function afterFill()
59
    {
60
        if (isset($this->fields['GROUP_ID']) && is_array(['GROUP_ID'])) {
61
            $this->groupsAreFetched = true;
62
        }
63
    }
64
65
    /**
66
     * Fill model groups if they are already known.
67
     * Saves DB queries.
68
     *
69
     * @param array $groups
70
     *
71
     * @return null
72
     */
73
    public function fillGroups($groups)
74
    {
75
        $this->fields['GROUP_ID'] = $groups;
76
77
        $this->groupsAreFetched = true;
78
    }
79
80
    /**
81
     * Get all model attributes from cache or database.
82
     *
83
     * @return array
84
     */
85
    public function get()
86
    {
87
        $this->getFields();
88
89
        $this->getGroups();
90
91
        return $this->fields;
92
    }
93
94
    /**
95
     * Get user groups from cache or database.
96
     *
97
     * @return array
98
     */
99
    public function getGroups()
100
    {
101
        if ($this->groupsAreFetched) {
102
            return $this->fields['GROUP_ID'];
103
        }
104
105
        return $this->refreshGroups();
106
    }
107
108
    /**
109
     * Refresh model from database and place data to $this->fields.
110
     *
111
     * @return array
112
     */
113
    public function refresh()
114
    {
115
        $this->refreshFields();
116
117
        $this->refreshGroups();
118
119
        return $this->fields;
120
    }
121
122
    /**
123
     * Refresh user fields and save them to a class field.
124
     *
125
     * @return array
126
     */
127
    public function refreshFields()
128
    {
129
        if ($this->id === null) {
130
            return  $this->fields = [];
131
        }
132
133
        $groupBackup = isset($this->fields['GROUP_ID']) ? $this->fields['GROUP_ID'] : null;
134
135
        $this->fields = static::query()->getById($this->id)->fields;
136
137
        if ($groupBackup) {
138
            $this->fields['GROUP_ID'] = $groupBackup;
139
        }
140
141
        $this->fieldsAreFetched = true;
142
143
        return $this->fields;
144
    }
145
146
    /**
147
     * Refresh user groups and save them to a class field.
148
     *
149
     * @return array
150
     */
151
    public function refreshGroups()
152
    {
153
        if ($this->id === null) {
154
            return [];
155
        }
156
157
        global $USER;
158
159
        $this->fields['GROUP_ID'] = $this->isCurrent()
160
            ? $USER->getUserGroupArray()
161
            : static::$bxObject->getUserGroup($this->id);
162
163
        $this->groupsAreFetched = true;
164
165
        return $this->fields['GROUP_ID'];
166
    }
167
168
    /**
169
     * Check if user is an admin.
170
     */
171
    public function isAdmin()
172
    {
173
        return $this->hasGroupWithId(1);
174
    }
175
176
    /**
177
     * Check if this user is the operating user.
178
     */
179
    public function isCurrent()
180
    {
181
        global $USER;
182
183
        return $USER->getId() && $this->id == $USER->getId();
184
    }
185
186
    /**
187
     * Check if user has role with a given ID.
188
     *
189
     * @param $role_id
190
     *
191
     * @return bool
192
     */
193
    public function hasGroupWithId($role_id)
194
    {
195
        return in_array($role_id, $this->getGroups());
196
    }
197
198
    /**
199
     * Check if user is authorized.
200
     *
201
     * @return bool
202
     */
203
    public function isAuthorized()
204
    {
205
        global $USER;
206
207
        return ($USER->getId() == $this->id) && $USER->isAuthorized();
208
    }
209
210
    /**
211
     * Check if user is guest.
212
     *
213
     * @return bool
214
     */
215
    public function isGuest()
216
    {
217
        return ! $this->isAuthorized();
218
    }
219
220
    /**
221
     * Logout user.
222
     *
223
     * @return void
224
     */
225
    public function logout()
226
    {
227
        global $USER;
228
229
        $USER->logout();
230
    }
231
232
    /**
233
     * Scope to get only users from a given group / groups.
234
     *
235
     * @param UserQuery $query
236
     * @param int|array $id
237
     *
238
     * @return UserQuery
239
     */
240
    public function scopeFromGroup($query, $id)
241
    {
242
        $query->filter['GROUPS_ID'] = $id;
243
244
        return $query;
245
    }
246
247
    /**
248
     * Substitute old group with the new one.
249
     *
250
     * @param int $old
251
     * @param int $new
252
     *
253
     * @return void
254
     */
255
    public function substituteGroup($old, $new)
256
    {
257
        $groups = $this->getGroups();
258
259
        if(($key = array_search($old, $groups)) !== false) {
260
            unset($groups[$key]);
261
        }
262
263
        if (!in_array($new, $groups)) {
264
            $groups[] = $new;
265
        }
266
267
        $this->fields['GROUP_ID'] = $groups;
268
    }
269
}
270