social_course-8.x-2.11/modules/social_course_advanced/social_course_advanced.install

modules/social_course_advanced/social_course_advanced.install
<?php

/**
 * @file
 * Requirements and update functions for the social_course_advanced module.
 */

use Drupal\Core\Config\FileStorage;
use Drupal\group\Entity\GroupRoleInterface;
use Drupal\group\GroupMembership;
use Drupal\social_group\Entity\Group;
use Drupal\user\Entity\User;
use Drupal\user\RoleInterface;

/**
 * Implements hook_install().
 *
 * Perform actions related to the installation of social_course_advanced.
 */
function social_course_advanced_install(): void {
  // Anonymous.
  $permissions[RoleInterface::ANONYMOUS_ID] = [
    'view public course_advanced group',
  ];
  // Authenticated.
  $permissions[RoleInterface::AUTHENTICATED_ID] = $permissions[RoleInterface::ANONYMOUS_ID];
  // Verified.
  $permissions['verified'] = [
    ...$permissions[RoleInterface::AUTHENTICATED_ID],
    ...[
      'view community course_advanced group',
      'view members course_advanced group',
    ],
  ];
  // Content manager.
  $permissions['contentmanager'] = [
    ...$permissions['verified'],
    ...['create course_advanced group'],
  ];
  // Site manager.
  $permissions['sitemanager'] = $permissions['contentmanager'];

  foreach ($permissions as $rid => $new_permissions) {
    user_role_grant_permissions($rid, $new_permissions);
  }

  // Enable Social Group Default Route module if it exists.
  if (!(\Drupal::moduleHandler()->moduleExists('social_group_default_route'))) {
    \Drupal::service('module_installer')->install(['social_group_default_route']);
  }
}

/**
 * Implements hook_update_dependencies().
 */
function social_course_advanced_update_dependencies(): array {
  // We need to run hook 13001, to install the new view.
  $dependencies['social_course_advanced'][13012] = [
    'social_course' => 13001,
  ];

  return $dependencies;
}

/**
 * Add the field_flexible_group_visibility field to the course_advanced group.
 */
function social_course_advanced_update_8001(): void {
  $config_path = \Drupal::service('extension.list.module')->getPath('module', 'social_course_advanced') . '/config/install';
  $source = new FileStorage($config_path);
  $config_storage = \Drupal::service('config.storage');

  $config_names = [
    'field.field.group.course_advanced.field_flexible_group_visibility',
    'field.field.group.course_advanced.field_group_allowed_visibility',
  ];

  foreach ($config_names as $config_name) {
    $data = $source->read($config_name);
    if (is_array($data)) {
      $config_storage->write($config_name, $data);
    }
  }
}

/**
 * Add view group permission for the anonymous users.
 */
function social_course_advanced_update_8004(): void {
  $config_name = 'group.role.course_advanced-anonymous';
  $config = \Drupal::configFactory()->getEditable($config_name);
  $permissions = $config->get('permissions');
  $permissions[] = 'view group';

  $config->set('permissions', $permissions)->save();
}

/**
 * Configuration update: change form display.
 */
function social_course_advanced_update_8005(): string {
  /** @var \Drupal\update_helper\Updater $updateHelper */
  $updateHelper = \Drupal::service('update_helper.updater');

  // Execute configuration update definitions with logging of success.
  $updateHelper->executeUpdate('social_course_advanced', 'social_course_advanced_update_8001');

  // Output logged messages to related channel of update execution.
  return $updateHelper->logger()->output();
}

/**
 * Set field_flexible_group_visibility as public by default.
 */
function social_course_advanced_update_8006(): void {
  $group_storage = \Drupal::entityTypeManager()->getStorage('group');
  $course_ids = $group_storage
    ->getQuery()
    ->accessCheck(TRUE)
    ->condition('type', 'course_advanced')
    ->execute();

  foreach ($course_ids as $course_id) {
    /** @var \Drupal\group\Entity\GroupInterface $course */
    $course = $group_storage->load($course_id);
    if ($course->hasField('field_flexible_group_visibility')) {
      $course->set('field_flexible_group_visibility', 'public');
      $course->save();
    }
  }
}

/**
 * Set field_group_allowed_visibility as community by default.
 */
