Skip to content

Commit

Permalink
EVENT_DEFINE_DEFAULT_USER_GROUPS
Browse files Browse the repository at this point in the history
  • Loading branch information
brandonkelly committed Sep 10, 2023
1 parent b000b4c commit 2cad99d
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 22 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@

- Added the `@stripTags` and `@trim` GraphQL directives. ([#9971](https://github.com/craftcms/cms/discussions/9971))
- Added `SK` to the list of keywords that Craft will look for when determining whether a value is sensitive and should be redacted from logs, etc. ([#3619](https://github.com/craftcms/cms/issues/3619))
- Added `craft\events\DefineUserGroupsEvent`.
- Added `craft\services\Users::EVENT_DEFINE_DEFAULT_USER_GROUPS`. ([#12283](https://github.com/craftcms/cms/issues/12283))
- Added `craft\services\Users::getDefaultUserGroups()`.
- `craft\events\UserAssignGroupEvent` now extends `DefineUserGroupsEvent`, giving it a new `$userGroups` property.
- Deprecated `craft\events\UserAssignGroupEvent`. `DefineUserGroupsEvent` should be used instead.
- Fixed a bug where changed fields weren’t being tracked properly when applying a draft for a multi-site entry.
- `craft\services\Elements::duplicateElement()` now supports passing a `siteAttributes` array to the `$attributes` argument, for setting site-specific attributes.
- Fixed an error that could occur when executing a GraphQL query with fragments. ([#13622](https://github.com/craftcms/cms/issues/13622))
Expand Down
9 changes: 3 additions & 6 deletions src/controllers/UsersController.php
Original file line number Diff line number Diff line change
Expand Up @@ -1423,12 +1423,9 @@ public function actionSaveUser(): ?Response
// set the default group on the user, so that any content
// based on user group condition can be validated and saved against them
if ($isPublicRegistration) {
$defaultGroupUid = Craft::$app->getProjectConfig()->get('users.defaultGroup');
if ($defaultGroupUid) {
$group = Craft::$app->userGroups->getGroupByUid($defaultGroupUid);
if ($group) {
$user->setGroups([$group]);
}
$groups = Craft::$app->getUsers()->getDefaultUserGroups($user);
if (!empty($groups)) {
$user->setGroups($groups);
}
}

Expand Down
24 changes: 24 additions & 0 deletions src/events/DefineUserGroupsEvent.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php
/**
* @link https://craftcms.com/
* @copyright Copyright (c) Pixel & Tonic, Inc.
* @license https://craftcms.github.io/license/
*/

namespace craft\events;

use craft\models\UserGroup;

/**
* Define user groups event class.
*
* @author Pixel & Tonic, Inc. <support@pixelandtonic.com>
* @since 4.5.4
*/
class DefineUserGroupsEvent extends UserEvent
{
/**
* @var UserGroup[] The user groups to assign to the user
*/
public array $userGroups;
}
7 changes: 2 additions & 5 deletions src/events/UserAssignGroupEvent.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,8 @@
*
* @author Pixel & Tonic, Inc. <support@pixelandtonic.com>
* @since 3.0.0
* @deprecated in 4.5.4. [[DefineUserGroupsEvent]] should be used instead.
*/
class UserAssignGroupEvent extends CancelableEvent
class UserAssignGroupEvent extends DefineUserGroupsEvent
{
/**
* @var User The user model associated with this event
*/
public User $user;
}
57 changes: 46 additions & 11 deletions src/services/Users.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
use craft\errors\UserNotFoundException;
use craft\errors\VolumeException;
use craft\events\ConfigEvent;
use craft\events\DefineUserGroupsEvent;
use craft\events\UserAssignGroupEvent;
use craft\events\UserEvent;
use craft\events\UserGroupsAssignEvent;
Expand All @@ -32,6 +33,7 @@
use craft\helpers\Template;
use craft\helpers\UrlHelper;
use craft\models\FieldLayout;
use craft\models\UserGroup;
use craft\models\Volume;
use craft\records\User as UserRecord;
use craft\web\Request;
Expand Down Expand Up @@ -143,6 +145,13 @@ class Users extends Component
*/
public const EVENT_AFTER_ASSIGN_USER_TO_GROUPS = 'afterAssignUserToGroups';

/**
* @event DefineUserGroupsEvent The event that is triggered when defining the default user groups to assign to a publicly-registered user.
* @see getDefaultUserGroups()
* @since 4.5.4
*/
public const EVENT_DEFINE_DEFAULT_USER_GROUPS = 'defineDefaultUserGroups';

/**
* @event UserAssignGroupEvent The event that is triggered before a user is assigned to the default user group.
*
Expand Down Expand Up @@ -1344,7 +1353,37 @@ public function assignUserToGroups(int $userId, array $groupIds): bool
}

/**
* Assigns a user to the default user group.
* Returns the default user groups that the given user should belong to.
*
* @param User $user
* @return UserGroup[]
* @since 4.5.4
*/
public function getDefaultUserGroups(User $user): array
{
$groups = [];
$uid = Craft::$app->getProjectConfig()->get('users.defaultGroup');
if ($uid) {
$group = Craft::$app->getUserGroups()->getGroupByUid($uid);
if ($group) {
$groups[] = $group;
}
}

if ($this->hasEventHandlers(self::EVENT_DEFINE_DEFAULT_USER_GROUPS)) {
$event = new DefineUserGroupsEvent([
'user' => $user,
'userGroups' => $groups,
]);
$this->trigger(self::EVENT_DEFINE_DEFAULT_USER_GROUPS, $event);
return $event->userGroups;
}

return $groups;
}

/**
* Assigns a user to the default user group(s).
*
* This method is called toward the end of a public registration request.
*
Expand All @@ -1353,37 +1392,33 @@ public function assignUserToGroups(int $userId, array $groupIds): bool
*/
public function assignUserToDefaultGroup(User $user): bool
{
// Make sure there's a default group
$uid = Craft::$app->getProjectConfig()->get('users.defaultGroup');

if (!$uid) {
return false;
}

$group = Craft::$app->getUserGroups()->getGroupByUid($uid);
$groups = $this->getDefaultUserGroups($user);

if (!$group) {
if (empty($groups)) {
return false;
}

// Fire a 'beforeAssignUserToDefaultGroup' event
$event = new UserAssignGroupEvent([
'user' => $user,
'userGroups' => $groups,
]);
$this->trigger(self::EVENT_BEFORE_ASSIGN_USER_TO_DEFAULT_GROUP, $event);

if (!$event->isValid) {
return false;
}

if (!$this->assignUserToGroups($user->id, [$group->id])) {
$groupIds = array_map(fn(UserGroup $group) => $group->id, $groups);
if (!$this->assignUserToGroups($user->id, $groupIds)) {
return false;
}

// Fire an 'afterAssignUserToDefaultGroup' event
if ($this->hasEventHandlers(self::EVENT_AFTER_ASSIGN_USER_TO_DEFAULT_GROUP)) {
$this->trigger(self::EVENT_AFTER_ASSIGN_USER_TO_DEFAULT_GROUP, new UserAssignGroupEvent([
'user' => $user,
'userGroups' => $groups,
]));
}

Expand Down

0 comments on commit 2cad99d

Please sign in to comment.