oont-contents/plugins/woo-order-export-lite/classes/formats/class-woe-formatter-html.php
2025-04-06 08:34:48 +02:00

309 lines
9.7 KiB
PHP

<?php
// phpcs:disable WordPress.WP.AlternativeFunctions.file_system_operations_fwrite
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
include_once 'abstract-class-woe-formatter-plain-format.php';
/**
* Class WOE_Formatter_PDF
*
* Using CSV formatter as basis. Works like CSV (even creates csv file) but after finish,
* fetches data from file and paste them to PDF as table
*/
class WOE_Formatter_Html extends WOE_Formatter_Plain_Format {
protected $css;
protected $table_header_row;
protected $image_format_fields;
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->css = $this->get_prepared_css();
//to support IMAGES
$field_formats = $this->field_formats['order']; // overwrite! probably modified by parent
$this->image_format_fields = isset( $field_formats['image'] ) ? $field_formats['image'] : array();
$this->image_format_fields = apply_filters( "woe_{$format}_image_format_fields", $this->image_format_fields );
}
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 );
$this->table_header_row = $data;
if ( $this->mode != 'preview' ) {
$this->set_table_header_row($this->table_header_row);
if( $this->settings['custom_css'] )
$this->css['style'] = '';
$meta_encoding = apply_filters("woe_html_meta_encoding", '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />');
fwrite( $this->handle, '<html><head>' . $meta_encoding . '<style type="text/css">'.$this->css['style'].$this->settings['custom_css'].'</style></head><body>' );
do_action( "woe_html_print_body_start", $this->handle, $this );
}
if ( ! empty( $this->settings['display_column_names'] ) AND $data ) {
if ( $this->mode == 'preview' ) {
$this->rows[] = $data;
} else {
if ( $this->settings['header_text'] ) {
fwrite( $this->handle, '<div class="header">' . $this->settings['header_text'] . '</div>' );
}
if( apply_filters( "woe_html_header_print_table", true) )
fwrite( $this->handle, '<table>' );
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, true ) ) {
fwrite( $this->handle, '<thead><tr><th>' . join( '</th><th>', $data ) . "</th></tr></thead>\n" );
}
do_action( "woe_{$this->format}_print_header", $this->handle, $data, $this );
}
} else {
if ( $this->mode !== 'preview' ) {
if ( $this->settings['header_text'] ) {
fwrite( $this->handle, '<div class="header">' . $this->settings['header_text'] . '</div>' );
}
if( apply_filters( "woe_html_header_print_table", true) )
fwrite( $this->handle, '<table>' );
}
}
}
public function output( $rec ) {
$rows = parent::output( $rec );
$images_add_link = $this->mode != 'preview' ? wc_string_to_bool( $this->settings['images_add_link'] ) : false;
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;
}
}
//to support IMAGES
foreach ( $row as $column => &$cell ) {
if ( $this->field_format_is( $column, $this->image_format_fields ) ) {
$html = $this->make_img_html_from_path(
$cell,
$this->settings['row_images_width'],
$this->settings['row_images_height'],
$images_add_link
);
$cell = $html ? $html : "";
}
}
if ( $this->mode == 'preview' ) {
$this->rows[] = $row;
} else {
if ( ! apply_filters( "woe_{$this->format}_custom_output_func", false, $this->handle, $row, false ) ) {
fwrite( $this->handle, '<tr><td>' . join( '</td><td>', $row ) . "</td></tr>\n" );
}
}
}
}
public function finish() {
$this->try_apply_summary_report_fields();
if ( $this->mode == 'preview' ) {
if( $this->settings['custom_css'] ) {
foreach( $this->css['inline'] as $k=>$v)
$this->css['inline'][$k] = '';
}
$this->rows = apply_filters( "woe_{$this->format}_preview_rows", $this->rows );
fwrite( $this->handle, '<div style="'.$this->css['inline']['body'].'">' );
if ( $this->settings['header_text'] ) {
fwrite( $this->handle, '<div class="header" style="'.$this->css['inline']['header'].'">' . $this->settings['header_text'] . '</div>' );
}
if( apply_filters( "woe_html_header_print_table", true) )
fwrite( $this->handle, '<table>' );
if ( $this->settings['display_column_names'] && count( $this->rows ) < 2 || count( $this->rows ) < 1 ) {
$this->rows[] = array( '<td colspan=10 style="'.$this->css['inline']['td'].'"><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,
'<thead><tr><th style="'.$this->css['inline']['th'].'">' . join( '</th><th style="'.$this->css['inline']['th'].'">', $rec ) . "</th></tr></thead>\n" );
} else {
fwrite( $this->handle, '<tr><td style="'.$this->css['inline']['td'].'">' . join( '</td><td style="'.$this->css['inline']['td'].'">', $rec ) . "</td></tr>\n" );
}
}
if (! empty( $this->settings['display_column_names'] ) && ! empty( $this->settings['repeat_header_last_line'] ) && $this->table_header_row) {
fwrite( $this->handle, '<tfoot><tr><th style="'.$this->css['inline']['th'].'">' . join( '</th><th style="'.$this->css['inline']['th'].'">', $this->table_header_row ) . "</th></tr></tfoot>\n" );
}
if( apply_filters( "woe_html_header_print_table", true) )
fwrite( $this->handle, '</table>' );
if ( $this->settings['footer_text'] ) {
fwrite( $this->handle, '<div class="footer" style="'.$this->css['inline']['footer'].'">' . $this->settings['footer_text'] . '</div>' );
}
fwrite( $this->handle, '</div>' );
} else {
do_action( "woe_{$this->format}_print_footer", $this->handle, $this );
$this->table_header_row = $this->get_table_header_row();
if (! empty( $this->settings['display_column_names'] ) && ! empty( $this->settings['repeat_header_last_line'] ) && $this->table_header_row) {
if ( ! apply_filters( "woe_{$this->format}_custom_output_func", false, $this->handle, $this->table_header_row, true ) ) {
fwrite( $this->handle, '<tfoot><tr><th>' . join( '</th><th>', $this->table_header_row ) . "</th></tr></tfoot>\n" );
}
}
if( apply_filters( "woe_html_header_print_table", true) )
fwrite( $this->handle, '</table>' );
if ( $this->settings['footer_text'] ) {
fwrite( $this->handle, '<div class="footer">' . $this->settings['footer_text'] . '</div>' );
}
do_action( "woe_html_print_body_end", $this->handle, $this );
fwrite( $this->handle, '</body></html>' );
}
parent::finish();
}
protected function prepare_array( &$arr ) {
}
protected function get_prepared_css() {
$default_css = array();
if ($this->settings['font_size']) {
$default_css['font-size'] = $this->settings['font_size'] . 'px';
}
$default_header_css = array();
if ( $this->settings['header_text_color'] ) {
$default_header_css['color'] = $this->settings['header_text_color'];
}
$default_footer_css = array();
if ( $this->settings['footer_text_color'] ) {
$default_footer_css['color'] = $this->settings['footer_text_color'];
}
$align = "left";
switch($this->settings['cols_align']) {
case 'L':
$align = "left";
break;
case 'R':
$align = "right";
break;
case 'C':
$align = "center";
break;
}
$default_th_css = array('text-align' => $align, 'font-weight' => 'bold');
$default_td_css = array('text-align' => $align);
if ( $this->settings['table_header_text_color'] ) {
$default_th_css['color'] = $this->settings['table_header_text_color'];
}
if ( $this->settings['table_header_background_color'] ) {
$default_th_css['background-color'] = $this->settings['table_header_background_color'];
}
if ( $this->settings['table_row_text_color'] ) {
$default_td_css['color'] = $this->settings['table_row_text_color'];
}
if ( $this->settings['table_row_background_color'] ) {
$default_td_css['background-color'] = $this->settings['table_row_background_color'];
}
$css = array();
$default = array(
'body' => $default_css,
'header' => $default_header_css,
'footer' => $default_footer_css,
'th' => $default_th_css,
'td' => $default_td_css,
);
foreach ($default as $key => $tmp) {
$tmp_css = array();
foreach ($tmp as $p => $s) {
$tmp_css[] = sprintf('%s: %s', $p, $s);
}
$css[$key] = implode('; ', $tmp_css);
}
$style = '
body, .header, .footer, table th, table td {'.$css['body'].'}
table th {'.$css['th'].'}
table td {'.$css['td'].'}
.header {'.$css['header'].'}
.footer {'.$css['footer'].'}
';
return array(
'style' => $style,
'inline'=> $css,
);
}
public function get_table_header_row() {
return get_transient($this->get_transient_key_table_header_row());
}
public function set_table_header_row($row) {
return set_transient($this->get_transient_key_table_header_row(), $row, 5 * MINUTE_IN_SECONDS);
}
public function get_transient_key_table_header_row() {
return 'woocommerce-order-file-'. str_replace('/', '-', $this->filename) .'-html-table-header-row';
}
}