lightspeeddevelopment/lsx-search

View on GitHub
classes/admin/class-settings-theme.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
namespace lsx\search\classes\admin;

use CMB_Tab_Field;

/**
 * Houses the functions for the CMB2 Settings page.
 *
 * @package lsx-search
 */
class Settings_Theme {

    /**
     * Holds class instance
     *
     * @since 1.0.0
     *
     * @var      object \lsx\search\classes\admin\Settings_Theme()
     */
    protected static $instance = null;

    /**
     * Will return true if this is the LSX Search settings page.
     *
     * @var array
     */
    public $is_options_page = false;

    /**
     * Holds the id and labels for the navigation.
     *
     * @var array
     */
    public $navigation = array();

    /**
     * Contructor
     */
    public function __construct() {
        add_filter( 'cmb2_enqueue_css', array( $this, 'disable_cmb2_styles' ), 1, 1 );
        add_action( 'cmb2_before_form', array( $this, 'generate_navigation' ), 10, 4 );
        add_action( 'cmb2_before_title_field_row', array( $this, 'output_tab_open_div' ), 10, 1 );
        add_action( 'cmb2_after_tab_closing_field_row', array( $this, 'output_tab_closing_div' ), 10, 1 );
        add_action( 'cmb2_render_tab_closing', array( $this, 'cmb2_render_callback_for_tab_closing' ), 10, 5 );
        add_filter( 'cmb2_sanitize_tab_closing', array( $this, 'cmb2_sanitize_tab_closing_callback' ), 10, 2 );
        add_action( 'cmb2_after_form', array( $this, 'navigation_js' ), 10, 4 );
        add_filter( 'cmb2_options_page_redirect_url', array( $this, 'add_tab_argument' ), 10, 1 );
    }

