You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
2.0 KiB
PHP

<?php
/**
* CSV
*
* This class defines all code necessary to run during the CSV export.
*
* @since x.x.x
* @package RankMathPro
* @subpackage RankMathPro
* @author Rank Math <support@rankmath.com>
*/
namespace RankMathPro\Admin;
defined( 'ABSPATH' ) || exit;
/**
* Installer class.
*/
class CSV {
/**
* Do export.
*
* @param array $data Data to export.
* @return void
*/
public function export( $data = [] ) {
if ( empty( $data['items'] ) ) {
return;
}
$this->increase_limits();
$this->headers( $data['filename'] );
$this->output( $data );
exit;
}
/**
* Try to increase time limit on server.
*
* @return void
*/
public function increase_limits() {
set_time_limit( 300 );
}
/**
* Send headers.
*
* @param string $name File name.
* @return void
*/
public function headers( $name = '' ) {
$sitename = sanitize_key( get_bloginfo( 'name' ) );
$filename = $sitename . '_' .$name. '-' . date( 'Y-m-d_H-i-s' ) . '.csv'; // phpcs:ignore
header( 'Content-Type: application/csv' );
header( 'Content-Description: File Transfer' );
header( "Content-Disposition: attachment; filename={$filename}" );
header( 'Pragma: no-cache' );
}
/**
* Output
*
* @param array $data Data to export.
* @return void
*/
public function output( $data = [] ) {
$this->output_csv( $data['columns'] );
foreach ( $data['items'] as $line ) {
$this->output_csv( array_values( $line ) );
}
}
/**
* Output fputcsv instead of saving to a file.
*
* @param array $data Data array.
* @return void
*/
public function output_csv( $data ) {
echo implode( ',', $data ) . "\n"; // phpcs:ignore
}
/**
* Escape CSV: quotes and slashes
*
* @param string $string String to escape.
* @return string
*/
public function escape_csv( $string ) {
return '"' . str_replace( [ "'", '"', '\\' ], [ "''", '""', '\\\\' ], $string ) . '"';
}
}