oont-contents/plugins/woo-order-export-lite/classes/formats/class-woe-formatter-xml.php
2025-02-08 15:10:23 +01:00

141 lines
No EOL
4.8 KiB
PHP

<?php
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
class WOE_Formatter_Xml extends WOE_Formatter {
var $linebreak;
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->linebreak = apply_filters( "woe_xml_output_linebreak", "\n" );
}
public function start( $data = '' ) {
parent::start( $data );
fwrite( $this->handle,
apply_filters( "woe_xml_output_header", '<?xml version="1.0" encoding="UTF-8"?>' ) . $this->linebreak );
if ( @$this->settings['prepend_raw_xml'] ) {
fwrite( $this->handle, $this->settings['prepend_raw_xml'] . $this->linebreak );
}
fwrite( $this->handle, apply_filters( "woe_xml_output_before_root_tag", '' ) );
if ( $this->settings['root_tag'] ) {
fwrite( $this->handle, "<" . $this->settings['root_tag'] . ">" . $this->linebreak );
}
fwrite( $this->handle, apply_filters( "woe_xml_output_after_root_tag", '', $this ) );
}
public function output( $rec ) {
$rec = parent::output( $rec );
$recs = apply_filters( 'woe_xml_prepare_records', array($rec) );
foreach($recs as $rec)
$this->output_one_record($rec);
}
public function output_one_record( $rec ) {
$xml = new SimpleXMLElement( "<" . $this->settings['order_tag'] . "></" . $this->settings['order_tag'] . ">" );
$labels = $this->labels['order'];
$rec = apply_filters( 'woe_xml_prepare_record', $rec );
foreach ( $labels->get_labels() as $label_data ) {
$original_key = $label_data['key'];
$label = $label_data['label'];
$key = $label_data['parent_key'] ? $label_data['parent_key'] : $original_key;
$field_value = apply_filters( 'woe_xml_prepare_field_' . $original_key, $rec[ $key ], $rec );
if ( is_array( $field_value ) ) {
if ( $original_key == "products" ) {
$child_tag = $this->settings['product_tag'];
$child_labels = $this->labels['products'];
} elseif ( $original_key == "coupons" ) {
$child_tag = $this->settings['coupon_tag'];
$child_labels = $this->labels['coupons'];
} else {
// array was created by hook!
$child_tag = '';
$child_labels = array();
}
// modify children using filters
$child_tag = apply_filters( 'woe_xml_child_tagname_' . $original_key, $child_tag, $field_value,
$rec );
$child_labels = apply_filters( 'woe_xml_child_labels_' . $original_key, $child_labels, $field_value,
$rec );
if ( !is_array($child_labels) AND $child_labels->is_not_empty() == false ) // can't export!
{
continue;
}
$childs = $label ? $xml->addChild( $label ) : $xml; // add Products , or use root!
foreach ( $field_value as $child_key => $child_element ) {
$tag_name = $child_tag ? $child_tag : $child_key;
// add nested Product if array!
$child = $childs->addChild( $tag_name,
is_array( $child_element ) ? null : $this->prepare_string( $child_element ) );
// products/coupons
if ( is_array( $child_element ) ) {
foreach ( $child_labels->get_labels() as $child_label_data ) {
$child_original_key = $child_label_data['key'];
$child_label = $child_label_data['label'];
$child_key = $child_label_data['parent_key'] ? $child_label_data['parent_key'] : $child_original_key;
if ( isset( $child_element[ $child_key ] ) ) {
$child->addChild( $child_label, $this->prepare_string( $child_element[ $child_key ] ) );
}
}
}
}
} else {
$xml->addChild( $label, $this->prepare_string( $field_value ) );
}
}
//format it!
$dom = dom_import_simplexml( $xml );
$dom->ownerDocument->formatOutput = ( $this->mode == 'preview' || $this->settings['preview_format'] );
$output_flags = ! empty( $this->settings['self_closing_tags'] ) ? 0 : LIBXML_NOEMPTYTAG;
$xml = $dom->ownerDocument->saveXML( $dom->ownerDocument->documentElement,
$output_flags );
if ( $this->has_output_filter ) {
$xml = apply_filters( "woe_xml_output_filter", $xml, $rec, $this );
}
if($xml)
fwrite( $this->handle, $xml . $this->linebreak );
}
public function finish( $data = '' ) {
fwrite( $this->handle, apply_filters( "woe_xml_output_before_closing_root_tag", '', $this ) );
if ( $this->settings['root_tag'] ) {
fwrite( $this->handle, "</" . $this->settings['root_tag'] . ">" . $this->linebreak );
}
if ( @$this->settings['append_raw_xml'] ) {
fwrite( $this->handle, $this->settings['append_raw_xml'] . $this->linebreak );
}
do_action( "woe_xml_print_footer", $this->handle, $this );
parent::finish();
}
private function prepare_string( $value ) {
return apply_filters("woe_xml_encode_chars", true) ? htmlspecialchars( $value ) : $value;
}
}