gocodebox/lifterlms

View on GitHub
includes/class.llms.student.dashboard.php

Summary

Maintainability
B
4 hrs
Test Coverage
C
74%
<?php
/**
 * Retrieve data sets used by various other classes and functions
 *
 * @package LifterLMS/Classes
 *
 * @since 3.0.0
 * @version 7.5.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * LLMS_Student_Dashboard class.
 *
 * @since 3.0.0
 * @since 3.28.2 Unknown.
 * @since 4.0.0 Removed deprecated methods.
 */
class LLMS_Student_Dashboard {

    /**
     * Constructor
     *
     * @since    3.0.0
     * @version  3.24.0
     */
    public function __construct() {

        add_filter( 'llms_get_endpoints', array( $this, 'add_endpoints' ) );
        add_filter( 'lifterlms_student_dashboard_title', array( $this, 'modify_dashboard_title' ), 5 );
        add_filter( 'rewrite_rules_array', array( $this, 'modify_rewrite_rules_order' ) );

    }

    /**
     * Add endpoints to the LLMS_Query class to be automatically registered
     *
     * @param    array $endpoints  updated array of endpoints
     * @since    3.0.0
     * @version  3.0.0
     */
    public function add_endpoints( $endpoints ) {

        return array_merge( $endpoints, $this->get_endpoints() );

    }

    /**
     * Retrieve an array of all endpoint data for student dashboard endpoints
     *
     * @return   array
     * @since    3.0.0
     * @version  3.0.0
     */
    public function get_endpoints() {

        $endpoints = array();
        foreach ( self::get_tabs() as $var => $data ) {

            if ( empty( $data['endpoint'] ) ) {
                continue;
            }

            $endpoints[ $var ] = $data['endpoint'];

        }

        return $endpoints;

    }

    /**
     * Get list of student's courses used for recent courses on the dashboard
     * and all courses (paginated) on the "View Courses" endpoint
     *
     * @param    integer $limit  number of courses to return
     * @param    integer $skip   number of courses to skip (for pagination)
     * @return   array
     * @since    3.6.0
     * @version  3.6.0
     */
    private static function get_courses( $limit = 10, $skip = 0 ) {

        // Get sorting option.
        $option = get_option( 'lifterlms_myaccount_courses_in_progress_sorting', 'date,DESC' );
        // Parse to order & orderby.
        $option  = explode( ',', $option );
        $orderby = ! empty( $option[0] ) ? $option[0] : 'date';
        $order   = ! empty( $option[1] ) ? $option[1] : 'DESC';

        $student = new LLMS_Student();
        return $student->get_courses(
            array(
                'limit'   => $limit,
                'order'   => $order,
                'orderby' => $orderby,
                'skip'    => $skip,
                'status'  => 'enrolled',
            )
        );

    }

    /**
     * Retrieve the current tab when on the student dashboard
     *
     * @param    string $return   type of return, either "data" for an array of data or 'slug' for just the slug
     * @return   mixed
     * @since    3.0.0
     * @version  3.0.0
     */
    public static function get_current_tab( $return = 'data' ) {

        global $wp;

        // Set default tab.
        $current_tab = apply_filters( 'llms_student_dashboard_default_tab', 'dashboard' );

        $tabs = self::get_tabs();

        foreach ( $tabs as $var => $data ) {
            if ( isset( $wp->query_vars[ $var ] ) ) {
                $current_tab = $var;
                break;
            }
        }

        if ( 'data' === $return ) {
            return $tabs[ $current_tab ];
        } else {
            return $current_tab;
        }

    }

    /**
     * Retrieve all dashboard tabs and related data
     *
     * @since 3.0.0
     * @since 3.28.2 Unknown.
     * @since 6.0.0 Add pagination to the view-achievements and view-certificates tabs.
     * @since 7.5.0 Add view-favorites tab.
     *
     * @return array
     */
    public static function get_tabs() {

        $tabs = array(
            'dashboard'         => array(
                'content'  => 'lifterlms_template_student_dashboard_home',
                'endpoint' => false,
                'nav_item' => true,
                'title'    => __( 'Dashboard', 'lifterlms' ),
                'url'      => llms_get_page_url( 'myaccount' ),
            ),
            'view-courses'      => array(
                'content'  => 'lifterlms_template_student_dashboard_my_courses',
                'endpoint' => get_option( 'lifterlms_myaccount_courses_endpoint', 'my-courses' ),
                'paginate' => true,
                'nav_item' => true,
                'title'    => __( 'My Courses', 'lifterlms' ),
            ),
            'my-grades'         => array(
                'content'  => 'lifterlms_template_student_dashboard_my_grades',
                'endpoint' => get_option( 'lifterlms_myaccount_grades_endpoint', 'my-grades' ),
                'paginate' => true,
                'nav_item' => true,
                'title'    => __( 'My Grades', 'lifterlms' ),
            ),
            'view-memberships'  => array(
                'content'  => 'lifterlms_template_student_dashboard_my_memberships',
                'endpoint' => get_option( 'lifterlms_myaccount_memberships_endpoint', 'my-memberships' ),
                'nav_item' => true,
                'title'    => __( 'My Memberships', 'lifterlms' ),
            ),
            'view-achievements' => array(
                'content'  => 'lifterlms_template_student_dashboard_my_achievements',
                'endpoint' => get_option( 'lifterlms_myaccount_achievements_endpoint', 'my-achievements' ),
                'paginate' => true,
                'nav_item' => true,
                'title'    => __( 'My Achievements', 'lifterlms' ),
            ),
            'view-certificates' => array(
                'content'  => 'lifterlms_template_student_dashboard_my_certificates',
                'endpoint' => get_option( 'lifterlms_myaccount_certificates_endpoint', 'my-certificates' ),
                'paginate' => true,
                'nav_item' => true,
                'title'    => __( 'My Certificates', 'lifterlms' ),
            ),
            'notifications'     => array(
                'content'  => 'lifterlms_template_student_dashboard_my_notifications',
                'endpoint' => get_option( 'lifterlms_myaccount_notifications_endpoint', 'notifications' ),
                'paginate' => true,
                'nav_item' => true,
                'title'    => __( 'Notifications', 'lifterlms' ),
            ),
            'edit-account'      => array(
                'content'  => array( __CLASS__, 'output_edit_account_content' ),
                'endpoint' => get_option( 'lifterlms_myaccount_edit_account_endpoint', 'edit-account' ),
                'nav_item' => true,
                'title'    => __( 'Edit Account', 'lifterlms' ),
            ),
            'redeem-voucher'    => array(
                'content'  => array( __CLASS__, 'output_redeem_voucher_content' ),
                'endpoint' => get_option( 'lifterlms_myaccount_redeem_vouchers_endpoint', 'redeem-voucher' ),
                'nav_item' => true,
                'title'    => __( 'Redeem a Voucher', 'lifterlms' ),
            ),
            'orders'            => array(
                'content'  => array( __CLASS__, 'output_orders_content' ),
                'endpoint' => get_option( 'lifterlms_myaccount_orders_endpoint', 'orders' ),
                'nav_item' => true,
                'title'    => __( 'Order History', 'lifterlms' ),
            ),
            'signout'           => array(
                'endpoint' => false,
                'title'    => __( 'Sign Out', 'lifterlms' ),
                'nav_item' => false,
                'url'      => wp_logout_url( llms_get_page_url( 'myaccount' ) ),
            ),
        );

        if ( llms_is_favorites_enabled() ) {
            $tabs = llms_assoc_array_insert(
                $tabs,
                'view-certificates',
                'view-favorites',
                array(
                    'content'  => 'llms_template_student_dashboard_my_favorites',
                    'endpoint' => get_option( 'lifterlms_myaccount_favorites_endpoint', 'my-favorites' ),
                    'paginate' => true,
                    'nav_item' => true,
                    'title'    => __( 'My Favorites', 'lifterlms' ),
                )
            );
        }

        return apply_filters(
            'llms_get_student_dashboard_tabs',
            $tabs
        );

    }

    /**
     * Retrieve dashboard tab data as required to display navigation links
     * Excludes any endpoint disabled by deleting the slug from account settings
     *
     * @return   array
     * @since    3.17.5
     * @version  3.17.5
     */
    public static function get_tabs_for_nav() {

        $tabs = array();

        foreach ( self::get_tabs() as $var => $data ) {

            if ( isset( $data['url'] ) ) {
                $url = $data['url'];
            } elseif ( ! empty( $data['endpoint'] ) ) {
                $url = llms_get_endpoint_url( $var, '', llms_get_page_url( 'myaccount' ) );
            } else {
                continue;
            }

            $tabs[ $var ] = array(
                'url'   => $url,
                'title' => $data['title'],
            );

        }

        return apply_filters( 'llms_get_student_dashboard_tabs_for_nav', $tabs );

    }

    /**
     * Determine if an endpoint is disabled
     * If the custom endpoint option is an empty string (blank) the settings define the endpoint as disabled
     *
     * @param    string $endpoint  endpoint slug (eg: my-courses)
     * @return   bool
     * @since    3.19.0
     * @version  3.19.0
     */
    public static function is_endpoint_enabled( $endpoint ) {

        $tabs = self::get_tabs();
        if ( isset( $tabs[ $endpoint ] ) && ! empty( $tabs[ $endpoint ]['endpoint'] ) ) {
            return true;
        }

        return false;

    }

    /**
     * Handle modification of the default dashboard title for certain pages and sub pages
     *
     * @param    string $title  default title HTML
     * @return   string
     * @since    3.24.0
     * @version  3.24.0
     */
    public function modify_dashboard_title( $title ) {

        global $wp_query;
        $tab = self::get_current_tab( 'tab' );

        if ( 'my-grades' === $tab && ! empty( $wp_query->query['my-grades'] ) ) {

            $course = get_posts(
                array(
                    'name'      => $wp_query->query['my-grades'],
                    'post_type' => 'course',
                )
            );

            $course = array_shift( $course );
            if ( $course ) {

                $data = self::get_current_tab();

                $new_title  = '<a href="' . esc_url( llms_get_endpoint_url( 'my-grades' ) ) . '">' . $data['title'] . '</a>';
                $new_title .= sprintf( ' %1$s <a href="%2$s">%3$s</a>', apply_filters( 'llms_student_dashboard_title_separator', '<small>&gt;</small>' ), get_permalink( $course->ID ), get_the_title( $course->ID ) );

                $title = str_replace( $data['title'], $new_title, $title );

            }
        }

        return $title;

    }

    public function modify_rewrite_rules_order( $rules ) {
        return $rules;
    }

    /**
     * Callback to output the edit account content
     *
     * @return   void
     * @since    3.0.0
     * @version  3.0.0
     */
    public static function output_edit_account_content() {
        llms_get_template(
            'myaccount/form-edit-account.php',
            array(
                'user' => get_user_by( 'id', get_current_user_id() ),
            )
        );
    }

    /**
     * Endpoint to output orders content
     *
     * @since 3.0.0
     * @since 3.8.0 Unknown.
     * @since 6.0.0 Use `llms_template_view_order()` in favor of including the template file directly.
     *
     * @return void
     */
    public static function output_orders_content() {

        global $wp;

        $args = array();

        if ( ! empty( $wp->query_vars['orders'] ) ) {

            $order = llms_get_post( $wp->query_vars['orders'] );
            llms_template_view_order( $order );

        } else {

            $student = new LLMS_Student();
            llms_get_template(
                'myaccount/my-orders.php',
                array(
                    'orders' => $student->get_orders(
                        array(
                            'page' => isset( $_GET['opage'] ) ? intval( $_GET['opage'] ) : 1,
                        )
                    ),
                )
            );

        }

    }

    /**
     * Callback to output content for the voucher endpoint
     *
     * @return   void
     * @since    3.0.0
     * @version  3.0.0
     */
    public static function output_redeem_voucher_content() {

        llms_get_template(
            'myaccount/form-redeem-voucher.php',
            array(
                'user' => get_user_by( 'id', get_current_user_id() ),
            )
        );

    }

}

return new LLMS_Student_Dashboard();