<?php /** * CSV reading section of the plugin * * @link * * @package Wt_Import_Export_For_Woo */ if (!defined('ABSPATH')) { exit; } if(!class_exists('Wt_Import_Export_For_Woo_Basic_Csvreader')){ class Wt_Import_Export_For_Woo_Basic_Csvreader { public $delimiter=','; public $fgetcsv_esc_check=0; public function __construct($delimiter=',') { $this->delimiter=$delimiter; $this->delimiter=($this->delimiter=='tab' ? "\t" : $this->delimiter); /* version 5.3.0 onwards 5th escaping argument introduced in `fgetcsv` function */ $this->fgetcsv_esc_check = (version_compare(PHP_VERSION, '5.3.0') >= 0); } /** * Taking sample data for mapping screen preparation * This function skip empty rows and take first two non empty rows */ public function get_sample_data($file, $grouping=false) { $use_mb = function_exists('mb_detect_encoding'); // Set locale $enc = ($use_mb) ? mb_detect_encoding( $file, 'UTF-8, ISO-8859-1', true ) : false; if($enc) { setlocale(LC_ALL, 'en_US.'.$enc); } @ini_set('auto_detect_line_endings', true); $sample_data_key=array(); $sample_data_val=array(); $sample_data=array(); if(($handle=@fopen($file, "r"))!== false) { $row_count=0; while(($row=($this->fgetcsv_esc_check) ? fgetcsv($handle, 0, $this->delimiter, '"', '"') : fgetcsv($handle, 0, $this->delimiter, '"') )!==false) { if(count(array_filter($row))==0) { continue; }else { $row_count++; } if($row_count==1) //taking heading row { $sample_data_key=$row; }else //taking data row { $sample_data_val=$row; break; //only single data row needed } } foreach($sample_data_key as $k => $key) { $key = trim($key); if(!$key) { continue; } $val=(isset($sample_data_val[$k]) ? $this->format_data_from_csv($sample_data_val[$k], $enc) : ''); /* removing BOM like non characters */ $wt_remove_bom = apply_filters('wt_import_csv_parser_keep_bom', true); if ($wt_remove_bom) { $key = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $key); } else { $key = wt_removeBomUtf8_basic($key); } if($grouping) { if(strrpos($key, ':')!==false) { $key_arr=explode(":", $key); if(count($key_arr)>1) { $meta_key=$key_arr[0]; if(!isset($sample_data[$meta_key]) || !is_array($sample_data[$meta_key])) { $sample_data[$meta_key]=array(); } $sample_data[$meta_key][$key]=$val; }else { $sample_data[$key]=$val; } }else { $sample_data[$key]=$val; } }else { $sample_data[$key]=$val; } } fclose($handle); } return $sample_data; } /** * Get data from CSV as batch */ public function get_data_as_batch($file, $offset, $batch_count, $module_obj, $form_data) { $use_mb = function_exists('mb_detect_encoding'); // Set locale $enc = ($use_mb) ? mb_detect_encoding( $file, 'UTF-8, ISO-8859-1', true ) : false; if($enc) { setlocale( LC_ALL, 'en_US.' . $enc ); } @ini_set('auto_detect_line_endings', true); $out=array( 'response'=>false, 'offset'=>$offset, 'data_arr'=>array(), ); if(($handle=@fopen($file, "r"))!== false) { /** * taking head */ $head_arr=array(); while(($row=($this->fgetcsv_esc_check) ? fgetcsv($handle, 0, $this->delimiter, '"', '"') : fgetcsv($handle, 0, $this->delimiter, '"') )!==false) { if(count(array_filter($row))!=0) /* first non empty array */ { $head_arr=$row; if($offset==0) /* on first batch */ { $offset_after_head=ftell($handle); fseek($handle, $offset_after_head); /* skipping head row */ } break; } } $empty_head_columns=array(); foreach($head_arr as $head_key=>$head_val) { if(trim($head_val)=='') { $empty_head_columns[]=$head_key; unset($head_arr[$head_key]); }else { /* removing BOM like non characters */ $wt_remove_bom = apply_filters('wt_import_csv_parser_keep_bom', true); if ($wt_remove_bom) { $head_arr[$head_key]=preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $head_val); } else { $head_arr[$head_key]= wt_removeBomUtf8_basic($head_val); } } } /* moving the pointer to corresponding batch. If not first batch */ if($offset!=0) { fseek($handle, $offset); } $out_arr=array(); $row_count=0; /* taking data */ while(($row=($this->fgetcsv_esc_check) ? fgetcsv($handle, 0, $this->delimiter, '"', '"') : fgetcsv($handle, 0, $this->delimiter, '"') )!==false) { $offset=ftell($handle); /* next offset */ /* * Skipping empty rows */ if(count(array_filter($row))==0) { continue; } /* * Remove values of empty head */ foreach($empty_head_columns as $key) { unset($row[$key]); } /* * Creating associative array with heading and data */ $row_column_count=count($row); $head_column_count=count($head_arr); if($row_column_count<$head_column_count) { $empty_row=array_fill($row_column_count, ($head_column_count-$row_column_count), ''); $row=array_merge($row, $empty_row); $empty_row=null; unset($empty_row); } elseif($row_column_count>$head_column_count) { $row = array_slice($row, 0, $head_column_count); //IER-209 //continue; } /* clearing temp variables */ $row_column_count=$head_column_count=null; unset($row_column_count, $head_column_count); $head_arr = array_map('trim', $head_arr); /* preparing associative array */ $data_row=array_combine($head_arr, $row); $out_arr[]=$module_obj->process_column_val($data_row, $form_data); //$out_arr[]=$data_row; unset($data_row); $row_count++; if($row_count==$batch_count) { break; } } fclose($handle); $out=array( 'response'=>true, 'offset'=>$offset, 'rows_processed'=>$row_count, 'data_arr'=>$out_arr, ); $head_arr=$form_data=$row=$out_arr=null; unset($head_arr, $form_data, $row, $out_arr); } return $out; } protected function format_data_from_csv($data, $enc) { //return sanitize_text_field(( $enc == 'UTF-8' ) ? trim($data) : utf8_encode(trim($data))); sanitize_text_field stripping html content return (( $enc == 'UTF-8' ) ? trim($data) : utf8_encode(trim($data))); } } }