    /**
     * Return an instance of this class.
     *
     * @since 1.0.0
     *
     * @return    object \lsx\search\classes\admin\Settings_Theme()    A single instance of this class.
     */
    public static function get_instance() {
        // If the single instance hasn't been set, set it now.
        if ( null == self::$instance ) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    /**
     * Disable CMB2 styles on front end forms.
     *
     * @return bool $enabled Whether to enable (enqueue) styles.
     */
    public function disable_cmb2_styles( $enabled ) {
        if ( is_admin() ) {
            $current_screen = get_current_screen();
            if ( is_object( $current_screen ) && 'settings_page_lsx-search-settings' === $current_screen->id ) {
                $enabled = false;
            }
        }
        return $enabled;
    }

    /**
     * Generates the tabbed navigation for the settings page.
     *
     * @param string $cmb_id
     * @param string $object_id
     * @param string $object_type
     * @param object $cmb2_obj
     * @return void
     */
    public function generate_navigation( $cmb_id, $object_id, $object_type, $cmb2_obj ) {
        if ( 'lsx_search_settings' === $cmb_id && 'lsx-search-settings' === $object_id && 'options-page' === $object_type ) {
            $this->navigation      = array();
            $this->is_options_page = true;
            if ( isset( $cmb2_obj->meta_box['fields'] ) && ! empty( $cmb2_obj->meta_box['fields'] ) ) {
                foreach ( $cmb2_obj->meta_box['fields'] as $field_index => $field ) {
                    if ( 'title' === $field['type'] ) {
                        $this->navigation[ $field_index ] = $field['name'];
                    }
                }
            }
            $this->output_navigation();
        }
    }

    /**
     * Outputs the WP style navigation for the Settings page.
     *
     * @return void
     */
    public function output_navigation() {
        if ( ! empty( $this->navigation ) ) {
            ?>
            <div class="wp-filter hide-if-no-js">
                <ul class="filter-links">
                    <?php
                    $first_tab    = true;
                    $total        = count( $this->navigation );
                    $count        = 0;
                    $separator    = ' |';
                    $selected_tab = '';
                    if ( isset( $_GET['cmb_tab'] ) && '' !== $_GET['cmb_tab'] ) {
                        $selected_tab  = sanitize_text_field( $_GET['cmb_tab'] );
                        $selected_tab  = 'settings_' . $selected_tab;
                    }
                    foreach ( $this->navigation as $key => $label ) {
                        $count++;
                        $current_css = '';
                        if ( ( true === $first_tab && '' === $selected_tab ) || $key === $selected_tab ) {
                            $first_tab   = false;
                            $current_css = 'current';
                        }
                        if ( $count === $total ) {
                            $separator = '';
                        }
                        ?>
                            <li><a href="#" class="<?php echo esc_attr( $current_css ); ?>" data-sort="<?php echo esc_attr( $key ); ?>_tab"><?php echo esc_attr( $label ); ?></a><?php echo esc_attr( $separator ); ?></li>
                        <?php
                    }
                    ?>
                </ul>
            </div>
            <?php
        }
    }

    /**
     * Outputs the opening tab div.
     *
     * @param object $field CMB2_Field();
     * @return void
     */
    public function output_tab_open_div( $field ) {
        if ( true === $this->is_options_page && isset( $field->args['type'] ) && 'title' === $field->args['type'] ) {
            ?>
            <div id="<?php echo esc_attr( $field->args['id'] ); ?>_tab" class="tab tab-nav hidden">
            <?php
        }
    }

    /**
     * Outputs the opening closing div.
     *
     * @param object $field CMB2_Field();
     * @return void
     */
    public function output_tab_closing_div( $field ) {
        if ( true === $this->is_options_page && isset( $field->args['type'] ) && 'tab_closing' === $field->args['type'] ) {
            ?>
            </div>
            <?php
        }
    }

    public function cmb2_render_callback_for_tab_closing( $field, $escaped_value, $object_id, $object_type, $field_type_object ) {
        return;
    }

    public function cmb2_sanitize_tab_closing_callback( $override_value, $value ) {
        return '';
    }

    /**
     * Outputs the Script for the tabbed navigation.
     *
     * @param string $cmb_id
     * @param string $object_id
     * @param string $object_type
     * @param object $cmb2_obj
     * @return void
     */
    public function navigation_js( $cmb_id, $object_id, $object_type, $cmb2_obj ) {
        if ( 'lsx_search_settings' === $cmb_id && 'lsx-search-settings' === $object_id && 'options-page' === $object_type ) {
            ?>
            <script>
                var LSX_SEARCH_CMB2 = Object.create( null );

                ;( function( $, window, document, undefined ) {

                    'use strict';

                    LSX_SEARCH_CMB2.document = $(document);

                    /**
                     * Start the JS Class
                     */
                    LSX_SEARCH_CMB2.init = function() {
                        var tab = LSX_SEARCH_CMB2.urlParam( 'cmb_tab' );
                        if ( 0 === tab || '0' === tab ) {
                            tab = '';
                        }
                        LSX_SEARCH_CMB2.addTabInput( tab );
                        LSX_SEARCH_CMB2.prepNavigation( tab );
                        LSX_SEARCH_CMB2.watchNavigation();
                    };

                    LSX_SEARCH_CMB2.addTabInput = function( tab = '' ) {
                        var counter = 1;
                        $( "form.cmb-form" ).append('<input type="hidden" name="cmb_tab" value="' + tab + '" />');
                    }

                    LSX_SEARCH_CMB2.prepNavigation = function( tab = '' ) {
                        var counter = 1;
                        $( ".tab.tab-nav" ).each(function(){
                            console.log( tab );
                            if ( ( 1 !== counter && '' === tab ) || ( '' !== tab && 'settings_' + tab + '_tab' !== $( this ).attr('id') ) ) {
                                $( this ).hide().removeClass('hidden');
                            } else {
                                $( this ).addClass( 'current' ).removeClass('hidden');
                            }
                            counter++;
                        });
                    }

                    LSX_SEARCH_CMB2.watchNavigation = function() {
                        $( ".wp-filter li a" ).on( 'click', function(event){
                            event.preventDefault();
                            // Change the current Tab heading.
                            $( ".wp-filter li a" ).removeClass('current');
                            $( this ).addClass('current');

                            // Change the current tab div.
                            var target = $( this ).attr('data-sort');
                            $( ".tab.tab-nav.current" ).hide().removeClass('current');
                            $( "#"+target ).show().addClass('current');
                            $( 'input[name="cmb_tab"]').val(target);
                        });
                    };

                    LSX_SEARCH_CMB2.urlParam = function(name){
                        var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
                        if ( results == null ){
                            return 0;
                        } else {
                            return results[1] || 0;
                        }
                    }

                    LSX_SEARCH_CMB2.document.ready( function() {
                        LSX_SEARCH_CMB2.init();
                    } );

                } )( jQuery, window, document );
            </script>
            <?php
        }
    }

    /**
     * This will add the tab selection to the url.
     *
     * @param string $url
     * @return void
     */
    public function add_tab_argument( $url ) {
        if ( isset( $_POST['cmb_tab'] ) && '' !== $_POST['cmb_tab'] ) { // @codingStandardsIgnoreLine
            $tab_selection = sanitize_text_field( $_POST['cmb_tab'] ); // @codingStandardsIgnoreLine
            $tab_selection = str_replace( array( 'settings_', '_tab' ), '', $tab_selection ); // @codingStandardsIgnoreLine
            if ( 'single' !== $tab_selection ) {
                $url = add_query_arg( 'cmb_tab', $tab_selection, $url );
            } else {
                $url = remove_query_arg( 'cmb_tab', $url );
            }
        }
        return $url;
    }
}