You are here

public function CourseController::renderTake in Course 3.x

Same name and namespace in other branches
  1. 8.3 src/Controller/CourseController.php \Drupal\course\Controller\CourseController::renderTake()
  2. 8.2 src/Controller/CourseController.php \Drupal\course\Controller\CourseController::renderTake()

Take a course.

If allowed to enroll:

  • If the user hasn't answered enrollment questions, make them fill it out.

If enrolled:

  • If the user hasn't answered enrollment questions, make them fill it out.
  • Enroll the user.
  • Fire the outline handler.

If not enrolled:

  • Show access blocker.

File

src/Controller/CourseController.php, line 150

Class

CourseController

Namespace

Drupal\course\Controller

Code

public function renderTake(Course $course) {
  $account = Drupal::currentUser();
  $enroll_access = $course
    ->access('enroll', $account, TRUE);
  $enrollment = $course
    ->getEnrollment($account);

  /* @var $enrollment Drupal\course\Entity\CourseEnrollment */
  if ($enroll_access
    ->isAllowed() && (!$enrollment || $enrollment
    ->get('timestamp')
    ->isEmpty())) {

    // User can enroll in this course and user is not enrolled. Check for
    // enrollment fields or enroll the user.
    $instances = Drupal::service('entity_field.manager')
      ->getFieldDefinitions('course_enrollment', $course
      ->get('enrollment_type')
      ->getString());
    foreach ($instances as $field_name => $field) {
      if (is_a($field, FieldConfig::class)) {

        /* @var $field Drupal\field\Entity\FieldConfig */
        if ($field
          ->getThirdPartySetting('course', 'show_field')) {

          // At least one field must be shown when enrolling. Display the user
          // enrollment form.
          if (!$enrollment) {

            // Create a new enrollment, show them the form.
            $enrollment = CourseEnrollment::create([
              'cid' => $course
                ->id(),
              'uid' => $account
                ->id(),
              'type' => $course
                ->get('enrollment_type')
                ->getString(),
              'timestamp' => \Drupal::time()
                ->getRequestTime(),
              'enrollmenttype' => 'self',
            ]);
          }
          $redirect_url = Url::fromRoute('course.take', [
            'course' => $course
              ->id(),
          ]);
          $form = \Drupal::service('entity.form_builder')
            ->getForm($enrollment, 'default', [
            'redirect' => $redirect_url,
          ]);
          return $form;
        }
      }
    }

    // No fields to show. Check for enrollment. If it does not exist, create it.
    if (empty($enrollment)) {
      $enrollment = CourseEnrollment::create(array(
        'cid' => $course
          ->id(),
        'uid' => $account
          ->id(),
        'type' => $course->enrollment_type
          ->getString(),
        'enrollmenttype' => 'self',
      ));
      $enrollment
        ->save();
    }
  }
  $take_access = $course
    ->access('take', $account, TRUE);
  if ($take_access
    ->isAllowed()) {

    // User has access to take this course.
    if ($enrollment
      ->get('timestamp')
      ->isEmpty()) {

      // If user hasn't started course, mark start of enrollment.
      $enrollment
        ->set('timestamp', \Drupal::time()
        ->getRequestTime())
        ->save();
      \Drupal::messenger()
        ->addStatus(t('Your enrollment in this course has been recorded.'));
    }

    // Display the configured outline handler output.

    /* @var $pluginManager CourseOutlinePluginManager */
    $pluginManager = Drupal::service('plugin.manager.course.outline');

    /* @var $outlinePlugin CourseOutlinePluginBase */
    $outlinePlugin = $pluginManager
      ->createInstance($course
      ->get('outline')
      ->getString());
    $outline = $outlinePlugin
      ->render($course, $account);
    if (!$outline) {
      $outline['#markup'] = t('No learning objects are available this time.');
    }

    // Set page title to title of this course.
    $outline['#title'] = $course
      ->get('title')
      ->getString();
    $outline['#cache']['max-age'] = 0;
    return $outline;
  }
  else {
    $message = $take_access
      ->getReason();
    if (!$message) {
      $message = t('Sorry, you do not have access to take this course.');
    }
    return [
      '#markup' => '<h2>Access denied</h2>' . $take_access
        ->getReason(),
    ];
  }
}