function social_course_advanced_update_8007(): void {
  $group_storage = \Drupal::entityTypeManager()->getStorage('group');
  $course_ids = $group_storage
    ->getQuery()
    ->accessCheck(TRUE)
    ->condition('type', 'course_advanced')
    ->execute();

  foreach ($course_ids as $course_id) {
    /** @var \Drupal\group\Entity\GroupInterface $course */
    $course = $group_storage->load($course_id);
    if ($course->hasField('field_group_allowed_visibility')) {
      $course->set('field_group_allowed_visibility', ['community']);
      $course->save();
    }
  }
}

/**
 * Fix "Course Advanced" form display.
 */
function social_course_advanced_update_8008(): void {
  $config = \Drupal::configFactory()->getEditable('core.entity_form_display.group.course_advanced.default');
  $config->set('third_party_settings.field_group.group_date_and_time.parent_name', 'group_settings');
  $config->save();
}

/**
 * Remove redundant field group "Related courses" for "Course Advanced".
 */
function social_course_advanced_update_8901(): void {
  if ($group = field_group_load_field_group('group_related_courses', 'group', 'course_advanced', 'form', 'default')) {
    field_group_delete_field_group($group);
  }
}

/**
 * Add translations support for "Course Advanced" group type.
 */
function social_course_advanced_update_8902(): string {
  /** @var \Drupal\update_helper\Updater $updateHelper */
  $updateHelper = \Drupal::service('update_helper.updater');

  // Execute configuration update definitions with logging of success.
  $updateHelper->executeUpdate('social_course_advanced', 'social_course_advanced_update_8902');

  // Output logged messages to related channel of update execution.
  return $updateHelper->logger()->output();
}

/**
 * Configuration update: add path alias field.
 */
function social_course_advanced_update_8903(): string {
  /** @var \Drupal\update_helper\Updater $updateHelper */
  $updateHelper = \Drupal::service('update_helper.updater');

  // Execute configuration update definitions with logging of success.
  $updateHelper->executeUpdate('social_course_advanced', 'social_course_advanced_update_8903');

  // Output logged messages to related channel of update execution.
  return $updateHelper->logger()->output();
}

/**
 * Add a new view mode for group content for "Advanced Course" group type.
 */
function social_course_advanced_update_8904(): void {
  // Install new configs.
  $config_path = \Drupal::service('extension.list.module')->getPath('module', 'social_course_advanced') . '/config/install';
  $source = new FileStorage($config_path);
  $config_storage = \Drupal::service('config.storage');

  $config_names = [
    'core.entity_view_display.group_content.course_advanced-group_node-event.activity',
    'core.entity_view_display.group_content.course_advanced-group_node-topic.activity',
  ];

  foreach ($config_names as $name) {
    $data = $source->read($name);
    if (is_array($data)) {
      $config_storage->write($name, $data);
    }
  }
}

/**
 * Disable revisions for Advanced Courses.
 */
function social_course_advanced_update_8905(): string {
  /** @var \Drupal\update_helper\Updater $updateHelper */
  $updateHelper = \Drupal::service('update_helper.updater');

  // Execute configuration update definitions with logging of success.
  $updateHelper->executeUpdate('social_course_advanced', 'social_course_advanced_update_8905');

  // Output logged messages to related channel of update execution.
  return $updateHelper->logger()->output();
}

/**
 * Replace deprecated group permissions for course_advanced.
 */
function social_course_advanced_update_13001(): void {
  _social_course_update_group_permissions('course_advanced');
}

/**
 * Move group_admin to group_manager group role for course_advanced.
 *
 * @param array $sandbox
 *   Stores information for batch updates. See above for more information.
 *
 * @return string
 *   Displays a message about results to user after the update has completed.
 */
