200 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * Graphs
 | 
						|
 *
 | 
						|
 * This class handles building pretty report graphs
 | 
						|
 *
 | 
						|
 * @package     EDD
 | 
						|
 * @subpackage  Admin/Reports
 | 
						|
 * @copyright   Copyright (c) 2018, Easy Digital Downloads, LLC
 | 
						|
 * @license     http://opensource.org/licenses/gpl-2.0.php GNU Public License
 | 
						|
 * @since 2.4
 | 
						|
 */
 | 
						|
 | 
						|
// Exit if accessed directly
 | 
						|
defined( 'ABSPATH' ) || exit;
 | 
						|
 | 
						|
/**
 | 
						|
 * EDD_Graph Class
 | 
						|
 *
 | 
						|
 * @since 2.4
 | 
						|
 */
 | 
						|
class EDD_Pie_Graph extends EDD_Graph {
 | 
						|
 | 
						|
	/*
 | 
						|
 | 
						|
	Simple example:
 | 
						|
 | 
						|
	data format for each point: array( location on x, location on y )
 | 
						|
 | 
						|
	$data = array(
 | 
						|
		array( 'Label'   => 'value' ),
 | 
						|
		array( 'Label 2' => 'value 2' ),
 | 
						|
	);
 | 
						|
 | 
						|
	$graph = new EDD_Pie_Graph( $data );
 | 
						|
	$graph->display();
 | 
						|
 | 
						|
	*/
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Data to graph
 | 
						|
	 *
 | 
						|
	 * @var array
 | 
						|
	 * @since 2.4
 | 
						|
	 */
 | 
						|
	private $data;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Unique ID for the graph
 | 
						|
	 *
 | 
						|
	 * @var string
 | 
						|
	 * @since 2.4
 | 
						|
	 */
 | 
						|
	private $id = '';
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Graph options
 | 
						|
	 *
 | 
						|
	 * @var array
 | 
						|
	 * @since 2.4
 | 
						|
	 */
 | 
						|
	private $options = array();
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Get things started
 | 
						|
	 *
 | 
						|
	 * @since 2.4
 | 
						|
	 */
 | 
						|
	public function __construct( $_data, $options = array() ) {
 | 
						|
 | 
						|
		$this->data = $_data;
 | 
						|
 | 
						|
		// Set this so filters recieving $this can quickly know if it's a graph they want to modify
 | 
						|
		$this->type = 'pie';
 | 
						|
 | 
						|
		// Generate unique ID, add 'a' since md5 can leave a numerical first character
 | 
						|
		$this->id = 'a' . md5( rand() );
 | 
						|
 | 
						|
		// Setup default options;
 | 
						|
		$this->options = wp_parse_args( $options,  array(
 | 
						|
			'radius'            => 1,
 | 
						|
			'legend'            => true,
 | 
						|
			'legend_formatter'  => false,
 | 
						|
			'legend_columns'    => 3,
 | 
						|
			'legend_position'   => 's',
 | 
						|
			'show_labels'       => false,
 | 
						|
			'label_threshold'   => 0.01,
 | 
						|
			'label_formatter'   => 'eddLabelFormatter',
 | 
						|
			'label_bg_opacity'  => 0.75,
 | 
						|
			'label_radius'      => 1,
 | 
						|
			'height'            => '300',
 | 
						|
			'hoverable'         => true,
 | 
						|
			'clickable'         => false,
 | 
						|
			'threshold'         => false,
 | 
						|
		) );
 | 
						|
 | 
						|
		add_action( 'edd_graph_load_scripts', array( $this, 'load_additional_scripts' ) );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Load the graphing library script
 | 
						|
	 *
 | 
						|
	 * @since 2.4
 | 
						|
	 */
 | 
						|
	public function load_additional_scripts() {
 | 
						|
		wp_enqueue_script( 'edd-jquery-flot-pie', EDD_PLUGIN_URL . 'assets/js/vendor/jquery.flot.pie.min.js' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Build the graph and return it as a string
 | 
						|
	 *
 | 
						|
	 * @var array
 | 
						|
	 * @since 2.4
 | 
						|
	 * @return string
 | 
						|
	 */
 | 
						|
	public function build_graph() {
 | 
						|
 | 
						|
		if ( count( $this->data ) ) {
 | 
						|
			$this->load_scripts();
 | 
						|
 | 
						|
			ob_start();
 | 
						|
			?>
 | 
						|
			<script type="text/javascript">
 | 
						|
				var <?php echo $this->id; ?>_data = [
 | 
						|
				<?php foreach ( $this->data as $label => $value ) : ?>
 | 
						|
					<?php echo '{ label: "' . esc_attr( $label ) . '", data: "' . $value . '" },' . "\n"; ?>
 | 
						|
				<?php endforeach; ?>
 | 
						|
				];
 | 
						|
 | 
						|
				var <?php echo $this->id; ?>_options = {
 | 
						|
					series: {
 | 
						|
						pie: {
 | 
						|
							show: true,
 | 
						|
							radius: <?php echo $this->options['radius']; ?>,
 | 
						|
							label: [],
 | 
						|
						},
 | 
						|
						edd_vars: {
 | 
						|
							id: '<?php echo $this->id; ?>',
 | 
						|
						}
 | 
						|
					},
 | 
						|
					legend: {
 | 
						|
						show: <?php echo $this->options['legend']; ?>,
 | 
						|
					},
 | 
						|
					grid: {},
 | 
						|
				};
 | 
						|
 | 
						|
				<?php if ( true === $this->options['show_labels'] ) : ?>
 | 
						|
					<?php echo $this->id; ?>_options.series.pie.label.show = true;
 | 
						|
					<?php echo $this->id; ?>_options.series.pie.label.formatter = <?php echo $this->options['label_formatter']; ?>;
 | 
						|
					<?php echo $this->id; ?>_options.series.pie.label.threshold = <?php echo $this->options['label_threshold']; ?>;
 | 
						|
					<?php echo $this->id; ?>_options.series.pie.label.radius = <?php echo $this->options['label_radius']; ?>;
 | 
						|
					<?php echo $this->id; ?>_options.series.pie.label.background = { opacity: <?php echo $this->options['label_bg_opacity']; ?> };
 | 
						|
				<?php endif; ?>
 | 
						|
 | 
						|
				<?php if ( true === $this->options['legend'] && ! empty( $this->options['legend_formatter'] ) ) : ?>
 | 
						|
					<?php echo $this->id; ?>_options.legend.labelFormatter = <?php echo $this->options['legend_formatter']; ?>;
 | 
						|
					<?php echo $this->id; ?>_options.legend.noColumns = <?php echo $this->options['legend_columns']; ?>;
 | 
						|
					<?php echo $this->id; ?>_options.legend.position = "<?php echo $this->options['legend_position']; ?>";
 | 
						|
				<?php endif; ?>
 | 
						|
 | 
						|
				<?php if ( true === $this->options['hoverable'] ) : ?>
 | 
						|
					<?php echo $this->id; ?>_options.grid.hoverable = true;
 | 
						|
				<?php endif; ?>
 | 
						|
 | 
						|
				<?php if ( true === $this->options['clickable'] ) : ?>
 | 
						|
					<?php echo $this->id; ?>_options.grid.clickable = true;
 | 
						|
				<?php endif; ?>
 | 
						|
 | 
						|
				jQuery( document ).ready( function($) {
 | 
						|
					var <?php echo $this->id; ?>Chart = $('#edd-pie-graph-<?php echo $this->id; ?>');
 | 
						|
					$.plot( <?php echo $this->id; ?>Chart, <?php echo $this->id; ?>_data, <?php echo $this->id; ?>_options );
 | 
						|
					<?php if ( ! wp_is_mobile() ) : ?>
 | 
						|
					$(<?php echo $this->id; ?>Chart).on('plothover', function (event, pos, item) {
 | 
						|
						$('.edd-legend-item-wrapper').css('background-color', 'inherit');
 | 
						|
						if ( item ) {
 | 
						|
							var label = item.series.label;
 | 
						|
							var id    = item.series.edd_vars.id;
 | 
						|
 | 
						|
							var slug = label.toLowerCase().replace(/\s/g, '-');
 | 
						|
							var legendTarget = '#' + id + slug;
 | 
						|
 | 
						|
							$('.edd-legend-item-wrapper' + legendTarget).css('background-color', '#f0f0f0');
 | 
						|
						}
 | 
						|
					});
 | 
						|
					<?php endif; ?>
 | 
						|
				});
 | 
						|
 | 
						|
			</script>
 | 
						|
			<div class="edd-pie-graph-wrap">
 | 
						|
				<div id="edd-pie-graph-<?php echo $this->id; ?>" class="edd-pie-graph" style="height: <?php echo $this->options['height']; ?>px;"></div>
 | 
						|
				<div id="edd-pie-legend-<?php echo $this->id; ?>" class="edd-pie-legend"></div>
 | 
						|
			</div>
 | 
						|
			<?php
 | 
						|
		}
 | 
						|
		return apply_filters( 'edd_pie_graph_output', ob_get_clean(), $this->id, $this->data, $this->options );
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
}
 |