You are here

function opigno_learning_path_group_membership_add_form_submit in Opigno Learning path 3.x

Same name and namespace in other branches
  1. 8 opigno_learning_path.module \opigno_learning_path_group_membership_add_form_submit()

Callback used in opigno_learning_path_form_alter().

1 string reference to 'opigno_learning_path_group_membership_add_form_submit'
opigno_learning_path_form_alter in ./opigno_learning_path.module
Implements hook_form_alter().

File

./opigno_learning_path.module, line 1528
Contains opigno_learning_path.module.

Code

function opigno_learning_path_group_membership_add_form_submit(array $form, FormStateInterface $form_state) {
  $options = $form_state
    ->getValue('training_users');
  $send_message = $form_state
    ->getValue('send_message');
  $message = $form_state
    ->getValue('message');

  // Load added users & classes from the form_state.
  $users = [];
  $classes = [];
  foreach ($options as $option) {
    [
      $type,
      $id,
    ] = explode('_', $option);
    if ($type === 'user') {
      $users[] = $id;
    }
    elseif ($type === 'class') {
      $classes[] = $id;
    }
  }
  $users = User::loadMultiple($users);
  $classes = Group::loadMultiple($classes);
  $need_clear_cache = count($classes) > 1;

  // Load the learning path group.

  /** @var \Drupal\group\Entity\Group $group */
  $group = \Drupal::routeMatch()
    ->getParameter('group');
  $is_class = $group
    ->getGroupType()
    ->id() == 'opigno_class';

  // Assign each class to the learning path.
  foreach ($classes as $class) {
    $db_connection = \Drupal::service('database');
    $is_class_added = $db_connection
      ->select('group_content_field_data', 'g_c_f_d')
      ->fields('g_c_f_d', [
      'id',
    ])
      ->condition('gid', $group
      ->id())
      ->condition('entity_id', $class
      ->id())
      ->condition('type', 'group_content_type_27efa0097d858')
      ->execute()
      ->fetchField();
    if (!$is_class_added) {

      /** @var \Drupal\group\Entity\Group $class */
      $group
        ->addContent($class, 'subgroup:opigno_class');

      // Rebuild module and theme data to escape cache warnings when add more then one class
      if ($need_clear_cache) {
        $module_data = \Drupal::service('extension.list.module')
          ->reset()
          ->getList();
        $files = [];
        $modules = [];
        foreach ($module_data as $name => $extension) {
          if ($extension->status) {
            $files[$name] = $extension;
            $modules[$name] = $extension->weight;
          }
        }
        $modules = module_config_sort($modules);
        \Drupal::service('kernel')
          ->updateModules($modules, $files);
        $module_handler = \Drupal::moduleHandler();
        $module_handler
          ->loadAll();
        $module_handler
          ->invokeAll('rebuild');
      }

      // Add class members to the users.
      $members = $class
        ->getMembers();
      foreach ($members as $member) {

        /** @var \Drupal\group\GroupMembership $member */
        $user = $member
          ->getUser();
        $users[$user
          ->id()] = $user;
      }
    }
  }

  // Add each user to the learning path & send email.
  foreach ($users as $user) {
    if (!isset($user)) {
      continue;
    }

    // If user is already in learning path, do nothing.
    $existing = $group
      ->getMember($user);
    if ($existing !== FALSE) {
      continue;
    }

    // Add user to the learning path.

    /** @var \Drupal\user\Entity\User $user */
    $group
      ->addMember($user);
    if ($is_class) {
      $group_roles = $form_state
        ->getValue('group_roles');

      // Set new member roles.
      if ($group_roles) {
        if ($member = $group
          ->getMember($user)) {
          $group_content = $member
            ->getGroupContent();
          $group_roles_new = $group_content
            ->get('group_roles')
            ->getValue();
          foreach ($group_roles as $group_role) {
            $found = FALSE;
            $role = $group_role['target_id'];
            foreach ($group_roles_new as $index => $value) {
              if ($value['target_id'] === $role) {
                $found = TRUE;
                unset($group_roles_new[$index]);
                break;
              }
            }
            if ($found === FALSE) {
              $group_roles_new[] = [
                'target_id' => $role,
              ];
            }
          }
          try {
            $group_content
              ->set('group_roles', $group_roles_new);
            $group_content
              ->save();
          } catch (\Exception $e) {
            \Drupal::logger('opigno_learning_path')
              ->error($e
              ->getMessage());
            \Drupal::messenger()
              ->addMessage($e
              ->getMessage(), 'error');
          }
        }
      }
    }
    if ($send_message) {

      // Send email.
      $module = 'opigno_learning_path';
      $key = 'opigno_learning_path_add_membership';
      $email = $user
        ->getEmail();
      $lang = $user
        ->getPreferredLangcode();
      $params = [];
      $params['subject'] = t('Opigno notification');
      $params['message'] = $message ? $message : t('I invite you to take part in my learning program to boost your skills');
      \Drupal::service('plugin.manager.mail')
        ->mail($module, $key, $email, $lang, $params);
    }
  }
  $form_state
    ->setRedirect('opigno_learning_path.membership.overview', [
    'group' => $group
      ->id(),
  ]);
}