function social_course_advanced_update_13002(array &$sandbox): string {
  if (!isset($sandbox['progress'])) {
    $db = \Drupal::database();

    // Fetch users with group_admin role that should be updated.
    $query = $db->select('group_content__group_roles', 'gcgr');
    $query->addField('gcgr', 'entity_id');
    $query->addField('grfd', 'entity_id', 'uid');
    $query->addField('grfd', 'gid');
    $query->condition('gcgr.group_roles_target_id', 'course_advanced-group_admin');

    $query->join('group_relationship_field_data', 'grfd', 'grfd.id = gcgr.entity_id');

    $sandbox['ids'] = $query->execute()->fetchAllAssoc('entity_id');

    $sandbox['max'] = count($sandbox['ids']);
    $sandbox['progress'] = 0;
  }
  $items = array_slice($sandbox['ids'], $sandbox['progress'], 25);
  foreach ($items as $item) {
    $updated = FALSE;
    $account = User::load($item->uid);
    $group = Group::load($item->gid);
    $manager_role = 'course_advanced-group_manager';

    /** @var \Drupal\group\GroupMembership $membership */
    $membership = $group->getMember($account);

    if (
      $membership instanceof GroupMembership &&
      $account instanceof UserInterface &&
      $group instanceof GroupInterface
    ) {
      $group_relationship = $membership->getGroupRelationship();
      $member_assigned_roles = array_column($group_relationship->get('group_roles')->getValue(), 'target_id');

      // Apply group role update only for SM/CM role.
      if ($account->hasRole('sitemanager') || $account->hasRole('contentmanager')) {

        // Assign owner a GM role group.
        if ($account->id() === $group->getOwnerId()) {
          // Only if it doesn't assigned yet.
          if (!in_array($manager_role, $member_assigned_roles)) {
            $member_assigned_roles[] = $manager_role;
            $member_assigned_roles = array_map(function ($member_assigned_role) {
              return ['target_id' => $member_assigned_role];
            }, $member_assigned_roles);
            $updated = TRUE;
          }
        }
      }
      // Remove deprecated Group Admin role.
      $admin_role = 'course_advanced-group_admin';
      if (in_array($admin_role, $member_assigned_roles)) {
        $key = array_search($admin_role, $member_assigned_roles);
        unset($member_assigned_roles[$key]);

        $member_assigned_roles = array_map(function ($member_assigned_role) {
          return ['target_id' => $member_assigned_role];
        }, $member_assigned_roles);
        $updated = TRUE;
      }

      // Save updated assigned roles.
      if ($updated) {
        $group_relationship->set('group_roles', $member_assigned_roles);
        $group_relationship->save();
      }
    }
    $sandbox['progress']++;
  }
  $sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['progress'] / $sandbox['max']);
  // Show a status update for the current progress.
  return t("Checked @progress from @max users.", [
    '@progress' => $sandbox['progress'],
    '@max' => $sandbox['max'],
  ]);
}

/**
 * Create Admin/CM/CS insider roles and delete "group admin" role.
 */
function social_course_advanced_update_13003(): string {
  $config_factory = \Drupal::configFactory();
  $config_path = \Drupal::service('extension.list.module')->getPath('social_course_advanced') . '/config/static';
  $source = new FileStorage($config_path);

  // Created new roles.
  foreach (['admin', 'cm', 'sm'] as $id) {
    $config_name = "group.role.course_advanced-{$id}-insider";
    $data = $source->read($config_name);
    if (is_array($data)) {
      $config_factory->getEditable($config_name)
        ->setData($data)
        ->save();
    }
  }

  // Delete deprecated role.
  $config_factory->getEditable('group.role.course_advanced-group_admin')->delete();

  // Update CM role and related configs.
  /** @var \Drupal\update_helper\Updater $updater */
  $updater = \Drupal::service('update_helper.updater');
  // Execute configuration update definitions with logging of success.
  $updater->executeUpdate('social_course_advanced', __FUNCTION__);
  // Output logged messages to related channel of update execution.
  return $updater->logger()->output();
}

/**
 * Allow course leaders to perform CRUD operations on "Article" and "Video".
 */
function social_course_advanced_update_13004(): void {
  /** @var \Drupal\group\Entity\GroupRole $course_leader */
  $course_leader = \Drupal::entityTypeManager()
    ->getStorage('group_role')
    ->load('course_advanced-group_manager');
  $course_leader->grantPermissions([
    'create course_article',
    'view course_article',
    'update course_article',
    'delete course_article',
    'create course_video',
    'view course_video',
    'update course_video',
    'delete course_video',
  ]);
  $course_leader->save();
}

/**
 * Add 'Verified' group role.
 */
function social_course_advanced_update_13005(): string {
  /** @var \Drupal\update_helper\Updater $updateHelper */
  $updateHelper = \Drupal::service('update_helper.updater');

  // Execute configuration update definitions with logging of success.
  $updateHelper->executeUpdate('social_course_advanced', __FUNCTION__);

  // Output logged messages to related channel of update execution.
  return $updateHelper->logger()->output();
}

/**
 * Revoke group permissions for Outsider role.
 */
function social_course_advanced_update_13006(): void {
  $roles_permissions = [
    'course_advanced-outsider' => [
      'view group_membership relationship',
    ],
  ];

  foreach ($roles_permissions as $role_id => $permissions) {
    /** @var \Drupal\group\Entity\GroupRoleInterface $role */
    $role = \Drupal::entityTypeManager()->getStorage('group_role')->load($role_id);

    foreach ($permissions as $permission) {
      $role->revokePermission($permission);
    }

    $role->save();
  }
}

