woothemes/woocommerce

View on GitHub
includes/export/abstract-wc-csv-batch-exporter.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
/**
 * Handles Batch CSV export.
 *
 * Based on https://pippinsplugins.com/batch-processing-for-big-data/
 *
 * @package  WooCommerce\Export
 * @version  3.1.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Include dependencies.
 */
if ( ! class_exists( 'WC_CSV_Exporter', false ) ) {
    require_once WC_ABSPATH . 'includes/export/abstract-wc-csv-exporter.php';
}

/**
 * WC_CSV_Exporter Class.
 */
abstract class WC_CSV_Batch_Exporter extends WC_CSV_Exporter {

    /**
     * Page being exported
     *
     * @var integer
     */
    protected $page = 1;

    /**
     * Constructor.
     */
    public function __construct() {
        $this->column_names = $this->get_default_column_names();
    }

    /**
     * Get file path to export to.
     *
     * @return string
     */
    protected function get_file_path() {
        $upload_dir = wp_upload_dir();
        return trailingslashit( $upload_dir['basedir'] ) . $this->get_filename();
    }

    /**
     * Get the file contents.
     *
     * @since 3.1.0
     * @return string
     */
    public function get_file() {
        $file = '';
        if ( @file_exists( $this->get_file_path() ) ) { // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged
            $file = @file_get_contents( $this->get_file_path() ); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents, WordPress.WP.AlternativeFunctions.file_system_read_file_get_contents
        } else {
            @file_put_contents( $this->get_file_path(), '' ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_file_put_contents, Generic.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.file_system_read_file_put_contents
            @chmod( $this->get_file_path(), 0664 ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.chmod_chmod, WordPress.WP.AlternativeFunctions.file_system_read_file_put_contents, Generic.PHP.NoSilencedErrors.Discouraged
        }
        return $file;
    }

    /**
     * Serve the file and remove once sent to the client.
     *
     * @since 3.1.0
     */
    public function export() {
        $this->send_headers();
        $this->send_content( $this->get_file() );
        @unlink( $this->get_file_path() ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_unlink, Generic.PHP.NoSilencedErrors.Discouraged
        die();
    }

    /**
     * Generate the CSV file.
     *
     * @since 3.1.0
     */
    public function generate_file() {
        if ( 1 === $this->get_page() ) {
            @unlink( $this->get_file_path() ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_unlink, Generic.PHP.NoSilencedErrors.Discouraged,
        }
        $this->prepare_data_to_export();
        $this->write_csv_data( $this->get_csv_data() );
    }

    /**
     * Write data to the file.
     *
     * @since 3.1.0
     * @param string $data Data.
     */
    protected function write_csv_data( $data ) {
        $file = $this->get_file();

        // Add columns when finished.
        if ( 100 === $this->get_percent_complete() ) {
            $file = chr( 239 ) . chr( 187 ) . chr( 191 ) . $this->export_column_headers() . $file;
        }

        $file .= $data;
        @file_put_contents( $this->get_file_path(), $file ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_file_put_contents, Generic.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.file_system_read_file_put_contents
    }

    /**
     * Get page.
     *
     * @since 3.1.0
     * @return int
     */
    public function get_page() {
        return $this->page;
    }

    /**
     * Set page.
     *
     * @since 3.1.0
     * @param int $page Page Nr.
     */
    public function set_page( $page ) {
        $this->page = absint( $page );
    }

    /**
     * Get count of records exported.
     *
     * @since 3.1.0
     * @return int
     */
    public function get_total_exported() {
        return ( ( $this->get_page() - 1 ) * $this->get_limit() ) + $this->exported_row_count;
    }

    /**
     * Get total % complete.
     *
     * @since 3.1.0
     * @return int
     */
    public function get_percent_complete() {
        return $this->total_rows ? floor( ( $this->get_total_exported() / $this->total_rows ) * 100 ) : 100;
    }
}