function social_group_welcome_message_group_content_insert in Open Social 8.8
Same name and namespace in other branches
- 8.9 modules/social_features/social_group/modules/social_group_welcome_message/social_group_welcome_message.module \social_group_welcome_message_group_content_insert()
- 10.3.x modules/social_features/social_group/modules/social_group_welcome_message/social_group_welcome_message.module \social_group_welcome_message_group_content_insert()
- 10.0.x modules/social_features/social_group/modules/social_group_welcome_message/social_group_welcome_message.module \social_group_welcome_message_group_content_insert()
- 10.1.x modules/social_features/social_group/modules/social_group_welcome_message/social_group_welcome_message.module \social_group_welcome_message_group_content_insert()
- 10.2.x modules/social_features/social_group/modules/social_group_welcome_message/social_group_welcome_message.module \social_group_welcome_message_group_content_insert()
Implements hook_ENTITY_TYPE_insert().
File
- modules/
social_features/ social_group/ modules/ social_group_welcome_message/ social_group_welcome_message.module, line 83 - Primary module hooks for social_group_welcome_message module.
Code
function social_group_welcome_message_group_content_insert(GroupContentInterface $group_content) {
$type = $group_content
->getContentPlugin()
->getPluginId();
$group = $group_content
->getGroup();
// If new membership is created.
if ($type === 'group_membership' && !$group
->get('private_message_send')
->isEmpty() && $group
->get('private_message_send')->value == 1 && !$group
->get('private_message_body')
->isEmpty()) {
$g_type_id = $group
->getGroupType()
->id();
// Load the account of the user who just joined.
$account = $group_content
->getEntity();
// Skip sending notifications to the owner of the group. They probably know
// they created the group a second ago.
if ($group
->getOwnerId() === $account
->id()) {
return;
}
// Get group admins entities.
$g_admins = $group
->getMembers($g_type_id . '-group_admin');
$g_admins_users = [];
/** @var \Drupal\group\GroupMembership $member */
foreach ($g_admins as $key => $member) {
$g_admins_users[$key] = $member
->getUser();
}
// Get group managers entities.
$g_managers = $group
->getMembers($g_type_id . '-group_manager');
$g_managers_users = [];
/** @var \Drupal\group\GroupMembership $member */
foreach ($g_managers as $key => $member) {
$g_managers_users[$key] = $member
->getUser();
}
// Set sender (owner) of the pm.
if (count($g_admins_users) === 1) {
list($owner) = $g_admins_users;
}
elseif (count($g_managers_users) > 0) {
list($owner) = $g_managers_users;
}
else {
$owner = $group
->getOwner();
}
// Merge all managers of the group to recipients array.
$recipients = array_merge($g_admins_users, $g_managers_users, [
$group
->getOwner(),
]);
// Add the joined user to the already existing recipients array.
$recipients[] = $account;
/** @var \Drupal\private_message\Service\PrivateMessageServiceInterface $private_message_service */
$private_message_service = \Drupal::service('private_message.service');
// Create a pm thread between these users.
$thread = $private_message_service
->getThreadForMembers($recipients);
// Get body of pm.
$private_message_body = $group
->get('private_message_body')
->first()
->getValue();
// Create a single message with the pm body.
$private_message = \Drupal::entityTypeManager()
->getStorage('private_message')
->create([
'owner' => $owner,
'message' => $private_message_body,
]);
$private_message
->save();
$thread
->addMessage($private_message)
->save();
// There is a contrib private message bug that when creating a new thread
// and adding messages to it, for the recipient the $last_message and
// $thread_last_check get the same timestamp. Showing no new messages badge.
// https://www.drupal.org/project/private_message/issues/3043898
// TODO:: Update to the correct version when issue has been solved.
/** @var UserDataInterface $userData */
$userData = \Drupal::service('user.data');
$userData
->set('private_message', $account
->id(), 'private_message_thread:' . $thread
->id(), 0);
}
}