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

276 lines
No EOL
8.7 KiB
PHP

<?php
trait WOE_Order_Export_Plain_Format {
private function multiplicate_fields( &$row, $type, $field_values, $fields ) {
$multiplied_fields = array();
$group_by_item = $this->duplicate_settings[ $type ]['group_by'];
// $multiply_count = $repeat ? $this->duplicate_settings[$type]['max_cols'] : 1;
$multiply_count = $this->duplicate_settings[ $type ]['max_cols'];
if ( $group_by_item == 'product' ) {
$index = 1;
foreach ( $field_values as $item ) {
if ( $multiply_count < $index ) {
break;
}
foreach ( $fields as $original_key ) {
$label_data = $this->labels['order']->$original_key;
$key = $label_data['parent_key'] ? $label_data['parent_key'] : $original_key;
if ( isset( $item[ str_replace( 'plain_' . $type . '_', '', $key ) ] ) ) {
$multiplied_fields[ $original_key . '_' . $index ] = $item[ str_replace( 'plain_' . $type . '_',
'',
$key ) ];
} else {
$multiplied_fields[ $original_key . '_' . $index ] = '';
}
}
$index ++;
}
for ( $i = $index; $i <= $multiply_count; $i ++ ) {
foreach ( $fields as $original_key ) {
$multiplied_fields[ $original_key . '_' . $i ] = '';
}
}
} elseif ( $group_by_item == 'as_independent_columns' ) {
foreach ( $fields as $original_key ) {
$label_data = $this->labels['order']->$original_key;
$key = $label_data['parent_key'] ? $label_data['parent_key'] : $original_key;
$index = 1;
foreach ( $field_values as $item ) {
if ( $multiply_count < $index ) {
break;
}
if ( isset( $item[ str_replace( 'plain_' . $type . '_', '', $key ) ] ) ) {
$multiplied_fields[ $original_key . '_' . $index ] = $item[ str_replace( 'plain_' . $type . '_',
'',
$key ) ];
} else {
$multiplied_fields[ $original_key . '_' . $index ] = '';
}
$index ++;
}
for ( $i = $index; $i <= $multiply_count; $i ++ ) {
$multiplied_fields[ $original_key . '_' . $i ] = '';
}
}
}
$row = array_merge( $row, $multiplied_fields );
}
/**
* @param $row
* @param $repeat_as_cols
*
* @return array
*/
protected function add_nested_rows_as_columns( $row, $repeat_as_cols ) {
$new_row = array();
foreach ( $repeat_as_cols as $type ) {
$nested_rows[ $type ] = self::get_array_from_array( $row, $type );
$field_group[ $type ] = array();
}
$mask = "#^plain_(products|coupons)_#";
$current_field_segment = "";
foreach ( $this->labels['order']->get_labels() as $label_data ) {
$original_key = $label_data['key'];
$key = $label_data['parent_key'] ? $label_data['parent_key'] : $original_key;
if ( ! isset( $row[ $key ] ) ) {
continue;
}
if ( ( $key == "products" || $key == "coupons" ) && in_array( $key, $repeat_as_cols ) ) {
continue;
} // skip main tags for nested sections
$previous_field_segment = $current_field_segment;
if ( preg_match( $mask, $key, $m ) AND in_array( $m[1], $repeat_as_cols ) ) {
$type = $m[1];
$field_group[ $type ][] = $original_key;
$current_field_segment = $type;
} else {
$current_field_segment = 'order';
}
if ( $previous_field_segment != $current_field_segment AND in_array( $previous_field_segment,
$repeat_as_cols ) ) {
$type = $previous_field_segment;
if ( $field_group[ $type ] ) {
$this->multiplicate_fields( $new_row, $type, $nested_rows[ $type ], $field_group[ $type ] );
$field_group[ $type ] = array();
}
}
//just copy as is
if ( $current_field_segment == 'order' ) {
$new_row[ $original_key ] = $row[ $key ];
}
}
//final clean up
foreach ( $repeat_as_cols as $type ) {
if ( ! empty( $field_group[ $type ] ) ) {
$this->multiplicate_fields( $new_row, $type, $nested_rows[ $type ], $field_group[ $type ] );
}
unset( $new_row[ $type ] );
}
return $new_row;
}
protected function try_multi_rows( $row ) {
$repeat_products = $this->duplicate_settings['products']['repeat'] == 'rows';
$repeat_coupons = $this->duplicate_settings['coupons']['repeat'] == 'rows';
$populate_non_products = isset( $this->duplicate_settings['products']['populate_other_columns'] ) && $this->duplicate_settings['products']['populate_other_columns'] == '1';
$item_rows_start_from_new_line = ( $this->format == 'csv' && $this->settings['global_job_settings']['format_csv_item_rows_start_from_new_line'] ||
$this->format == 'tsv' && $this->settings['global_job_settings']['format_tsv_item_rows_start_from_new_line'] );
$combinations = array();
$p_combinations = array();
if ( $repeat_products ) {
foreach ( self::get_array_from_array( $row, 'products' ) as $products_fields_item ) {
$result_tmp = array();
foreach ( $products_fields_item as $field_name => $products_field_value ) {
if ( isset( $this->labels['products']->$field_name ) ) // label must be assigned!
{
$result_tmp[ 'plain_products_' . $field_name ] = $products_field_value;
}
}
$p_combinations[] = $result_tmp;
}
}
$c_combinations = array();
if ( $repeat_coupons ) {
foreach ( self::get_array_from_array( $row, 'coupons' ) as $coupons_fields_item ) {
$result_tmp = array();
foreach ( $coupons_fields_item as $field_name => $coupons_field_value ) {
if ( isset( $this->labels['coupons']->$field_name ) ) // label must be assigned!
{
$result_tmp[ 'plain_coupons_' . $field_name ] = $coupons_field_value;
}
}
$c_combinations[] = $result_tmp;
}
}
if ( empty( $p_combinations ) ) {
$combinations = $c_combinations;
} elseif ( empty( $c_combinations ) ) {
$combinations = $p_combinations;
} else {
// $item_rows_start_from_new_line has higher priority
if ( $item_rows_start_from_new_line ) {
foreach ( $p_combinations as $p_combination ) {
$combinations[] = $p_combination;
}
foreach ( $c_combinations as $c_combination ) {
$combinations[] = $c_combination;
}
} else {
$max_len = max( count( $c_combinations ), count( $p_combinations ) );
for ( $i = 0; $i < $max_len; $i ++ ) {
// output product and coupon fields one to one if its exits
// row 1 -> product 1 - coupon 1 (+ order fields)
// row 2 -> product 2 - coupon 2
// row 3 -> product 3 - coupon 3
// and so on
$p_combination = isset( $p_combinations[ $i ] ) ? $p_combinations[ $i ] : array();
$c_combination = isset( $c_combinations[ $i ] ) ? $c_combinations[ $i ] : array();
$combinations[] = array_merge( $p_combination, $c_combination );
}
}
}
// add blank combination because we need only order fields in first row for this option
if ( $item_rows_start_from_new_line ) {
array_unshift( $combinations, array() );
}
if ( empty( $combinations ) ) {
return array( $row );
}
// exclude product and coupon fields from first row when item rows start from new line
// to prevent empty extra delimiters in output csv
if ( $item_rows_start_from_new_line ) {
foreach ( $this->labels['products']->to_Array() as $key => $label ) {
$key = 'plain_products_' . $key;
if ( isset( $row[ $key ] ) ) {
unset( $row[ $key ] );
}
}
foreach ( $this->labels['coupons']->to_Array() as $key => $label ) {
$key = 'plain_coupons_' . $key;
if ( isset( $row[ $key ] ) ) {
unset( $row[ $key ] );
}
}
}
$new_rows = array();
foreach ( $combinations as $num_index => $combination ) {
if ( $item_rows_start_from_new_line ) {
$new_row = ( $num_index == 0 ) ? $row : array();
} elseif ( $num_index == 0 OR $populate_non_products ) {
$new_row = $row; // 1st -- as is
} else { //must adjust positions for 2nd , 3rd,... rows
foreach ( $row as $k => $v ) {
$new_row[ $k ] = "";
}
}
foreach ( $combination as $field_name => $field_value ) {
$new_row[ $field_name ] = $field_value;
foreach ( $this->labels['order']->get_childs( $field_name ) as $label_order_data_1 ) {
$new_row[ $label_order_data_1['key'] ] = $field_value;
}
}
$new_rows[] = $new_row;
}
return $new_rows;
}
private function merge_nested_rows_to_one_record( $row, $type ) {
$line_delimiter = $this->convert_literals( $this->duplicate_settings[ $type ]['line_delimiter'] );
$merged_values = array();
foreach ( $row[ $type ] as $line ) {
foreach ( $line as $k => $v ) {
$plain_key = "plain_{$type}_{$k}";
if ( ! isset( $row[ $plain_key ] ) ) // skip child columns if no matched field in order
continue;
if ( ! isset( $merged_values[ $plain_key ] ) ) {
$merged_values[ $plain_key ] = true;
$row[ $plain_key ] = $v;
} else {
$row[ $plain_key ] .= $line_delimiter . $v;
}
}
}
unset( $row[ $type ] );
return $row;
}
}