325 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			325 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Sections Class
 | |
|  *
 | |
|  * @package     EDD
 | |
|  * @subpackage  Admin
 | |
|  * @copyright   Copyright (c) 2018, Easy Digital Downloads, LLC
 | |
|  * @license     http://opensource.org/licenses/gpl-2.0.php GNU Public License
 | |
|  * @since       3.0
 | |
|  */
 | |
| 
 | |
| namespace EDD\Admin;
 | |
| 
 | |
| // Exit if accessed directly
 | |
| defined( 'ABSPATH' ) || exit;
 | |
| 
 | |
| /**
 | |
|  * Main class for creating a vertically tabbed UI
 | |
|  *
 | |
|  * @since 3.0
 | |
|  */
 | |
| class Sections {
 | |
| 
 | |
| 	/**
 | |
| 	 * Section ID
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @var array
 | |
| 	 */
 | |
| 	protected $id = 'edd_general_';
 | |
| 
 | |
| 	/**
 | |
| 	 * Sections
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @var array
 | |
| 	 */
 | |
| 	protected $sections = array();
 | |
| 
 | |
| 	/**
 | |
| 	 * ID of the currently selected section
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $current_section = 'general';
 | |
| 
 | |
| 	/**
 | |
| 	 * Whether to use JavaScript should
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $use_js = true;
 | |
| 
 | |
| 	/**
 | |
| 	 * Base URL for each section
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $base_url = '';
 | |
| 
 | |
| 	/**
 | |
| 	 * The object, if any
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @var object
 | |
| 	 */
 | |
| 	public $item = false;
 | |
| 
 | |
| 	/** Public Methods ********************************************************/
 | |
| 
 | |
| 	/**
 | |
| 	 * Constructor
 | |
| 	 *
 | |
| 	 * Might be useful someday
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 */
 | |
| 	public function __construct() {
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Setup default sections
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 */
 | |
| 	public function set_sections( $sections = array() ) {
 | |
| 		if ( empty( $sections ) ) {
 | |
| 			$this->add_section( array(
 | |
| 				'id'       => 'general',
 | |
| 				'label'    => esc_html__( 'General', 'easy-digital-downloads' ),
 | |
| 				'callback' => array( $this, 'section_general' )
 | |
| 			) );
 | |
| 		} elseif ( count( $sections ) ) {
 | |
| 			foreach ( $sections as $section ) {
 | |
| 				$this->add_section( $section );
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Setup the sections for the current item
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @param object $item
 | |
| 	 */
 | |
| 	public function set_item( $item = false ) {
 | |
| 		$this->item = $item;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Output the contents
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 */
 | |
| 	public function display() {
 | |
| 		$use_js = ! empty( $this->use_js )
 | |
| 			? ' use-js'
 | |
| 			: '';
 | |
| 		$role   = $this->use_js ? 'tablist' : 'menu';
 | |
| 
 | |
| 		ob_start(); ?>
 | |
| 
 | |
| 		<div class="edd-sections-wrap">
 | |
| 			<div class="edd-vertical-sections<?php echo $use_js; ?>">
 | |
| 				<ul class="section-nav" role="<?php echo esc_attr( $role ); ?>">
 | |
| 					<?php echo $this->get_all_section_links(); ?>
 | |
| 				</ul>
 | |
| 
 | |
| 				<div class="section-wrap">
 | |
| 					<?php echo $this->get_all_section_contents(); ?>
 | |
| 				</div>
 | |
| 				<br class="clear" />
 | |
| 			</div>
 | |
| 			<?php $this->nonce_field();
 | |
| 
 | |
| 			if ( ! empty( $this->item ) ) : ?>
 | |
| 
 | |
| 				<input type="hidden" name="edd-item-id" value="<?php echo esc_attr( $this->item->id ); ?>" />
 | |
| 
 | |
| 			<?php endif; ?>
 | |
| 		</div>
 | |
| 
 | |
| 		<?php
 | |
| 
 | |
| 		// Output current buffer
 | |
| 		echo ob_get_clean();
 | |
| 	}
 | |
| 
 | |
| 	/** Private Methods *******************************************************/
 | |
| 
 | |
| 	/**
 | |
| 	 * Add a section
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @param array $section
 | |
| 	 */
 | |
| 	private function add_section( $section = array() ) {
 | |
| 		$this->sections[] = (object) wp_parse_args( $section, array(
 | |
| 			'id'       => '',
 | |
| 			'label'    => '',
 | |
| 			'icon'     => 'admin-settings',
 | |
| 			'callback' => ''
 | |
| 		) );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Is a section the current section?
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @param string $section_id
 | |
| 	 *
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	private function is_current_section( $section_id = '' ) {
 | |
| 		return ( $section_id === $this->current_section );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Output the nonce field for the meta box
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 */
 | |
| 	protected function nonce_field() {
 | |
| 		wp_nonce_field(
 | |
| 			'edd_' . $this->id . '_sections_nonce',
 | |
| 			'edd_' . $this->id . 'nonce_sections',
 | |
| 			true
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get all section links
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	protected function get_all_section_links() {
 | |
| 		ob_start();
 | |
| 
 | |
| 		// Loop through sections
 | |
| 		foreach ( $this->sections as $section ) :
 | |
| 
 | |
| 			$url = $this->use_js
 | |
| 				? '#' . esc_attr( $this->id . $section->id )
 | |
| 				: add_query_arg( 'view', sanitize_key( $section->id ), $this->base_url );
 | |
| 
 | |
| 			// Special selected section
 | |
| 			$selected = ! $this->use_js && $this->is_current_section( $section->id )
 | |
| 				? 'aria-current="true"'
 | |
| 				: '';
 | |
| 			$class           = $this->is_current_section( $section->id ) ? 'section-title section-title--is-active' : 'section-title';
 | |
| 			$aria_attributes = $this->use_js ? 'role="tab" aria-controls="' . esc_attr( $this->id . $section->id ) . '"' : 'role="menuitem"';
 | |
| 			?>
 | |
| 
 | |
| 			<li class="<?php echo esc_attr( $class ); ?>" <?php echo $aria_attributes . ' ' . $selected; ?>>
 | |
| 				<a href="<?php echo esc_url( $url ); ?>">
 | |
| 					<span class="dashicons dashicons-<?php echo esc_attr( $section->icon ); ?>"></span>
 | |
| 					<span class="label"><?php echo $section->label; // Allow HTML ?></span>
 | |
| 				</a>
 | |
| 			</li>
 | |
| 
 | |
| 		<?php endforeach;
 | |
| 
 | |
| 		// Return current buffer
 | |
| 		return ob_get_clean();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get all section contents
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	protected function get_all_section_contents() {
 | |
| 		ob_start();
 | |
| 
 | |
| 		// Maybe reduce sections down to single
 | |
| 		$sections = empty( $this->use_js )
 | |
| 			? wp_filter_object_list( $this->sections, array( 'id' => $this->current_section ) )
 | |
| 			: $this->sections;
 | |
| 
 | |
| 		// Bail if no sections
 | |
| 		if ( empty( $sections ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Loop through sections
 | |
| 		foreach ( $sections as $section ) :
 | |
| 
 | |
| 			// Special selected section
 | |
| 			$selected = ! $this->is_current_section( $section->id )
 | |
| 				? 'style="display: none;"'
 | |
| 				: ''; ?>
 | |
| 
 | |
| 			<div id="<?php echo esc_attr( $this->id . $section->id ); ?>" class="section-content" <?php echo $selected; ?>><?php
 | |
| 
 | |
| 				// Callback or action
 | |
| 				if ( ! empty( $section->callback ) ) {
 | |
| 					if ( is_callable( $section->callback ) ) {
 | |
| 						call_user_func( $section->callback, $this->item );
 | |
| 
 | |
| 					} elseif ( is_array( $section->callback ) && is_callable( $section->callback[0] ) ) {
 | |
| 						isset( $section->callback[1] )
 | |
| 							? call_user_func_array( $section->callback[0], $section->callback[1] )
 | |
| 							: call_user_func_array( $section->callback[0], array() );
 | |
| 
 | |
| 					} else {
 | |
| 						_e( 'Invalid section', 'easy-digital-downloads' );
 | |
| 					}
 | |
| 				} else {
 | |
| 					die;
 | |
| 					do_action( 'edd_' . $section->id . 'section_contents', $this );
 | |
| 				}
 | |
| 
 | |
| 			?></div>
 | |
| 
 | |
| 		<?php endforeach;
 | |
| 
 | |
| 		// Return current buffer
 | |
| 		return ob_get_clean();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Output a section
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @param object $item
 | |
| 	*/
 | |
| 	protected function section_general() {
 | |
| 		?>
 | |
| 
 | |
| 		<table class="form-table rowfat">
 | |
| 			<tbody>
 | |
| 				<tr>
 | |
| 					<th>
 | |
| 						<label><?php esc_html_e( 'Empty', 'easy-digital-downloads' ); ?></label>
 | |
| 					</th>
 | |
| 
 | |
| 					<td>
 | |
| 						—
 | |
| 					</td>
 | |
| 				</tr>
 | |
| 			</tbody>
 | |
| 		</table>
 | |
| 
 | |
| 		<?php
 | |
| 	}
 | |
| }
 |