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
 | 
						|
	}
 | 
						|
}
 |