245 lines
6.1 KiB
PHP
245 lines
6.1 KiB
PHP
<?php
|
|
/**
|
|
* Reports API - Endpoint View Registry
|
|
*
|
|
* @package EDD
|
|
* @subpackage Reports
|
|
* @copyright Copyright (c) 2019, 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 endpoint views.
|
|
*
|
|
* @since 3.0
|
|
*
|
|
* @see \EDD\Reports\Registry
|
|
* @see \EDD\Utils\Static_Registry
|
|
*
|
|
* @method array get_endpoint_view( string $view_id )
|
|
*/
|
|
final class Endpoint_View_Registry extends Reports\Registry implements Utils\Static_Registry {
|
|
|
|
/**
|
|
* Item error label.
|
|
*
|
|
* @since 3.0
|
|
* @var string
|
|
*/
|
|
public static $item_error_label = 'endpoint view';
|
|
|
|
/**
|
|
* The one true registry instance.
|
|
*
|
|
* @since 3.0
|
|
* @var Endpoint_View_Registry
|
|
*/
|
|
private static $instance;
|
|
|
|
/**
|
|
* Retrieves the one true Endpoint View registry instance.
|
|
*
|
|
* @since 3.0
|
|
*
|
|
* @return Endpoint_View_Registry Registry instance.
|
|
*/
|
|
public static function instance() {
|
|
if ( is_null( self::$instance ) ) {
|
|
self::$instance = new Endpoint_View_Registry();
|
|
}
|
|
|
|
return self::$instance;
|
|
}
|
|
|
|
/**
|
|
* Handles magic method calls for endpoint view manipulation.
|
|
*
|
|
* @since 3.0
|
|
*
|
|
* @throws \EDD_Exception in get_item() 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 ) {
|
|
$view_id_or_sort = isset( $arguments[0] )
|
|
? $arguments[0]
|
|
: '';
|
|
|
|
switch ( $name ) {
|
|
case 'get_endpoint_view':
|
|
return parent::get_item( $view_id_or_sort );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Registers a new endpoint view to the master registry.
|
|
*
|
|
* @since 3.0
|
|
*
|
|
* @throws \EDD_Exception if the `$view_id` doesn't match a core view.
|
|
* @throws \EDD_Exception if attributes other than 'group_callback', 'handler', or 'display_callback'
|
|
* are defined.
|
|
* @throws \EDD_Exception if one or more attributes are not of a valid specification.
|
|
*
|
|
* @param string $view_id Endpoint view ID.
|
|
* @param array $attributes {
|
|
* Endpoint view attributes. All arguments are required.
|
|
*
|
|
* @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 register_endpoint_view( $view_id, $attributes ) {
|
|
$error = false;
|
|
|
|
$view_atts = $this->get_core_view( $view_id );
|
|
|
|
if ( empty( $view_atts ) ) {
|
|
throw new Utils\Exception( sprintf( 'The \'%1$s\' endpoint view is invalid.', $view_id ) );
|
|
}
|
|
|
|
if ( ! empty( $attributes['group_callback'] ) ) {
|
|
$view_atts['group_callback'] = $attributes['group_callback'];
|
|
}
|
|
|
|
if ( ! empty( $attributes['handler'] ) ) {
|
|
$view_atts['handler'] = $attributes['handler'];
|
|
}
|
|
|
|
if ( ! empty( $attributes['fields']['display_callback'] ) ) {
|
|
$view_atts['fields']['display_callback'] = $attributes['fields']['display_callback'];
|
|
}
|
|
|
|
try {
|
|
$this->validate_attributes( $view_atts, $view_id );
|
|
} catch ( \EDD_Exception $exception ) {
|
|
$error = true;
|
|
|
|
throw $exception;
|
|
}
|
|
|
|
if ( true === $error ) {
|
|
return false;
|
|
|
|
} else {
|
|
return parent::add_item( $view_id, $view_atts );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Retrieves registered endpoint views.
|
|
*
|
|
* @since 3.0
|
|
*
|
|
* @return array Endpoint view records.
|
|
*/
|
|
public function get_endpoint_views() {
|
|
return $this->get_items_sorted( 'ID' );
|
|
}
|
|
|
|
/**
|
|
* Prevents removing items from the registry.
|
|
*
|
|
* @since 3.0
|
|
*
|
|
* @param string $item_id Item ID.
|
|
*/
|
|
public function remove_item( $item_id ) {
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* Prevents removing items from the registry.
|
|
*
|
|
* @since 3.0
|
|
*
|
|
* @param mixed $index Item index to check.
|
|
*/
|
|
public function offsetUnset( $index ) {
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* Retrieves the core-defined views and their (mostly) immutable defaults.
|
|
*
|
|
* @since 3.0
|
|
*
|
|
* @param string $view_id View ID.
|
|
* @return array List of attributes for the given view ID if it exists, otherwise an empty array.
|
|
*/
|
|
public function get_core_view( $view_id ) {
|
|
$views = $this->get_core_views();
|
|
|
|
$attributes = array();
|
|
|
|
if ( array_key_exists( $view_id, $views ) ) {
|
|
$attributes = $views[ $view_id ];
|
|
}
|
|
|
|
return $attributes;
|
|
}
|
|
|
|
/**
|
|
* Retrieves the core-defined views and their (mostly) immutable defaults.
|
|
*
|
|
* @since 3.0
|
|
*
|
|
* @return array List of supported endpoint types and their attributes.
|
|
*/
|
|
public function get_core_views() {
|
|
return array(
|
|
'tile' => array(
|
|
'group' => 'tiles',
|
|
'group_callback' => 'EDD\Reports\default_display_tiles_group',
|
|
'handler' => 'EDD\Reports\Data\Tile_Endpoint',
|
|
'fields' => array(
|
|
'data_callback' => '::get_data',
|
|
'display_callback' => 'EDD\Reports\default_display_tile',
|
|
'display_args' => array(
|
|
'type' => '',
|
|
'context' => 'primary',
|
|
'comparison_label' => __( 'All time', 'easy-digital-downloads' ),
|
|
),
|
|
),
|
|
),
|
|
'chart' => array(
|
|
'group' => 'charts',
|
|
'group_callback' => 'EDD\Reports\default_display_charts_group',
|
|
'handler' => 'EDD\Reports\Data\Chart_Endpoint',
|
|
'fields' => array(
|
|
'type' => 'line',
|
|
'options' => array(),
|
|
'data_callback' => '::get_data',
|
|
'display_callback' => '::display',
|
|
'display_args' => array(
|
|
'colors' => 'core',
|
|
),
|
|
),
|
|
),
|
|
'table' => array(
|
|
'group' => 'tables',
|
|
'group_callback' => 'EDD\Reports\default_display_tables_group',
|
|
'handler' => 'EDD\Reports\Data\Table_Endpoint',
|
|
'fields' => array(
|
|
'data_callback' => '::prepare_items',
|
|
'display_callback' => '::display',
|
|
'display_args' => array(
|
|
'class_name' => '',
|
|
'class_file' => '',
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|