options = &EL_Options::get_instance(); $this->functions = &EL_Admin_Functions::get_instance(); $this->db = &EL_Db::get_instance(); $this->categories = &EL_Categories::get_instance(); $this->example_file_path = EL_URL.'/files/events-import-example.csv'; } public function show_import() { if(!current_user_can('edit_posts')) { wp_die(__('You do not have sufficient permissions to access this page.')); } echo '

'.__('Import Events','event-list').'

'; // Review import if(isset($_FILES['el_import_file'])) { $this->show_import_review(); } // Finish import (add events) elseif(isset($_POST['reviewed_events'])) { $import_error = $this->import_events(); $this->show_import_finished($import_error); } // Import form else { $this->show_import_form(); } echo '
'; } private function show_import_form() { echo '

'.__('Step','event-list').' 1: '.__('Set import file and options','event-list').'

'.$this->functions->show_option_table('import').'


'.__('Example file','event-list').'

'.sprintf(__('You can download an example file %1$shere%2$s (CSV delimiter is a comma!)','event-list'), '', '').'

'.__('Note','event-list').': '.__('Do not change the column header and separator line (first two lines), otherwise the import will fail!','event-list').'

'; } private function show_import_review() { $file = $_FILES['el_import_file']['tmp_name']; // check for file existence (upload failed?) if(!is_file($file)) { echo '

'.__('Sorry, there has been an error.','event-list').'

'; echo __('The file does not exist, please try again.','event-list').'

'; return; } // check for file extension (csv) first $file_parts = pathinfo($_FILES['el_import_file']['name']); if($file_parts['extension'] !== "csv") { echo '

'.__('Sorry, there has been an error.','event-list').'

'; echo __('The file is not a CSV file.','event-list').'

'; return; } // safe settings $this->safe_import_settings(); // parse file $import_data = $this->parseImportFile($file); // parsing failed? if(is_wp_error($import_data)) { echo '

'.__('Sorry, there has been an error.','event-list').'

'; echo '

' . esc_html($import_data->get_error_message()).'

'; return; } // TODO: $this->import_data vs. $import_data ? $this->import_data = $import_data; $serialized = serialize($this->import_data); // show review page echo '

'.__('Step','event-list').' 2: '.__('Event review and category selection','event-list').'

'; wp_nonce_field('autosavenonce', 'autosavenonce', false, false); wp_nonce_field('closedpostboxesnonce', 'closedpostboxesnonce', false, false); wp_nonce_field('meta-box-order-nonce', 'meta-box-order-nonce', false, false); echo '
'; foreach($this->import_data as $event) { $this->show_event($event); } echo '
'; add_meta_box('event-categories', __('Categories'), array(&$this, 'render_category_metabox'),'event-list', 'advanced', 'default', null); add_meta_box('event-publish', __('Import','event-list'), array(&$this, 'render_publish_metabox'), 'event-list'); do_meta_boxes('event-list', 'advanced', null); echo '
'; } private function show_import_finished($with_error) { if(!$with_error) { echo '

'.__('Import with errors!','event-list').'

'.sprintf(__('An error occurred during import! Please send your import file to %1$sthe administrator%2$s for analysis.','event-list'), '', ''); } else { echo '

'.__('Import successful!','event-list').'

'.__('Go back to All Events','event-list').''; } } private function show_event($event) { echo '

'.__('Title','event-list').': '.$event['title'].'
'.__('Start Date','event-list').': '.$event['start_date'].'
'.__('End Date','event-list').': '.$event['end_date'].'
'.__('Time','event-list').': '.$event['time'].'
'.__('Location','event-list').': '.$event['location'].'
'.__('Details','event-list').': '.$event['details'].'

'; } /** * @return WP_Error */ private function parseImportFile($file) { $delimiter = ','; $header = array('title', 'start date', 'end date', 'time', 'location', 'details'); $separator = array('sep=,'); // list of events to import $events = array(); $file_handle = fopen($file, 'r'); $lineNum = 0; while(!feof($file_handle)) { $line = fgetcsv($file_handle, 1024); // skip empty line if(empty($line)) { continue; } if($lineNum === 0) { if($line === $separator) { continue; } if($line === $header) { $lineNum += 1; continue; } else { var_dump($line); var_dump($header); return new WP_Error('CSV_parse_error', __('There was an error when reading this CSV file.','event-list')); } } $events[] = array( 'title' => $line[0], 'start_date' => $line[1], 'end_date' => !empty($line[2]) ? $line[2] : $line[1], 'time' => $line[3], 'location' => $line[4], 'details' => $line[5], ); $lineNum += 1; } //close file fclose($file_handle); return $events; } private function safe_import_settings() { foreach($this->options->options as $oname => $o) { if('import' == $o['section'] && isset($_POST[$oname])) { $this->options->set($oname, $_POST[$oname]); } } } public function render_publish_metabox() { echo '
'.__('Cancel').'
'; } public function render_category_metabox($post, $metabox) { echo '
'; $cat_array = $this->categories->get_cat_array('name', 'asc'); if(empty($cat_array)) { echo __('No categories available.'); } else { echo ' '; } echo '
'; } private function import_events() { $reviewed_events = unserialize(stripslashes($_POST['reviewed_events'])); $categories = isset($_POST['categories']) ? $_POST['categories'] : ''; if(isset($categories)) { foreach($reviewed_events as &$event) { $event['categories'] = $categories; } } $ret = array(); foreach($reviewed_events as &$event) { // check if dates have correct formats $start_date = DateTime::createFromFormat($this->options->get('el_import_date_format'), $event['start_date']); $end_date = DateTime::createFromFormat($this->options->get('el_import_date_format'), $event['end_date']); if($start_date) { $event['start_date'] = $start_date->format('Y-m-d'); if($end_date) { $event['end_date'] = $end_date->format('Y-m-d'); } else { $event['end_date'] = ''; } $ret[] = $this->db->update_event($event); } else { return false; } } // TODO: Improve error messages return $ret; } } ?>