/**
 * Improve "Small teaser" view mode.
 */
function social_course_advanced_update_13007(): string {
  /** @var \Drupal\update_helper\Updater $updateHelper */
  $updateHelper = \Drupal::service('update_helper.updater');
  $updateHelper->executeUpdate('social_course_advanced', __FUNCTION__);
  return $updateHelper->logger()->output();
}

/**
 * Revoke "Join Group" permission for Authenticated (outsider) group role.
 */
function social_course_advanced_update_13008(): void {
  $group_authenticated_role = \Drupal::entityTypeManager()
    ->getStorage('group_role')
    ->load('course_advanced-outsider');

  if ($group_authenticated_role instanceof GroupRoleInterface) {
    $group_authenticated_role->revokePermissions([
      'join group',
      'request group membership',
    ])->save();
  }

}

/**
 * Grant permissions for Verified (outsider) group role.
 */
function social_course_advanced_update_13009(): void {
  $group_verified_role = \Drupal::entityTypeManager()
    ->getStorage('group_role')
    ->load('course_advanced-verified');

  if ($group_verified_role instanceof GroupRoleInterface) {
    $group_verified_role->grantPermissions([
      'join group',
      'request group membership',
    ])->save();
  }

}

/**
 * Grant permissions for Verified, Anonymous and Authenticated group role.
 */
function social_course_advanced_update_13010(): void {
  $roles_permissions = [
    'course_advanced-anonymous' => [
      'view group_node:event entity',
      'view group_node:event relationship',
      'view group_node:topic entity',
      'view group_node:topic relationship',
      'view group_node:course_section entity',
      'view group_node:course_section relationship',
    ],
    'course_advanced-outsider' => [
      'view group_node:event entity',
      'view group_node:event relationship',
      'view group_node:topic entity',
      'view group_node:topic relationship',
    ],
    'course_advanced-verified' => [
      'view group_node:event entity',
      'view group_node:event relationship',
      'view group_node:topic entity',
      'view group_node:topic relationship',
    ],
  ];

  foreach ($roles_permissions as $role => $permissions) {
    $role = \Drupal::entityTypeManager()
      ->getStorage('group_role')
      ->load($role);

    if ($role instanceof GroupRoleInterface) {
      $role->grantPermissions($permissions)->save();
    }
  }

}

/**
 * Enable Social Group Default Route module if it exists.
 */
function social_course_advanced_update_13011(): void {
  if (!(\Drupal::moduleHandler()->moduleExists('social_group_default_route'))) {
    \Drupal::service('module_installer')->install(['social_group_default_route']);
  }
}

/**
 * Grant new permissions to access to Advanced Courses.
 */
function social_course_advanced_update_13012(): void {
  $permissions[RoleInterface::ANONYMOUS_ID] =
  $permissions[RoleInterface::AUTHENTICATED_ID] = ['view public course_advanced group'];
  $permissions['verified'] = [
    ...$permissions[RoleInterface::AUTHENTICATED_ID],
    ...[
      'view community course_advanced group',
      'view members course_advanced group',
    ],
  ];
  $permissions['contentmanager'] = $permissions['sitemanager'] = $permissions['verified'];

  foreach ($permissions as $rid => $new_permissions) {
    user_role_grant_permissions($rid, $new_permissions);
  }
}

/**
 * Update the new hubs view.
 */
function social_course_advanced_update_13013(): string {
  /** @var \Drupal\update_helper\UpdaterInterface $update_helper */
  $update_helper = \Drupal::service('update_helper.updater');
  $update_helper->executeUpdate('social_course_advanced', __FUNCTION__);
  return $update_helper->logger()->output();
}

/**
 * Update the group visibility field description.
 */
function social_course_advanced_update_13014(): void {
  $field_config = \Drupal::configFactory()
    ->getEditable('field.field.group.course_advanced.field_flexible_group_visibility');

  $field_config->set('label', 'Visibility');
  $field_config->set('description', 'Who can find and view your course');
  $field_config->save();
}

/**
 * Add third_party_settings for advanced course group roles.
 */
function social_course_advanced_update_13015(): string {
  /** @var \Drupal\update_helper\UpdaterInterface $update_helper */
  $update_helper = \Drupal::service('update_helper.updater');
  $update_helper->executeUpdate('social_course_advanced', __FUNCTION__);
  return $update_helper->logger()->output();
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc