LLMS_View_Manager
LLMS_View_Manager class.
Contents
Source Source
File: includes/class.llms.view.manager.php
class LLMS_View_Manager { /** * Constructor * * @since 3.7.0 * @since 4.2.0 Added early return when creating a pending order. */ public function __construct() { // Do nothing if we're creating a pending order. if ( ! empty( $_POST['action'] ) && 'create_pending_order' === $_POST['action'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing return; } add_action( 'init', array( $this, 'add_actions' ) ); } /** * Add actions & filters. * * @since 3.7.0 * @since 4.2.0 Added filter to handle the displaying of the free enroll. * @since 4.16.0 Added filters to handle modification of the student dashboard. * @since 5.9.0 Pass second parameter to `modify_course_open()` methods. * * @return void */ public function add_actions() { // Output view links on the admin menu. add_action( 'admin_bar_menu', array( $this, 'add_menu_items' ), 777 ); // Filter page restrictions. add_filter( 'llms_page_restricted', array( $this, 'modify_restrictions' ), 10, 1 ); add_filter( 'llms_is_course_open', array( $this, 'modify_course_open' ), 10, 2 ); add_filter( 'llms_is_course_enrollment_open', array( $this, 'modify_course_open' ), 10, 2 ); // Filters we'll only run when view as links are called. if ( isset( $_GET['llms-view-as'] ) ) { // phpcs:disable WordPress.Security.NonceVerification.Recommended add_filter( 'llms_is_course_complete', array( $this, 'modify_completion' ), 10, 1 ); add_filter( 'llms_is_lesson_complete', array( $this, 'modify_completion' ), 10, 1 ); add_filter( 'llms_is_track_complete', array( $this, 'modify_completion' ), 10, 1 ); add_filter( 'llms_get_enrollment_status', array( $this, 'modify_enrollment_status' ), 10, 1 ); add_filter( 'llms_display_free_enroll_form', array( $this, 'modify_display_free_enroll_form' ), 10, 1 ); add_filter( 'llms_display_student_dashboard', array( $this, 'modify_dashboard' ), 10, 1 ); add_filter( 'llms_hide_registration_form', array( $this, 'modify_dashboard' ), 10, 1 ); add_filter( 'llms_enable_open_registration', array( $this, 'enable_open_reg' ), 10, 1 ); add_filter( 'llms_hide_login_form', array( $this, 'modify_dashboard' ), 10, 1 ); add_action( 'wp_enqueue_scripts', array( $this, 'scripts' ) ); } } /** * Add view links to the admin menu bar for qualifying users. * * @since 3.7.0 * @since 3.16.0 Unknown. * @since 4.2.0 Updated icon. * @since 4.5.1 Use `should_display()` method to determine if the view manager should be added to the admin bar. * @since 4.16.0 Retrieve nodes to add from `get_menu_items_to_add()`. * * @param WP_Admin_Bar $wp_admin_bar Admin bar class instance. * @return void */ public function add_menu_items( $wp_admin_bar ) { if ( ! $this->should_display() ) { return; } foreach ( $this->get_menu_items_to_add() as $node ) { $wp_admin_bar->add_node( $node ); } } /** * Forces open registration on when previewing the registration form * * If open registration is disabled, adds an action to output an info notice at the start * of the form alerting users that they're viewing a preview. * * @since 5.0.0 * * @param string $status Current open registration status. * @return string */ public function enable_open_reg( $status ) { if ( ! llms_parse_bool( $status ) ) { add_action( 'lifterlms_register_form_start', array( $this, 'open_reg_notice' ) ); } return 'yes'; } /** * Inline JS. * * Updates links so admins can navigate around quickly when "viewing as". * * @since 3.7.0 * @since 3.35.0 Sanitize `$_GET` data. * @since 5.9.0 Stop using deprecated `FILTER_SANITIZE_STRING`. * * @return string */ private function get_inline_script() { ob_start(); ?> window.llms.ViewManager.set_nonce( '<?php echo llms_filter_input_sanitize_string( INPUT_GET, 'view_nonce' ); ?>' ).set_view( '<?php echo $this->get_view(); ?>' ).update_links(); <?php return ob_get_clean(); } /** * Retrieve an array of nodes to be added to the admin bar * * @since 4.16.0 * * @return array[] An array of arrays formatted to be passed to `WP_Admin_Bar::add_node()`. */ private function get_menu_items_to_add() { $nodes = array(); $view = $this->get_view(); $views = $this->get_views(); $top_id = 'llms-view-as-menu'; // Translators: %s = View manager role name. $title = sprintf( __( 'Viewing as %s', 'lifterlms' ), $views[ $view ] ); // Add the top-level node. $nodes[] = array( 'id' => $top_id, 'parent' => 'top-secondary', 'title' => '<span class="ab-icon"><img src="' . llms()->plugin_url() . '/assets/images/lifterlms-icon.png" style="height:17px;margin-top:3px;opacity:0.65;"></span>' . $title, ); // Add view as links. foreach ( $views as $role => $name ) { // Exclude the current view. if ( $role === $view ) { continue; } $nodes[] = array( 'href' => self::get_url( $role ), 'id' => 'llms-view-as--' . $role, 'parent' => $top_id, // Translators: %s = View manager role name. 'title' => sprintf( __( 'View as %s', 'lifterlms' ), $name ), ); } return $nodes; } /** * Get a view url for the requested view. * * @since 3.7.0 * @since 4.2.0 Take into account already present query args. e.g. ?plan=X. * @since 4.16.0 Changed method signature to add the `$href` parameter and changed access from private to public static. * * @param string $role Role to view the screen as. Accepts "self", "visitor", or "student". * @param string|false $href Optional. The URL to create a URL for. If `false`, uses `$_SERVER['REQUEST_URI']`. * @param array $args Optional. Additional query args to add to the url. Default empty array. * @return string */ public static function get_url( $role, $href = false, $args = array() ) { // If we want to view as "self" we should remove the query vars (if they're set). if ( 'self' === $role ) { return remove_query_arg( array( 'llms-view-as', 'view_nonce' ), $href ); } // Create a new URL. $args['llms-view-as'] = $role; $href = add_query_arg( $args, $href ); return html_entity_decode( esc_url( wp_nonce_url( $href, 'llms-view-as', 'view_nonce' ) ) ); } /** * Get the current view role/type. * * @since 3.7.0 * @since 3.35.0 Sanitize `$_GET` data. * @since 4.16.0 Don't access `$_GET` directly, use `llms_filter_input()`. * @since 5.9.0 Stop using deprecated `FILTER_SANITIZE_STRING`. * * @return string */ private function get_view() { if ( ! llms_verify_nonce( 'view_nonce', 'llms-view-as', 'GET' ) ) { return 'self'; } // Ensure it's a valid view. $views = $this->get_views(); $view = llms_filter_input( INPUT_GET, 'llms-view-as' ); if ( ! $view || ! isset( $views[ $view ] ) ) { return 'self'; } return $view; } /** * Test get_views() method * * @since 4.16.0 * * @return void */ public function test_get_views() { $this->assertEquals( array( 'self', 'visitor', 'student' ), array_keys( LLMS_Unit_Test_Util::call_method( $this->main, 'get_views' ) ) ); } /** * Get a list of available views. * * @since 3.7.0 * * @return array */ private function get_views() { return array( 'self' => __( 'Myself', 'lifterlms' ), 'visitor' => __( 'Visitor', 'lifterlms' ), 'student' => __( 'Student', 'lifterlms' ), ); } /** * Modify the completion status of course, lessons, tracks based on current view. * * Visitors and students will always show content as not completed. * * @since 3.7.0 * * @param boolean $completed The actual status for the current user. * @return boolean */ public function modify_completion( $completed ) { switch ( $this->get_view() ) { case 'visitor': $status = false; break; case 'student': $status = true; break; } return $completed; } /** * Modify the status of a course access period based on the current view. * * Students and Visitors will see the actual access period. * * If viewing as self and self can bypass restrictions will appear as if course is open. * * @since 3.7.0 * @since 5.9.0 Pass the course ID to `llms_can_user_bypass_restrictions()`. * * @param boolean $status The default status. * @return boolean */ public function modify_course_open( $status, $course ) { if ( 'self' === $this->get_view() && llms_can_user_bypass_restrictions( get_current_user_id(), $course->get( 'id' ) ) ) { return true; } return $status; } /** * Modify the student dashboard * * @since 4.16.0 * * @param boolean $value Default value from the filter. * @return boolean */ public function modify_dashboard( $value ) { switch ( $this->get_view() ) { case 'visitor': $value = false; break; case 'student': $value = true; break; } return $value; } /** * Modify the enrollment status of current user based on the view. * * Students will always show as enrolled. * * Visitors will always show as not-enrolled. * * @since 3.7.0 * * @param string $status The actual status for the current user. * @return string */ public function modify_enrollment_status( $status ) { switch ( $this->get_view() ) { case 'visitor': $status = false; break; case 'student': $status = 'enrolled'; break; } return $status; } /** * Modify the displaying of the free enroll form (free access plans). * * Visitors will never be shown the free enroll form. * * @since 4.2.0 * * @param bool $display Whether or not the form is being displayed. * @return bool */ public function modify_display_free_enroll_form( $display ) { if ( ! $display || 'visitor' === $this->get_view() ) { return false; } return $display; } /** * Modify llms_page_restricted for qualifying users to allow them to bypass restrictions. * * @since 3.7.0 * @since 5.9.0 Pass the course ID to `llms_can_user_bypass_restrictions()`. * * @param array $restrictions Restriction data. * @return array */ public function modify_restrictions( $restrictions ) { if ( 'self' === $this->get_view() && llms_can_user_bypass_restrictions( get_current_user_id(), $restrictions['restriction_id'] ) ) { $restrictions['is_restricted'] = false; $restrictions['reason'] = 'role-access'; } return $restrictions; } /** * Output a notice alerting users that open registration is currently disabled * * @since 5.0.0 * @since 5.3.3 Added missing textdomain. * * @return void */ public function open_reg_notice() { llms_print_notice( __( 'This is a preview of the Open Registration form but Open Registration is currently disabled. Enable Open Registration to allow users to create accounts on this page.', 'lifterlms' ), 'debug' ); } /** * Enqueue Scripts. * * @since 3.7.0 * @since 3.17.8 Unknown. * @since 3.35.0 Declare asset version. * * @return void */ public function scripts() { // If it's self we don't need anything fancy going on here. if ( 'self' === $this->get_view() ) { return; } wp_enqueue_script( 'llms-view-manager', LLMS_PLUGIN_URL . '/assets/js/llms-view-manager' . LLMS_ASSETS_SUFFIX . '.js', array( 'jquery' ), llms()->version, true ); wp_add_inline_script( 'llms-view-manager', $this->get_inline_script(), 'after' ); } /** * Determine whether or not the view manager should be added to the WP Admin Bar * * The view manager is only displayed when the following criteria is met: * + The current user must have a role that is allowed to bypass LifterLMS restrictions * + Must be viewing one of the following: * + a single course, lesson, membership, or quiz * + LifterLMS checkout page * + LifterLMS student dashboard page * * @since 4.5.1 * @since 4.16.0 Display on the student dashboard. * @since 5.9.0 When possible, pass the post ID to `llms_can_user_bypass_restrictions()`. * * @return boolean */ protected function should_display() { $display = false; global $post; $is_restricted_post = $post && ( is_llms_checkout() || is_llms_account_page() || in_array( $post->post_type, array( 'course', 'lesson', 'llms_membership', 'llms_quiz' ), true ) ); $post_id = $is_restricted_post ? $post->ID : null; if ( llms_can_user_bypass_restrictions( get_current_user_id(), $post_id ) ) { $display = is_admin() || is_post_type_archive() || ! $post || ! $is_restricted_post ? false : true; } /** * Filters whether or not the "View As..." menu item should be displayed in the WP Admin Bar * * @since 4.5.1 * * @param boolean $display Whether or not the menu item should be displayed. */ return apply_filters( 'llms_view_manager_should_display', $display ); } }
Expand full source code Collapse full source code View on GitHub
Methods Methods
- __construct — Constructor
- add_actions — Add actions & filters.
- add_menu_items — Add view links to the admin menu bar for qualifying users.
- enable_open_reg — Forces open registration on when previewing the registration form
- get_inline_script — Inline JS.
- get_menu_items_to_add — Retrieve an array of nodes to be added to the admin bar
- get_url — Get a view url for the requested view.
- get_view — Get the current view role/type.
- get_views — Get a list of available views.
- modify_completion — Modify the completion status of course, lessons, tracks based on current view.
- modify_course_open — Modify the status of a course access period based on the current view.
- modify_dashboard — Modify the student dashboard
- modify_display_free_enroll_form — Modify the displaying of the free enroll form (free access plans).
- modify_enrollment_status — Modify the enrollment status of current user based on the view.
- modify_restrictions — Modify llms_page_restricted for qualifying users to allow them to bypass restrictions.
- open_reg_notice — Output a notice alerting users that open registration is currently disabled
- scripts — Enqueue Scripts.
- should_display — Determine whether or not the view manager should be added to the WP Admin Bar
- test_get_views — Test get_views() method
Changelog Changelog
Version | Description |
---|---|
3.7.0 | Introduced. |