public function CourseController::renderTake in Course 3.x
Same name and namespace in other branches
- 8.3 src/Controller/CourseController.php \Drupal\course\Controller\CourseController::renderTake()
- 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
Namespace
Drupal\course\ControllerCode
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(),
];
}
}