224 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * Reports API - Table Endpoint Handler
 | 
						|
 *
 | 
						|
 * @package     EDD
 | 
						|
 * @subpackage  Reports
 | 
						|
 * @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\Reports\Data;
 | 
						|
 | 
						|
// Exit if accessed directly
 | 
						|
defined( 'ABSPATH' ) || exit;
 | 
						|
 | 
						|
/**
 | 
						|
 * Handler for building a table endpoint in the Reports API.
 | 
						|
 *
 | 
						|
 * @since 3.0
 | 
						|
 */
 | 
						|
final class Table_Endpoint extends Endpoint {
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Endpoint view (type).
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   string
 | 
						|
	 */
 | 
						|
	protected $view = 'table';
 | 
						|
 | 
						|
	/**
 | 
						|
	 * List table instance.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   WP_List_Table
 | 
						|
	 */
 | 
						|
	private $list_table;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Represents the full path to the list table class file.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   string
 | 
						|
	 */
 | 
						|
	private $class_file;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Sets up the table endpoint.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @param array $args Table endpoint attributes.
 | 
						|
	 */
 | 
						|
	public function __construct( array $args ) {
 | 
						|
		$this->errors = new \WP_Error();
 | 
						|
 | 
						|
		// ID and Label.
 | 
						|
		$this->set_props( $args );
 | 
						|
 | 
						|
		// List table set up and dumping display args.
 | 
						|
		$this->setup_list_table( $args );
 | 
						|
 | 
						|
		// Parse display attributes from defaults.
 | 
						|
		$args = $this->parse_display_props( $args );
 | 
						|
 | 
						|
		parent::__construct( $args );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Sets display-related properties for the Endpoint.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @param array $endpoint Endpoint record from the registry.
 | 
						|
	 */
 | 
						|
	private function parse_display_props( $endpoint ) {
 | 
						|
 | 
						|
		$view_type = $this->get_view();
 | 
						|
 | 
						|
		if ( ! empty( $endpoint['views'][ $view_type ] ) ) {
 | 
						|
 | 
						|
			$view_atts = $endpoint['views'][ $view_type ];
 | 
						|
 | 
						|
			$list_table = $this->get_list_table();
 | 
						|
 | 
						|
			if ( null === $list_table ) {
 | 
						|
				return $endpoint;
 | 
						|
			}
 | 
						|
 | 
						|
			$endpoint['views'][ $view_type ] = $this->maybe_convert_callbacks_to_methods( $view_atts, $list_table );
 | 
						|
		}
 | 
						|
 | 
						|
		return $endpoint;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Sets attributes related to the list table.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @param array $endpoint Table endpoint arguments.
 | 
						|
	 */
 | 
						|
	private function setup_list_table( $endpoint ) {
 | 
						|
 | 
						|
		if ( ! empty( $endpoint['views'][ $this->view ]['display_args'] ) ) {
 | 
						|
 | 
						|
			$display_args = $endpoint['views'][ $this->view ]['display_args'];
 | 
						|
 | 
						|
			if ( ! empty( $display_args['class_name'] ) ) {
 | 
						|
 | 
						|
				if ( ! empty( $display_args['class_file'] ) ) {
 | 
						|
 | 
						|
					$this->set_class_file( $display_args['class_file'] );
 | 
						|
 | 
						|
					$this->set_list_table( $display_args['class_name'] );
 | 
						|
 | 
						|
				} else {
 | 
						|
 | 
						|
					$this->errors->add(
 | 
						|
						'missing_table_class_file',
 | 
						|
						sprintf( 'The list table class file for the \'%1$s\' endpoint is missing.', $this->get_id() )
 | 
						|
					);
 | 
						|
 | 
						|
				}
 | 
						|
 | 
						|
			} else {
 | 
						|
 | 
						|
				$this->errors->add(
 | 
						|
					'missing_table_class_name',
 | 
						|
					sprintf( 'The list table class name for the \'%1$s\' endpoint is missing.',
 | 
						|
						$this->get_id()
 | 
						|
					)
 | 
						|
				);
 | 
						|
 | 
						|
			}
 | 
						|
 | 
						|
			// Dump the display args as they're no longer needed.
 | 
						|
			$endpoint['views'][ $this->view ]['display_args'] = array();
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieves the list table class file.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @return string|null Class file if set, otherwise null.
 | 
						|
	 */
 | 
						|
	public function get_class_file() {
 | 
						|
		return $this->class_file;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Sets the list table class file.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @param string $file Class file.
 | 
						|
	 */
 | 
						|
	private function set_class_file( $file ) {
 | 
						|
		if ( false === strpos( $file, '..' ) && false === strpos( $file, './' ) ) {
 | 
						|
			$this->class_file = $file;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieves the list table instance.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @return WP_List_Table|null List table instance if set, otherwise null.
 | 
						|
	 */
 | 
						|
	public function get_list_table() {
 | 
						|
		return $this->list_table;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Sets the list table instance.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @see get_class_file()
 | 
						|
	 *
 | 
						|
	 * @param string $class List table class name.
 | 
						|
	 */
 | 
						|
	private function set_list_table( $class ) {
 | 
						|
		if ( ! class_exists( $class ) ) {
 | 
						|
			$path_to_file = $this->get_class_file();
 | 
						|
 | 
						|
			if ( file_exists( $path_to_file ) ) {
 | 
						|
				require_once $path_to_file;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		$this->list_table = new $class;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Display logic for the current table endpoint.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 */
 | 
						|
	public function display() {
 | 
						|
		$callback = $this->get_display_callback();
 | 
						|
 | 
						|
		if ( is_callable( $callback ) ) {
 | 
						|
			$table = $this->get_list_table();
 | 
						|
 | 
						|
			if ( null !== $table ) {
 | 
						|
				// Prep the table data for display (prepare_items).
 | 
						|
				$this->get_data();
 | 
						|
 | 
						|
				call_user_func_array( $callback, array(
 | 
						|
					$this, // Endpoint
 | 
						|
					$table, // Table
 | 
						|
					$this->get_display_args(), // Args
 | 
						|
				) );
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
}
 |