Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added login notice to single lesson & single quiz pages. #3299

Open
wants to merge 13 commits into
base: trunk
Choose a base branch
from
Open
2 changes: 1 addition & 1 deletion assets/css/frontend.scss
Original file line number Diff line number Diff line change
Expand Up @@ -776,7 +776,7 @@ section.entry span.course-lesson-progress { margin-left: 10px; }
/*-------------------------------------------------------------------------------------------*/
/* 1. Info Boxes */
/*-------------------------------------------------------------------------------------------*/
.sensei, .course-container, .course, .lesson, .quiz, .learner-info {
.sensei, .course-container, .course, .module-container, .lesson, .quiz, .learner-info {
p.sensei-message, div.sensei-message {
clear: both;
margin: 1.387em 0 1.618em 0;
Expand Down
68 changes: 61 additions & 7 deletions includes/class-sensei-course.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,9 @@ public function __construct() {
add_action( 'save_post', array( $this, 'meta_box_save' ) );

// Custom Write Panel Columns
add_filter( 'manage_course_posts_columns', array( $this, 'add_column_headings' ), 10, 1 );
add_filter( 'manage_course_posts_columns', array( $this, 'add_column_headings' ), 20, 1 );
add_action( 'manage_course_posts_custom_column', array( $this, 'add_column_data' ), 10, 2 );
add_filter( 'default_hidden_columns', array( $this, 'set_default_visible_columns' ), 10, 2 );

// Enqueue scripts.
add_action( 'admin_enqueue_scripts', array( $this, 'register_admin_scripts' ) );
Expand Down Expand Up @@ -179,6 +180,7 @@ public static function is_user_enrolled( $course_id, $user_id = null ) {
* @param int $course_id Course post ID.
* @param int $user_id User ID.
* @param string $context Context that we're checking for course content access (`lesson`, `quiz`, or `module`).
* @return bool True when user can access the course content, otherwise false.
*/
public function can_access_course_content( $course_id, $user_id = null, $context = 'lesson' ) {
if ( null === $user_id ) {
Expand Down Expand Up @@ -664,15 +666,16 @@ public function course_manage_meta_box_content() {
} // End course_manage_meta_box_content()

/**
* Add column headings to the "lesson" post list screen.
* Add column headings to the "course" post list screen,
* while moving the existing ones to the end.
*
* @access public
* @access private
* @since 1.0.0
* @param array $defaults
* @return array $new_columns
* @param array $defaults Array of column header labels keyed by column ID.
* @return array Updated array of column header labels keyed by column ID.
*/
public function add_column_headings( $defaults ) {
$new_columns = array();
$new_columns = [];
$new_columns['cb'] = '<input type="checkbox" />';
$new_columns['title'] = _x( 'Course Title', 'column name', 'sensei-lms' );
$new_columns['course-prerequisite'] = _x( 'Pre-requisite Course', 'column name', 'sensei-lms' );
Expand All @@ -681,8 +684,59 @@ public function add_column_headings( $defaults ) {
$new_columns['date'] = $defaults['date'];
}

// Make sure other sensei columns stay directly behind the new columns.
$other_sensei_culumns = [
'taxonomy-module',
'teacher',
'module_order',
];
foreach ( $other_sensei_culumns as $column_key ) {
if ( isset( $defaults[ $column_key ] ) ) {
$new_columns[ $column_key ] = $defaults[ $column_key ];
}
}

// Add all remaining columns at the end.
foreach ( $defaults as $column_key => $column_value ) {
if ( ! isset( $new_columns[ $column_key ] ) ) {
$new_columns[ $column_key ] = $column_value;
}
}

return $new_columns;
} // End add_column_headings()
}

/**
* Hide all columns by default, leaving only a default list.
*
* @access private
* @since 3.5.4
* @param string[] $hidden_columns Array of IDs of columns hidden by default.
* @param WP_Screen $screen WP_Screen object of the current screen.
* @return string[] Updated array of IDs of columns hidden by default.
*/
public function set_default_visible_columns( $hidden_columns, $screen ) {
$default_course_columns = [
'cb',
'title',
'course-prerequisite',
'course-category',
'date',
];

if ( ! isset( $screen->id ) || 'edit-course' !== $screen->id ) {
return $hidden_columns;
}

$columns = get_column_headers( $screen );
foreach ( $columns as $column => $column_value ) {
if ( ! in_array( $column, $default_course_columns, true ) ) {
$hidden_columns[] = $column;
}
}

return $hidden_columns;
}

/**
* Add data for our newly-added custom columns.
Expand Down
49 changes: 45 additions & 4 deletions includes/class-sensei-lesson.php
Original file line number Diff line number Diff line change
Expand Up @@ -4057,7 +4057,7 @@ public static function user_not_taking_course_message() {
} // end user_not_taking_course_message

/**
* Outputs the lessons course signup lingk
* Outputs the lessons course signup link
*
* This hook runs inside the single lesson page.
*
Expand All @@ -4067,12 +4067,12 @@ public static function course_signup_link() {

$course_id = Sensei()->lesson->get_course_id( get_the_ID() );

if ( empty( $course_id ) || 'course' !== get_post_type( $course_id ) || sensei_all_access() || Sensei_Utils::is_preview_lesson( get_the_ID() ) ) {
if ( empty( $course_id ) || Sensei_Utils::is_preview_lesson( get_the_ID() ) ) {
return;
}

$show_course_signup_notice = sensei_is_login_required() && ! Sensei_Course::is_user_enrolled( $course_id );

$show_course_signup_notice = is_user_logged_in() && ! Sensei()->course->can_access_course_content( $course_id );
/**
* Filter for if we should show the course sign up notice on the lesson page.
*
Expand Down Expand Up @@ -4140,6 +4140,47 @@ public static function prerequisite_complete_message() {

}

/**
* Determines if user should login in to get acces to a lesson or quiz.
*
* @since 3.2.0
* @param int $lesson_id Lesson ID.
* @return bool True if login for the lesson is required.
*/
public static function user_should_login( $lesson_id ) {
if ( 'integer' !== gettype( $lesson_id ) || $lesson_id <= 0 ) {
return false;
}
$course_id = Sensei()->lesson->get_course_id( $lesson_id );
if ( is_user_logged_in()
|| empty( $course_id )
|| 'course' !== get_post_type( $course_id )
|| sensei_all_access()
|| Sensei_Utils::is_preview_lesson( $lesson_id )
|| ! sensei_is_login_required()
) {
return false;
}

return true;
}

/**
* Adds a login notice when appropriate.
*
* @since 3.2.0
* @return void
*/
public static function login_notice() {
$login_notice = Sensei_Utils::login_notice( 'lesson' );
if ( false === $login_notice ) {
return;
}
$message = wp_kses_post( $login_notice );
$notice_level = 'info';
Sensei()->notices->add_notice( $message, $notice_level );
}

/**
* Outputs the the lesson archive header.
*
Expand Down
38 changes: 38 additions & 0 deletions includes/class-sensei-modules.php
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ public function __construct( $file ) {
add_action( 'pre_get_posts', array( $this, 'module_archive_filter' ), 10, 1 );
add_filter( 'sensei_lessons_archive_text', array( $this, 'module_archive_title' ) );
add_action( 'sensei_loop_lesson_inside_before', array( $this, 'module_archive_description' ), 30 );
add_action( 'sensei_taxonomy_module_content_inside_before', array( $this, 'login_notice' ), 30 );
add_action( 'sensei_taxonomy_module_content_inside_before', array( $this, 'course_signup_link' ), 30 );
add_action( 'sensei_taxonomy_module_content_inside_before', array( $this, 'module_archive_description' ), 30 );

Expand Down Expand Up @@ -830,6 +831,11 @@ public function course_signup_link() {

$show_course_signup_notice = ! $this->can_view_module_content( null, $course_id );

if ( $show_course_signup_notice && $this->user_should_login( $course_id ) ) {
// User first needs to login and login_notice() takes preference to this one.
$show_course_signup_notice = false;
}

/**
* Filter for if we should show the course sign up notice on the module page.
*
Expand Down Expand Up @@ -872,6 +878,38 @@ public function course_signup_link() {
Sensei()->notices->add_notice( $message, $notice_level );
}

/**
* Adds a login notice when appropriate.
*
* @since 3.2.0
* @return void
*/
public static function login_notice() {
$login_notice = Sensei_Utils::login_notice( 'module' );
if ( false === $login_notice ) {
return;
}
$message = wp_kses_post( $login_notice );
$notice_level = 'info';
Sensei()->notices->add_notice( $message, $notice_level );
}

/**
* Determines if user should login in to get acces to the course module.
*
* @since 3.2.0
* @param int $lesson_id Lesson ID.
* @return bool True if login for the module is required.
*/
public static function user_should_login( $course_id ) {
if ( ! $course_id
|| is_user_logged_in()
|| Sensei()->course->can_access_course_content( $course_id, null, 'module' ) ) {
return false;
}
return true;
}

public function module_archive_body_class( $classes ) {
if ( is_tax( $this->taxonomy ) ) {
$classes[] = 'module-archive';
Expand Down
46 changes: 35 additions & 11 deletions includes/class-sensei-quiz.php
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,8 @@ public function user_save_quiz_answers_listener() {
$answers_saved = self::save_user_answers( $quiz_answers, $_FILES, $lesson_id, get_current_user_id() );

if ( intval( $answers_saved ) > 0 ) {
// update the message showed to user
Sensei()->frontend->messages = '<div class="sensei-message note">' . __( 'Quiz Saved Successfully.', 'sensei-lms' ) . '</div>';
// Show Quiz saved message to user
Sensei()->notices->add_notice( __( 'Quiz Saved Successfully.', 'sensei-lms' ), 'note' );
}

// remove the hook as it should only fire once per click
Expand Down Expand Up @@ -1209,19 +1209,43 @@ public static function the_title() {
* @param $quiz_id
*/
public static function the_user_status_message( $quiz_id ) {

$lesson_id = Sensei()->quiz->get_lesson_id( $quiz_id );
$status = Sensei_Utils::sensei_user_quiz_status_message( $lesson_id, get_current_user_id() );
$messages = Sensei()->frontend->messages;
$message = '<div class="sensei-message ' . esc_attr( $status['box_class'] ) . '">' . wp_kses_post( $status['message'] ) . '</div>';
$messages = Sensei()->frontend->messages;
if ( $lesson_id > 0
&& Sensei()->lesson->user_should_login( $lesson_id ) ) {
/*
* bail out when user should still login,
* because login_notice() takes preference.
*/
return;
}

if ( ! empty( $messages ) ) {
$message .= wp_kses_post( $messages );
$status = Sensei_Utils::sensei_user_quiz_status_message( $lesson_id, get_current_user_id() );
$notice_level = esc_attr( $status['box_class'] );
$message = wp_kses_post( $status['message'] );
Sensei()->notices->add_notice( $message, $notice_level );

// should not occur anymore
if ( ! empty( Sensei()->frontend->messages ) ) {
$messages .= wp_kses_post( Sensei()->frontend->messages );
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped above.
echo $messages;
}
}

// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped above.
echo $message;
/**
* Creates a login notice when appropriate.
*
* @since 3.2.0
* @return void
*/
public static function login_notice() {
$login_notice = Sensei_Utils::login_notice( 'quiz' );
if ( false === $login_notice ) {
return;
}
$message = wp_kses_post( $login_notice );
$notice_level = 'info';
Sensei()->notices->add_notice( $message, $notice_level );
}

/**
Expand Down
Loading