Skip to content

Commit

Permalink
Merge pull request #177 from woothemes/release-1-4-4
Browse files Browse the repository at this point in the history
Release 1.4.4
  • Loading branch information
Dan Johnson committed Nov 19, 2013
2 parents 33ca12d + 5a216e3 commit d8d8a5a
Show file tree
Hide file tree
Showing 11 changed files with 296 additions and 33 deletions.
12 changes: 12 additions & 0 deletions changelog.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
*** Sensei Changelog ***

2013.11.19 - version 1.4.4
* /templates/course-results/course-info.php - Updating markup for course results page
* /templates/learner-profile/learner-info.php - Updating markup for learner profile page
* /templates/content-single-lesson.php - Fixing lesson prerequisite check
* /widgets/widget-woothemes-sensei-course-component.php - Fixing 'My Active Courses' & 'Featured Courses' widgets
* /classes/class-woothemes-sensei-course-results.php - Updating markup & fixing rewrite rules for course results page
* /classes/class-woothemes-sensei-learner-profiles.php - Updating markup & fixing rewrite rules for learner profiles
* /classes/class-woothemes-sensei-course.php - Updating markup for lesson quiz meta buttons & fixing limits on course queries
* /classes/class-woothemes-sensei-frontend.php - Updating markup, fixing lesson prerequisites & adding function to check for completed lessons
* /classes/class-woothemes-sensei-utils.php - Updating button markup
* /classes/class-woothemes-sensei.php - Fixing rewrite rules for learner profiles and course results page & improving guest checkout check

