laipower/wp-content/plugins/easy-digital-downloads/includes/reports/data/class-endpoint-view-registry.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' => '',
),
),
),
);
}
}