oont-contents/plugins/woo-order-export-lite/classes/formats/abstract-class-woe-formatter-sv.php
2025-02-10 13:57:45 +01:00

171 lines
5.6 KiB
PHP

<?php
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
if ( class_exists( 'WOE_Formatter_sv' ) ) {
return;
}
include_once 'abstract-class-woe-formatter-plain-format.php';
abstract class WOE_Formatter_sv extends WOE_Formatter_Plain_Format {
var $enclosure;
var $linebreak;
var $delimiter;
var $stream_filter;
var $escape = "\\";
public function __construct(
$mode,
$filename,
$settings,
$format,
$labels,
$field_formats,
$date_format,
$offset
) {
parent::__construct( $mode, $filename, $settings, $format, $labels, $field_formats, $date_format, $offset );
$this->enclosure = $this->convert_literals( isset( $this->settings['enclosure'] ) ? $this->settings['enclosure'] : '' );
$this->linebreak = $this->convert_literals( isset( $this->settings['linebreak'] ) ? $this->settings['linebreak'] : '' );
$this->delimiter = $this->convert_literals( isset( $this->settings['delimiter'] ) ? $this->settings['delimiter'] : '' );
// register the filter
WOE_Formatter_sv_crlf_filter::set_linebreak( $this->linebreak );
stream_filter_register( "WOE_Formatter_{$this->format}_crlf", 'WOE_Formatter_sv_crlf_filter' );
// attach to stream
$this->stream_filter = stream_filter_append( $this->handle, "WOE_Formatter_{$this->format}_crlf" );
}
public function start( $data = '' ) {
$data = $this->make_header( $data );
$data = apply_filters( "woe_{$this->format}_header_filter", $data );
$this->prepare_array( $data );
parent::start( $data );
if ( ! empty( $this->settings['add_utf8_bom'] ) ) {
fwrite( $this->handle, chr( 239 ) . chr( 187 ) . chr( 191 ) );
}
$this->rows = array();
if ( ! empty( $this->settings['display_column_names'] ) AND $data ) {
if ( $this->mode == 'preview' ) {
$this->rows[] = $data;
} else {
do_action( "woe_before_{$this->format}_print_header", $this->handle, $data, $this );
if ( ! apply_filters( "woe_{$this->format}_custom_output_func", false, $this->handle, $data,
$this->delimiter, $this->linebreak, $this->enclosure, true ) ) {
if ( $this->enclosure !== '' ) {
fputcsv( $this->handle, $data, $this->delimiter, $this->enclosure, $this->escape );
} else {
fwrite( $this->handle, implode( $this->delimiter, $data ) . $this->linebreak );
}
}
do_action( "woe_{$this->format}_print_header", $this->handle, $data, $this );
}
}
}
public function output( $rec ) {
$rows = parent::output( $rec );
foreach ( $rows as $row ) {
$this->prepare_array( $row );
if ( $this->has_output_filter ) {
$row = apply_filters( "woe_{$this->format}_output_filter", $row, $this );
if ( ! $row ) {
continue;
}
}
if ( $this->mode == 'preview' ) {
$this->rows[] = $row;
} else {
// insert order id of inserted rows, only required for PDF
if ( $this instanceof WOE_Formatter_PDF || $this instanceof WOE_Formatter_Xls ) {
$row[] = ! $this->summary_processing ? intval( WC_Order_Export_Engine::$order_id ) : 0;
}
if ( ! apply_filters( "woe_{$this->format}_custom_output_func", false, $this->handle, $row,
$this->delimiter, $this->linebreak, $this->enclosure, false ) ) {
if ( $this->enclosure !== '' ) {
fputcsv( $this->handle, $row, $this->delimiter, $this->enclosure, $this->escape );
} else {
fwrite( $this->handle, implode( $this->delimiter, $row ) . $this->linebreak );
}
}
}
}
return $rows;
}
public function finish() {
$this->try_apply_summary_report_fields();
if ( $this->mode == 'preview' ) {
$this->rows = apply_filters( "woe_{$this->format}_preview_rows", $this->rows );
fwrite( $this->handle, '<table>' );
if ( $this->settings['display_column_names'] && count( $this->rows ) < 2 || count( $this->rows ) < 1 ) {
$this->rows[] = array( '<td colspan=10><b>' . __( 'No results', 'woo-order-export-lite' ) . '</b></td>' );
}
foreach ( $this->rows as $num => $rec ) {
if ( $num == 0 AND ! empty( $this->settings['display_column_names'] ) ) {
fwrite( $this->handle,
'<tr style="font-weight:bold"><td>' . join( '</td><td>', $rec ) . "</td><tr>\n" );
} else {
fwrite( $this->handle, '<tr><td>' . join( '</td><td>', $rec ) . "</td><tr>\n" );
}
}
fwrite( $this->handle, '</table>' );
} else {
do_action( "woe_{$this->format}_print_footer", $this->handle, $this );
}
stream_filter_remove( $this->stream_filter );
parent::finish();
}
protected function prepare_array( &$arr ) {
if ( apply_filters( "woe_stop_csv_injection", true ) ) {
$arr = array_map( array( $this, 'stop_csv_injection' ), $arr );
}
if ( $this->mode !== 'preview' AND ! in_array( $this->encoding, array( '', 'utf-8', 'UTF-8' ) ) ) {
$arr = array_map( array( $this, 'encode_value' ), $arr );
}
}
protected function stop_csv_injection( $value ) {
$formula_chars = array( "=", "+", "-", "@" );
if ( in_array( substr( $value, 0, 1 ), $formula_chars ) ) {
$value = " " . $value;
}
return $value;
}
protected function encode_value( $value ) {
return iconv( 'UTF-8', $this->encoding, $value );
}
}
// filter class that applies CRLF line endings
class WOE_Formatter_sv_crlf_filter extends php_user_filter {
protected static $linebreak;
public static function set_linebreak( $linebreak ) {
self::$linebreak = $linebreak;
}
#[\ReturnTypeWillChange]
function filter( $in, $out, &$consumed, $closing ) {
while ( $bucket = stream_bucket_make_writeable( $in ) ) {
// make sure the line endings aren't already CRLF
$bucket->data = preg_replace( "/(?<!\r)\n/", self::$linebreak, $bucket->data );
$consumed += $bucket->datalen;
stream_bucket_append( $out, $bucket );
}
return PSFS_PASS_ON;
}
}