2013.10.24 - version 1.4.3
* /assets/css/frontend.css - Responsive layout tweaks & fixes.
* /classes/class-woothemes-sensei-frontend.php - fixes missing complete course hook, fixes missing lesson complete message and reset lesson buttons, fixes 'delete course' function.
Expand Down
33 changes: 32 additions & 1 deletion classes/class-woothemes-sensei-course-results.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public function __construct () {

// Setup permalink structure for course results
add_action( 'init', array( $this, 'setup_permastruct' ) );
add_action( 'init', array( $this, 'get_permalink' ) );
add_filter( 'wp_title', array( $this, 'page_title' ), 10, 2 );

// Load content for learner profiles
add_action( 'sensei_course_results_content', array( $this, 'content' ), 10 );
Expand All @@ -46,6 +46,9 @@ public function __construct () {
add_action( 'sensei_course_results_info', array( $this, 'course_info' ), 10 );

add_action( 'sensei_course_results_lessons', array( $this, 'course_lessons' ), 10 );

// Add class to body tag
add_filter( 'body_class', array( $this, 'body_class' ), 10, 1 );
} // End __construct()

/**
Expand All @@ -58,6 +61,21 @@ public function setup_permastruct() {
add_rewrite_tag( '%course_results%', '([^&]+)' );
}

/**
* Adding page title for course results page
* @param string $title Original title
* @param string $sep Seeparator string
* @return string Modified title
*/
public function page_title( $title, $sep ) {
global $wp_query;
if( isset( $wp_query->query_vars['course_results'] ) ) {
$course = get_page_by_path( $wp_query->query_vars['course_results'], OBJECT, 'course' );
$title = __( 'Course Results: ', 'woothemes-sensei' ) . $course->post_title . ' ' . $sep . ' ';
}
return $title;
}

/**
* Get permalink for course results based on course ID
* @since 1.4.0
Expand Down Expand Up @@ -134,5 +152,18 @@ public function course_lessons() {
}
}

/**
* Adding class to body tag
* @param array $classes Existing classes
* @return array Modified classes
*/
public function body_class( $classes ) {
global $wp_query;
if( isset( $wp_query->query_vars['course_results'] ) ) {
$classes[] = 'course-results';
}
return $classes;
}

} // End Class
?>
4 changes: 2 additions & 2 deletions classes/class-woothemes-sensei-course.php
Original file line number Diff line number Diff line change
Expand Up @@ -473,7 +473,7 @@ public function get_archive_query_args( $type = '', $amount = 0 , $includes = ar

$post_args = array();

if ( isset( $woothemes_sensei->settings->settings[ 'course_archive_amount' ] ) && 'usercourses' != $type && ( 0 < absint( $woothemes_sensei->settings->settings[ 'course_archive_amount' ] ) ) ) {
if ( 0 == $amount && ( isset( $woothemes_sensei->settings->settings[ 'course_archive_amount' ] ) && 'usercourses' != $type && ( 0 < absint( $woothemes_sensei->settings->settings[ 'course_archive_amount' ] ) ) ) ) {
$amount = absint( $woothemes_sensei->settings->settings[ 'course_archive_amount' ] );
} else {
if ( 0 == $amount) {
Expand Down Expand Up @@ -951,7 +951,7 @@ public function load_user_courses_content( $user = false, $manage = false ) {
$complete_html .= '<div class="meter green"><span style="width: 100%">100%</span></div>';

if( $manage ) {
$complete_html .= '<a class="button view-results" href="' . $woothemes_sensei->course_results->get_permalink( $course_item->ID ) . '">' . apply_filters( 'sensei_view_results_text', __( 'View results', 'woothemes-sensei' ) ) . '</a>';
$complete_html .= '<p><a class="button view-results" href="' . $woothemes_sensei->course_results->get_permalink( $course_item->ID ) . '">' . apply_filters( 'sensei_view_results_text', __( 'View results', 'woothemes-sensei' ) ) . '</a></p>';
}

$complete_html .= '</section>';
Expand Down
156 changes: 150 additions & 6 deletions classes/class-woothemes-sensei-frontend.php
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,8 @@ public function __construct () {
add_filter( 'post_class', array( $this, 'sensei_search_results_classes' ), 10 );
// Comments Feed Actions
add_filter( 'comment_feed_where', array( $this, 'comments_rss_item_filter' ), 10, 1 );
// Checks if Course is complete when completing a Lesson or Quiz
add_action( 'sensei_user_lesson_end', array( $this, 'sensei_completed_course' ), 10, 2 );
} // End __construct()

/**
Expand Down Expand Up @@ -154,6 +156,10 @@ public function enqueue_styles () {
if ( isset( $woothemes_sensei->settings->settings[ 'styles_disable' ] ) ) {
$disable_styles = $woothemes_sensei->settings->settings[ 'styles_disable' ];
} // End If Statement

// Add filter for theme overrides
$disable_styles = apply_filters( 'sensei_disable_styles', $disable_styles );

if ( ! $disable_styles ) {
wp_register_style( $woothemes_sensei->token . '-frontend', $woothemes_sensei->plugin_url . 'assets/css/frontend.css', '', '1.3.3', 'screen' );
wp_enqueue_style( $woothemes_sensei->token . '-frontend' );
Expand Down Expand Up @@ -1098,6 +1104,30 @@ public function sensei_lesson_quiz_meta( $post_id = 0, $user_id = 0 ) {
// Lesson Quiz Meta
$lesson_quizzes = $woothemes_sensei->frontend->lesson->lesson_quizzes( $post_id );
$has_user_completed_lesson = $this->sensei_has_user_completed_lesson( $post_id, $user_id );
$show_actions = true;
if( intval( $lesson_prerequisite ) > 0 ) {
$completion = $woothemes_sensei->settings->settings['lesson_completion'];
switch( $completion ) {
case 'passed':
$quizzes = $woothemes_sensei->post_types->lesson->lesson_quizzes( $lesson_prerequisite );
foreach ( $quizzes as $quiz ) {
$prerequisite_quiz_id = $quiz->ID;
}
$quiz_grade = intval( WooThemes_Sensei_Utils::sensei_get_activity_value( array( 'post_id' => $prerequisite_quiz_id, 'user_id' => $user_id, 'type' => 'sensei_quiz_grade', 'field' => 'comment_content' ) ) );
$quiz_passmark = intval( get_post_meta( $prerequisite_quiz_id, '_quiz_passmark', true ) );
if( $quiz_grade < $quiz_passmark ) {
$show_actions = false;
}
break;

case 'complete':
$user_lesson_end = WooThemes_Sensei_Utils::sensei_get_activity_value( array( 'post_id' => $lesson_prerequisite, 'user_id' => $user_id, 'type' => 'sensei_lesson_start', 'field' => 'comment_content' ) );
if ( ! $user_lesson_end || $user_lesson_end == '' || strlen( $user_lesson_end ) == 0 ) {
$show_actions = false;
}
break;
}
}
?><header><?php
if ( 0 < count($lesson_quizzes) && is_user_logged_in() && sensei_has_user_started_course( $lesson_course_id, $user_id ) ) { ?>
<?php $no_quiz_count = 0; ?>
Expand All @@ -1112,17 +1142,17 @@ public function sensei_lesson_quiz_meta( $post_id = 0, $user_id = 0 ) {
} // End If Statement
} // End If Statement
} // End For Loop ?>
<?php } elseif( 0 < count($lesson_quizzes) && $woothemes_sensei->access_settings() ) { ?>
<?php } elseif( $show_actions && 0 < count($lesson_quizzes) && $woothemes_sensei->access_settings() ) { ?>
<?php foreach ($lesson_quizzes as $quiz_item){
$quiz_questions = $woothemes_sensei->frontend->lesson->lesson_quiz_questions( $quiz_item->ID );
if( 0 < count( $quiz_questions ) ) { ?>
<a class="button" href="<?php echo esc_url( get_permalink( $quiz_item->ID ) ); ?>" title="<?php echo esc_attr( apply_filters( 'sensei_view_lesson_quiz_text', __( 'View the Lesson Quiz', 'woothemes-sensei' ) ) ); ?>"><?php echo apply_filters( 'sensei_view_lesson_quiz_text', __( 'View the Lesson Quiz', 'woothemes-sensei' ) ); ?></a>
<p><a class="button" href="<?php echo esc_url( get_permalink( $quiz_item->ID ) ); ?>" title="<?php echo esc_attr( apply_filters( 'sensei_view_lesson_quiz_text', __( 'View the Lesson Quiz', 'woothemes-sensei' ) ) ); ?>"><?php echo apply_filters( 'sensei_view_lesson_quiz_text', __( 'View the Lesson Quiz', 'woothemes-sensei' ) ); ?></a></p>
<?php } ?>
<?php } // End For Loop ?>
<?php } // End If Statement
if ( !$has_user_completed_lesson ) {
if ( $show_actions && ! $has_user_completed_lesson ) {
sensei_complete_lesson_button();
} else {
} elseif( $show_actions ) {
sensei_reset_lesson_button();
} // End If Statement
?></header><?php
Expand Down Expand Up @@ -1259,7 +1289,6 @@ public function sensei_quiz_action_buttons() {
}
}
if ( $show_actions && is_user_logged_in() && sensei_has_user_started_course( $lesson_course_id, $current_user->ID ) ) {
global $woothemes_sensei;
// Get Reset Settings
$reset_quiz_allowed = $woothemes_sensei->settings->settings[ 'quiz_reset_allowed' ]; ?>
<input type="hidden" name="<?php echo esc_attr( 'woothemes_sensei_complete_quiz_noonce' ); ?>" id="<?php echo esc_attr( 'woothemes_sensei_complete_quiz_noonce' ); ?>" value="<?php echo esc_attr( wp_create_nonce( 'woothemes_sensei_complete_quiz_noonce' ) ); ?>" />
Expand Down Expand Up @@ -1394,7 +1423,7 @@ public function sensei_course_meta() {
// Success message
if ( $completed_course ) { ?>
<div class="status completed"><?php echo apply_filters( 'sensei_complete_text', __( 'Completed', 'woothemes-sensei' ) ); ?></div>
<div class="view-results"><a href="<?php echo $woothemes_sensei->course_results->get_permalink( $post->ID ); ?>"><?php echo apply_filters( 'sensei_view_results_text', __( 'View results', 'woothemes-sensei' ) ); ?></a></div>
<div class="view-results"><p><a href="<?php echo $woothemes_sensei->course_results->get_permalink( $post->ID ); ?>"><?php echo apply_filters( 'sensei_view_results_text', __( 'View results', 'woothemes-sensei' ) ); ?></a></p></div>
<?php } else { ?>
<div class="status in-progress"><?php echo apply_filters( 'sensei_in_progress_text', __( 'In Progress', 'woothemes-sensei' ) ); ?></div>
<?php } ?>
Expand Down Expand Up @@ -1465,5 +1494,120 @@ function comments_rss_item_filter( $pieces ) {
return $pieces;
} // End comments_rss_item_filter()

/**
* sensei_completed_course hooks onto everywhere a lesson ends to check if course is complete
* @param integer $user_id User ID overload - todo in future version
* @param integer $lesson_id lesson ID
* @return boolen returns true if successful
*/
public function sensei_completed_course( $user_id = 0, $lesson_id = 0 ) {
global $woothemes_sensei, $current_user;

$completed_course = false;

// Get Course ID
$course_id = get_post_meta( $lesson_id, '_lesson_course', true );

if ( 0 < intval( $course_id ) ) {

$is_user_taking_course = WooThemes_Sensei_Utils::sensei_check_for_activity( array( 'post_id' => $course_id, 'user_id' => $current_user->ID, 'type' => 'sensei_course_start' ) );

if ( is_user_logged_in() && $is_user_taking_course ) {

// Check if course is completed
$user_course_end = WooThemes_Sensei_Utils::sensei_get_activity_value( array( 'post_id' => $course_id, 'user_id' => $current_user->ID, 'type' => 'sensei_course_end', 'field' => 'comment_content' ) );

if ( '' != $user_course_end ) {

$completed_course = true;

} else {

// Do the check if all lessons complete
$course_lessons = $woothemes_sensei->frontend->course->course_lessons( $course_id );

$lessons_completed = 0;
foreach ($course_lessons as $lesson_item){

// Check if Lesson is complete
$user_lesson_end = WooThemes_Sensei_Utils::sensei_get_activity_value( array( 'post_id' => $lesson_item->ID, 'user_id' => $current_user->ID, 'type' => 'sensei_lesson_end', 'field' => 'comment_content' ) );

if ( '' != $user_lesson_end ) {

//Check for Passed or Completed Setting
$course_completion = $woothemes_sensei->settings->settings[ 'course_completion' ];

if ( 'passed' == $course_completion ) {

// If Setting is Passed -> Check for Quiz Grades
$lesson_quizzes = $woothemes_sensei->post_types->lesson->lesson_quizzes( $lesson_item->ID );

// Get Quiz ID
if ( is_array( $lesson_quizzes ) || is_object( $lesson_quizzes ) ) {

foreach ($lesson_quizzes as $quiz_item) {
$lesson_quiz_id = $quiz_item->ID;
} // End For Loop

// Quiz Grade
$lesson_grade = WooThemes_Sensei_Utils::sensei_get_activity_value( array( 'post_id' => $lesson_quiz_id, 'user_id' => $current_user->ID, 'type' => 'sensei_quiz_grade', 'field' => 'comment_content' ) ); // Check for wrapper

// Check if Grade is bigger than pass percentage
$lesson_prerequisite = abs( round( doubleval( get_post_meta( $lesson_quiz_id, '_quiz_passmark', true ) ), 2 ) );
if ( $lesson_prerequisite <= intval( $lesson_grade ) ) {
$lessons_completed++;
} // End If Statement

} // End If Statement

} else {
$lessons_completed++;
} // End If Statement

} // End If Statement

} // End For Loop

if ( absint( $lessons_completed ) == absint( count( $course_lessons ) ) && ( 0 < absint( count( $course_lessons ) ) ) && ( 0 < absint( $lessons_completed ) ) ) {

// Mark course as complete
$args = array(
'post_id' => $course_id,
'username' => $current_user->user_login,
'user_email' => $current_user->user_email,
'user_url' => $current_user->user_url,
'data' => __( 'Course completed by the user', 'woothemes-sensei' ),
'type' => 'sensei_course_end', /* FIELD SIZE 20 */
'parent' => 0,
'user_id' => $current_user->ID,
'action' => 'update'
);
$activity_logged = WooThemes_Sensei_Utils::sensei_log_activity( $args );

$dataset_changes = true;
if ( $activity_logged ) {

// Course is complete
$completed_course = true;
do_action( 'sensei_user_course_end', $current_user->ID, $course_id );

} // End If Statement

} // End If Statement

} // End If Statement

} else {

$completed_course = false;

} // End If Statement

} // End If Statement

return $completed_course;

} // End sensei_completed_course()

} // End Class
?>
40 changes: 40 additions & 0 deletions classes/class-woothemes-sensei-learner-profiles.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public function __construct () {

// Setup permalink structure for learner profiles
add_action( 'init', array( $this, 'setup_permastruct' ) );
add_filter( 'wp_title', array( $this, 'page_title' ), 10, 2 );

// Load content for learner profiles
add_action( 'sensei_learner_profile_content', array( $this, 'content' ), 10 );
Expand All @@ -49,6 +50,9 @@ public function __construct () {

// Add profile link to main navigation
add_filter( 'wp_nav_menu_items', array( $this, 'learner_profile_menu_item' ), 11, 2 );

// Add class to body tag
add_filter( 'body_class', array( $this, 'learner_profile_body_class' ), 10, 1 );
} // End __construct()

/**
Expand All @@ -65,6 +69,29 @@ public function setup_permastruct() {
}
}

/**
* Adding page title for course results page
* @param string $title Original title
* @param string $sep Seeparator string
* @return string Modified title
*/
public function page_title( $title, $sep ) {
global $wp_query;
if( isset( $wp_query->query_vars['learner_profile'] ) ) {
$learner_user = get_user_by( 'login', $wp_query->query_vars['learner_profile'] );

$name = '';
if( strlen( $learner_user->first_name ) > 0 ) {
$name = $learner_user->first_name;
} else {
$name = $learner_user->display_name;
}

$title = apply_filters( 'sensei_learner_profile_courses_heading', sprintf( __( 'Courses %s is taking', 'woothemes-sensei' ), $name ) ) . ' ' . $sep . ' ';
}
return $title;
}

/**
* Get permalink for learner profile
* @since 1.4.0
Expand Down Expand Up @@ -186,5 +213,18 @@ public function learner_profile_menu_item( $items, $args ) {
return apply_filters( 'sensei_custom_menu_links', $items );
}

/**
* Adding class to body tag
* @param array $classes Existing classes
* @return array Modified classes
*/
public function learner_profile_body_class( $classes ) {
global $wp_query;
if( isset( $wp_query->query_vars['learner_profile'] ) ) {
$classes[] = 'learner-profile';
}
return $classes;
}

} // End Class
?>
2 changes: 1 addition & 1 deletion classes/class-woothemes-sensei-utils.php
Original file line number Diff line number Diff line change
Expand Up @@ -1031,7 +1031,7 @@ public static function sensei_user_quiz_status_message( $lesson_id = 0, $user_id
$message = apply_filters( 'sensei_user_quiz_status_' . $status, $message );

if( $is_lesson && ! in_array( $status, array( 'login_required', 'not_started_course' ) ) ) {
$extra = '<a class="button" href="' . esc_url( get_permalink( $quiz_id ) ) . '" title="' . esc_attr( apply_filters( 'sensei_view_quiz_text', __( 'View the lesson quiz', 'woothemes-sensei' ) ) ) . '">' . apply_filters( 'sensei_view_quiz_text', __( 'View the lesson quiz', 'woothemes-sensei' ) ) . '</a>';
$extra = '<p><a class="button" href="' . esc_url( get_permalink( $quiz_id ) ) . '" title="' . esc_attr( apply_filters( 'sensei_view_quiz_text', __( 'View the lesson quiz', 'woothemes-sensei' ) ) ) . '">' . apply_filters( 'sensei_view_quiz_text', __( 'View the lesson quiz', 'woothemes-sensei' ) ) . '</a></p>';
}

return array( 'status' => $status, 'box_class' => $box_class, 'message' => $message, 'extra' => $extra );
Expand Down
Loading

0 comments on commit d8d8a5a

Please sign in to comment.