You are here

public function CourseController::renderTake in Course 8.3

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

Take a course.

  • Enroll the user, if allowed.
  • Block the user if not allowed.
  • Fire the outline handler.

File

src/Controller/CourseController.php, line 139

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, Drupal\field\Entity\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.
            $enrollment = Drupal\course\Entity\CourseEnrollment::create([
              'cid' => $course
                ->id(),
              'uid' => $account
                ->id(),
              'type' => $course
                ->get('enrollment_type')
                ->getString(),
              'timestamp' => REQUEST_TIME,
            ]);
          }
          else {
            $enrollment
              ->set('timestamp', REQUEST_TIME);
          }
          $redirect_url = \Drupal\Core\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 = \Drupal\course\Entity\CourseEnrollment::create(array(
        'cid' => $course
          ->id(),
        'uid' => $account
          ->id(),
        'type' => $course->enrollment_type
          ->getString(),
      ));
      $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', REQUEST_TIME)
        ->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.');
    }
    \Drupal::messenger()
      ->addError($take_access
      ->getReason());
    throw new \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException();
  }
}