203 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * Base export class.
 | 
						|
 *
 | 
						|
 * This is the base class for all export methods. Each data export type (customers, payments, etc) extend this class.
 | 
						|
 *
 | 
						|
 * @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       1.4.4
 | 
						|
 */
 | 
						|
 | 
						|
// Exit if accessed directly
 | 
						|
defined( 'ABSPATH' ) || exit;
 | 
						|
 | 
						|
/**
 | 
						|
 * EDD_Export Class
 | 
						|
 *
 | 
						|
 * @since 1.4.4
 | 
						|
 */
 | 
						|
class EDD_Export {
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Our export type. Used for export-type specific filters/actions
 | 
						|
	 * @var string
 | 
						|
	 * @since 1.4.4
 | 
						|
	 */
 | 
						|
	public $export_type = 'default';
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Can we export?
 | 
						|
	 *
 | 
						|
	 * @since 1.4.4
 | 
						|
	 *
 | 
						|
	 * @return bool True if exporting is allowed, false otherwise.
 | 
						|
	 */
 | 
						|
	public function can_export() {
 | 
						|
		return (bool) apply_filters( 'edd_export_capability', current_user_can( 'export_shop_reports' ) );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Set the export headers.
 | 
						|
	 *
 | 
						|
	 * @since 1.4.4
 | 
						|
	 * @since 3.0 Add BOM to the CSV export.
 | 
						|
	 */
 | 
						|
	public function headers() {
 | 
						|
		edd_set_time_limit();
 | 
						|
 | 
						|
		nocache_headers();
 | 
						|
		header( 'Content-Type: text/csv; charset=utf-8' );
 | 
						|
		header( 'Content-Disposition: attachment; filename="edd-export-' . $this->export_type . '-' . date( 'm-d-Y' ) . '.csv"' );
 | 
						|
		header( 'Expires: 0' );
 | 
						|
 | 
						|
		/**
 | 
						|
		 * We need to append a BOM to the export so that Microsoft Excel knows
 | 
						|
		 * that the file is in Unicode.
 | 
						|
		 *
 | 
						|
		 * @see https://github.com/easydigitaldownloads/easy-digital-downloads/issues/4859
 | 
						|
		 */
 | 
						|
		echo "\xEF\xBB\xBF";
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Set the CSV columns.
 | 
						|
	 *
 | 
						|
	 * @since 1.4.4
 | 
						|
	 *
 | 
						|
	 * @return array $cols CSV columns.
 | 
						|
	 */
 | 
						|
	public function csv_cols() {
 | 
						|
		$cols = array(
 | 
						|
			'id'   => __( 'ID',   'easy-digital-downloads' ),
 | 
						|
			'date' => __( 'Date', 'easy-digital-downloads' ),
 | 
						|
		);
 | 
						|
		return $cols;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Retrieve the CSV columns.
 | 
						|
	 *
 | 
						|
	 * @since 1.4.4
 | 
						|
	 *
 | 
						|
	 * @return array $cols Array of the columns.
 | 
						|
	 */
 | 
						|
	public function get_csv_cols() {
 | 
						|
		$cols = $this->csv_cols();
 | 
						|
		return apply_filters( 'edd_export_csv_cols_' . $this->export_type, $cols );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Output the CSV columns.
 | 
						|
	 *
 | 
						|
	 * @since 1.4.4
 | 
						|
	 */
 | 
						|
	public function csv_cols_out() {
 | 
						|
		$cols = $this->get_csv_cols();
 | 
						|
 | 
						|
		$i = 1;
 | 
						|
 | 
						|
		// Output each column.
 | 
						|
		foreach ( $cols as $col_id => $column ) {
 | 
						|
			echo '"' . addslashes( $column ) . '"';
 | 
						|
 | 
						|
			echo count( $cols ) === $i
 | 
						|
				? ''
 | 
						|
				: ',';
 | 
						|
 | 
						|
			$i++;
 | 
						|
		}
 | 
						|
		echo "\r\n";
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Get the data being exported.
 | 
						|
	 *
 | 
						|
	 * @since 1.4.4
 | 
						|
	 *
 | 
						|
	 * @return array $data Data for export.
 | 
						|
	 */
 | 
						|
	public function get_data() {
 | 
						|
 | 
						|
		// Just a sample data array
 | 
						|
		$data = array(
 | 
						|
			0 => array(
 | 
						|
				'id'   => '',
 | 
						|
				'data' => date( 'F j, Y' ),
 | 
						|
			),
 | 
						|
			1 => array(
 | 
						|
				'id'   => '',
 | 
						|
				'data' => date( 'F j, Y' ),
 | 
						|
			),
 | 
						|
		);
 | 
						|
 | 
						|
		$data = apply_filters( 'edd_export_get_data', $data );
 | 
						|
		$data = apply_filters( 'edd_export_get_data_' . $this->export_type, $data );
 | 
						|
 | 
						|
		return $data;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Output the CSV rows.
 | 
						|
	 *
 | 
						|
	 * @since 1.4.4
 | 
						|
	 */
 | 
						|
	public function csv_rows_out() {
 | 
						|
		$data = $this->get_data();
 | 
						|
 | 
						|
		$cols = $this->get_csv_cols();
 | 
						|
 | 
						|
		// Output each row.
 | 
						|
		foreach ( $data as $row ) {
 | 
						|
			$i = 1;
 | 
						|
 | 
						|
			foreach ( $row as $col_id => $column ) {
 | 
						|
 | 
						|
				// Make sure the column is valid.
 | 
						|
				if ( array_key_exists( $col_id, $cols ) ) {
 | 
						|
					echo '"' . addslashes( $column ) . '"';
 | 
						|
 | 
						|
					echo count( $cols ) === $i
 | 
						|
						? ''
 | 
						|
						: ',';
 | 
						|
 | 
						|
					$i++;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			echo "\r\n";
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Perform the export.
 | 
						|
	 *
 | 
						|
	 * @since 1.4.4
 | 
						|
	 *
 | 
						|
	 *
 | 
						|
	 * @uses EDD_Export::can_export()
 | 
						|
	 * @uses EDD_Export::headers()
 | 
						|
	 * @uses EDD_Export::csv_cols_out()
 | 
						|
	 * @uses EDD_Export::csv_rows_out()
 | 
						|
	 */
 | 
						|
	public function export() {
 | 
						|
 | 
						|
		// Bail if user if unauthorized.
 | 
						|
		if ( ! $this->can_export() ) {
 | 
						|
			wp_die( __( 'You do not have permission to export data.', 'easy-digital-downloads' ), __( 'Error', 'easy-digital-downloads' ), array( 'response' => 403 ) );
 | 
						|
		}
 | 
						|
 | 
						|
		// Set headers
 | 
						|
		$this->headers();
 | 
						|
 | 
						|
		// Output CSV columns (headers)
 | 
						|
		$this->csv_cols_out();
 | 
						|
 | 
						|
		// Output CSV rows
 | 
						|
		$this->csv_rows_out();
 | 
						|
 | 
						|
		edd_die();
 | 
						|
	}
 | 
						|
}
 |