293 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			293 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * Reports API - Report Registry
 | 
						|
 *
 | 
						|
 * @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;
 | 
						|
 | 
						|
use EDD\Utils;
 | 
						|
use EDD\Reports;
 | 
						|
 | 
						|
/**
 | 
						|
 * Implements a singleton registry for registering reports.
 | 
						|
 *
 | 
						|
 * @since 3.0
 | 
						|
 *
 | 
						|
 * @see \EDD\Reports\Registry
 | 
						|
 * @see \EDD\Utils\Static_Registry
 | 
						|
 *
 | 
						|
 * @method array get_report( string $report_id )
 | 
						|
 * @method void  remove_report( string $report_id )
 | 
						|
 */
 | 
						|
class Report_Registry extends Reports\Registry implements Utils\Static_Registry {
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Item error label.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   string
 | 
						|
	 */
 | 
						|
	public static $item_error_label = 'report';
 | 
						|
 | 
						|
	/**
 | 
						|
	 * The one true Report registry instance.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 * @var   Report_Registry
 | 
						|
	 */
 | 
						|
	private static $instance;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieves the one true Report registry instance.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @return Report_Registry Report registry instance.
 | 
						|
	 */
 | 
						|
	public static function instance() {
 | 
						|
		if ( is_null( self::$instance ) ) {
 | 
						|
			self::$instance = new Report_Registry();
 | 
						|
		}
 | 
						|
 | 
						|
		return self::$instance;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Handles magic method calls for report manipulation.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @throws \EDD_Exception in get_report() if the item does not exist.
 | 
						|
	 *
 | 
						|
	 * @param string $name      Method name.
 | 
						|
	 * @param array  $arguments Method arguments (if any)
 | 
						|
	 * @return mixed Results of the method call (if any).
 | 
						|
	 */
 | 
						|
	public function __call( $name, $arguments ) {
 | 
						|
		$report_id_or_sort = isset( $arguments[0] )
 | 
						|
			? $arguments[0]
 | 
						|
			: '';
 | 
						|
 | 
						|
		switch ( $name ) {
 | 
						|
			case 'get_report':
 | 
						|
				return parent::get_item( $report_id_or_sort );
 | 
						|
 | 
						|
			case 'remove_report':
 | 
						|
				return parent::remove_item( $report_id_or_sort );
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Adds a new report to the master registry.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @throws \EDD_Exception if the 'label' or 'endpoints' attributes are empty.
 | 
						|
	 * @throws \EDD_Exception if one or more endpoints are not of a valid specification.
 | 
						|
	 *
 | 
						|
	 * @param string $report_id   Report ID.
 | 
						|
	 * @param array  $attributes {
 | 
						|
	 *     Reports attributes. All arguments are required unless otherwise noted.
 | 
						|
	 *
 | 
						|
	 *     @type string $label     Report label.
 | 
						|
	 *     @type int    $priority  Optional. Priority by which to register the report. Default 10.
 | 
						|
	 *     @type array  $filters   Filters available to the report.
 | 
						|
	 *     @type array  $endpoints Optional. Endpoints to associate with the report.
 | 
						|
	 * }
 | 
						|
	 * @return bool True if the report was successfully registered, otherwise false.
 | 
						|
	 */
 | 
						|
	public function add_report( $report_id, $attributes ) {
 | 
						|
		$error = false;
 | 
						|
 | 
						|
		$defaults = array(
 | 
						|
			'label'      => '',
 | 
						|
			'priority'   => 10,
 | 
						|
			'group'      => 'core',
 | 
						|
			'capability' => 'view_shop_reports',
 | 
						|
			'filters'    => array(
 | 
						|
				'dates',
 | 
						|
				'taxes',
 | 
						|
			)
 | 
						|
		);
 | 
						|
 | 
						|
		$attributes['id'] = $report_id;
 | 
						|
		$attributes = array_merge( $defaults, $attributes );
 | 
						|
 | 
						|
		try {
 | 
						|
			// Filters can be empty.
 | 
						|
			$this->validate_attributes( $attributes, $report_id, array( 'filters' ) );
 | 
						|
		} catch ( \EDD_Exception $exception ) {
 | 
						|
			$error = true;
 | 
						|
 | 
						|
			throw $exception;
 | 
						|
		}
 | 
						|
 | 
						|
		if ( isset( $attributes['endpoints'] ) && is_array( $attributes['endpoints'] ) ) {
 | 
						|
			foreach ( $attributes['endpoints'] as $view_group => $endpoints ) {
 | 
						|
				foreach ( $endpoints as $index => $endpoint ) {
 | 
						|
					if ( ! is_string( $endpoint ) && ! ( $endpoint instanceof \EDD\Reports\Data\Endpoint ) ) {
 | 
						|
						unset( $attributes['endpoints'][ $view_group ][ $index ] );
 | 
						|
 | 
						|
						throw new Utils\Exception( sprintf( 'The \'%1$s\' report contains one or more invalidly defined endpoints.', $report_id ) );
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		if ( isset( $attributes['filters'] ) && is_array( $attributes['filters'] ) ) {
 | 
						|
			foreach ( $attributes['filters'] as $index => $filter ) {
 | 
						|
				if ( ! Reports\validate_filter( $filter ) ) {
 | 
						|
					$message = sprintf( 'The \'%1$s\' report contains one or more invalid filters.', $report_id );
 | 
						|
 | 
						|
					unset( $attributes['filters'][ $index ] );
 | 
						|
 | 
						|
					throw new Utils\Exception( $message );
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		if ( true === $error ) {
 | 
						|
			return false;
 | 
						|
 | 
						|
		} else {
 | 
						|
			return parent::add_item( $report_id, $attributes );
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieves registered reports.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @param string $sort  Optional. How to sort the list of registered reports before retrieval.
 | 
						|
	 *                      Accepts 'priority' or 'ID' (alphabetized by item ID), or empty (none).
 | 
						|
	 *                      Default empty.
 | 
						|
	 * @param string $group Optional. The reports group to retrieve reports for. Default 'core'.
 | 
						|
	 * @return
 | 
						|
	 */
 | 
						|
	public function get_reports( $sort = '', $group = 'core' ) {
 | 
						|
		$reports = $this->get_items_sorted( $sort );
 | 
						|
 | 
						|
		foreach ( $reports as $report_id => $atts ) {
 | 
						|
			if ( $group !== $atts['group'] ) {
 | 
						|
				unset( $reports[ $report_id ] );
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return $reports;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Registers a new data endpoint to the master endpoints registry.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @throws \EDD_Exception if the `$label` or `$views` attributes are empty.
 | 
						|
	 * @throws \EDD_Exception if any of the required `$views` sub-attributes are empty.
 | 
						|
	 *
 | 
						|
	 * @see \EDD\Reports\Data\Endpoint_Registry::register_endpoint()
 | 
						|
	 *
 | 
						|
	 * @param string $endpoint_id Reports data endpoint ID.
 | 
						|
	 * @param array  $attributes  Attributes of the endpoint. See Endpoint_Registry::register_endpoint()
 | 
						|
	 *                            for more information on expected arguments.
 | 
						|
	 * @return bool True if the endpoint was successfully registered, otherwise false.
 | 
						|
	 */
 | 
						|
	public function register_endpoint( $endpoint_id, $attributes ) {
 | 
						|
		/** @var \EDD\Reports\Data\Endpoint_Registry|\WP_Error $registry */
 | 
						|
		$registry = EDD()->utils->get_registry( 'reports:endpoints' );
 | 
						|
 | 
						|
		if ( is_wp_error( $registry ) ) {
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		return $registry->register_endpoint( $endpoint_id, $attributes );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Unregisters a data endpoint from the master endpoints registry.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @see \EDD\Reports\Data\Endpoint_Registry::unregister_endpoint()
 | 
						|
	 *
 | 
						|
	 * @param string $endpoint_id Endpoint ID.
 | 
						|
	 */
 | 
						|
	public function unregister_endpoint( $endpoint_id ) {
 | 
						|
		/** @var \EDD\Reports\Data\Endpoint_Registry|\WP_Error $registry */
 | 
						|
		$registry = EDD()->utils->get_registry( 'reports:endpoints' );
 | 
						|
 | 
						|
		if ( ! is_wp_error( $registry ) ) {
 | 
						|
			$registry->unregister_endpoint( $endpoint_id );
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Registers an endpoint view to the master endpoint views registry.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @throws \EDD_Exception if all expected attributes are not set.
 | 
						|
	 *
 | 
						|
	 * @see \EDD\Reports\Data\Endpoint_View_Registry::register_endpoint_view()
 | 
						|
	 *
 | 
						|
	 * @param string $view_id    View ID. Currently only core endpoint views can be added.
 | 
						|
	 * @param array  $attributes Attributes of the endpoint view. See Endpoint_View_Registry::register_endpoint_view()
 | 
						|
	 *                           for more information on expected/allowed arguments.
 | 
						|
	 * @return bool True if the endpoint view was successfully registered, otherwise false.
 | 
						|
	 */
 | 
						|
	public function register_endpoint_view( $view_id, $attributes ) {
 | 
						|
		/** @var \EDD\Reports\Data\Endpoint_View_Registry|\WP_Error $registry */
 | 
						|
		$registry = EDD()->utils->get_registry( 'reports:endpoints:views' );
 | 
						|
 | 
						|
		if ( is_wp_error( $registry ) ) {
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		return $registry->register_endpoint_view( $view_id, $attributes );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Builds and retrieves a Report object.
 | 
						|
	 *
 | 
						|
	 * @since 3.0
 | 
						|
	 *
 | 
						|
	 * @param string|Report $report          Report ID or object.
 | 
						|
	 * @param bool          $build_endpoints Optional. Whether to build the endpoints (includes
 | 
						|
	 *                                       registering any endpoint dependencies, such as
 | 
						|
	 *                                       registering meta boxes). Default true.
 | 
						|
	 * @return Report|\WP_Error Report object on success, otherwise a WP_Error object.
 | 
						|
	 */
 | 
						|
	public function build_report( $report, $build_endpoints = true ) {
 | 
						|
 | 
						|
		// If a report object was passed, just return it.
 | 
						|
		if ( $report instanceof Report ) {
 | 
						|
			return $report;
 | 
						|
		}
 | 
						|
 | 
						|
		try {
 | 
						|
			$_report = $this->get_report( $report );
 | 
						|
 | 
						|
		} catch( \EDD_Exception $exception ) {
 | 
						|
 | 
						|
			edd_debug_log_exception( $exception );
 | 
						|
 | 
						|
			return new \WP_Error( 'invalid_report', $exception->getMessage(), $report );
 | 
						|
		}
 | 
						|
 | 
						|
		if ( ! empty( $_report ) ) {
 | 
						|
			$_report = new Report( $_report );
 | 
						|
 | 
						|
			if ( true === $build_endpoints ) {
 | 
						|
				$_report->build_endpoints();
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return $_report;
 | 
						|
	}
 | 
						|
}
 |